diff --git a/client/src/builtin/BuiltinModule.js b/client/src/builtin/BuiltinModule.js index 330f685a..59437f70 100644 --- a/client/src/builtin/BuiltinModule.js +++ b/client/src/builtin/BuiltinModule.js @@ -75,12 +75,14 @@ export default class BuiltinModule { */ patch(module, fnName, cb, when = 'after') { if (!['before', 'after', 'instead'].includes(when)) when = 'after'; - Patch(`BD:${this.moduleName}`, module)[when](fnName, cb.bind(this)); + return Patch(`BD:${this.moduleName}`, module)[when](fnName, cb.bind(this)); } childPatch(module, fnName, child, cb, when = 'after') { + const last = child.pop(); + this.patch(module, fnName, (component, args, retVal) => { - this.patch(retVal[child[0]], child[1], cb, when); + const unpatch = this.patch(child.reduce((obj, key) => obj[key], retVal), last, function() {unpatch(); return cb.apply(this, arguments);}, when); }); } diff --git a/client/src/builtin/EmoteModule.js b/client/src/builtin/EmoteModule.js index d36174c4..6afb718e 100644 --- a/client/src/builtin/EmoteModule.js +++ b/client/src/builtin/EmoteModule.js @@ -220,6 +220,7 @@ export default new class EmoteModule extends BuiltinModule { async applyPatches() { this.patchMessageContent(); this.patchSendAndEdit(); + this.patchSpoiler(); const MessageAccessories = await ReactComponents.getComponent('MessageAccessories'); this.patch(MessageAccessories.component.prototype, 'render', this.afterRenderMessageAccessories, 'after'); @@ -244,6 +245,22 @@ export default new class EmoteModule extends BuiltinModule { this.patch(MessageActions, 'editMessage', this.handleEditMessage, 'instead'); } + async patchSpoiler() { + const Spoiler = await ReactComponents.getComponent('Spoiler'); + this.childPatch(Spoiler.component.prototype, 'render', ['props', 'children', 'props', 'children'], this.afterRenderSpoiler); + Spoiler.forceUpdateAll(); + } + + afterRenderSpoiler(component, args, retVal) { + const markup = Utils.findInReactTree(retVal, filter => + filter && + filter.className && + filter.className.includes('inlineContent')); + if (!markup) return; + + markup.children = this.processMarkup(markup.children); + } + /** * Handle message render */ diff --git a/client/src/modules/reactcomponents.js b/client/src/modules/reactcomponents.js index 5d4d393a..d642ae0d 100644 --- a/client/src/modules/reactcomponents.js +++ b/client/src/modules/reactcomponents.js @@ -378,6 +378,11 @@ export class ReactAutoPatcher { this.MessageContent = await ReactComponents.getComponent('MessageContent', {selector}, c => c.defaultProps && c.defaultProps.hasOwnProperty('disableButtons')); } + static async patchSpoiler() { + const { selector } = Reflection.resolve('spoilerText', 'spoilerContainer'); + this.Spoiler = await ReactComponents.getComponent('Spoiler', {selector}, c => c.prototype.renderSpoilerText); + } + static async patchMessageAccessories() { const { selector } = Reflection.resolve('container', 'containerCozy', 'embedWrapper'); this.MessageAccessories = await ReactComponents.getComponent('MessageAccessories', {selector});