From 1674e7a313a68da81cb6d26b16b6978b441aff28 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 4 Sep 2020 18:19:27 +0200 Subject: [PATCH] Fix extension to work with Composer state changes Refs flarum/core#2162. --- .../mentions/js/src/forum/utils/reply.js | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/extensions/mentions/js/src/forum/utils/reply.js b/extensions/mentions/js/src/forum/utils/reply.js index 97e54dc21..705159728 100644 --- a/extensions/mentions/js/src/forum/utils/reply.js +++ b/extensions/mentions/js/src/forum/utils/reply.js @@ -1,21 +1,22 @@ import DiscussionControls from 'flarum/utils/DiscussionControls'; +import EditPostComposer from 'flarum/components/EditPostComposer'; -function insertMention(post, component, quote) { +function insertMention(post, composer, quote) { const user = post.user(); const mention = '@' + (user ? user.username() : post.number()) + '#' + post.id() + ' '; // If the composer is empty, then assume we're starting a new reply. // In which case we don't want the user to have to confirm if they // close the composer straight away. - if (!component.content()) { - component.props.originalContent = mention; + if (!composer.fields.content()) { + composer.body.attrs.originalContent = mention; } - const cursorPosition = component.editor.getSelectionRange()[0]; - const preceding = component.editor.value().slice(0, cursorPosition); + const cursorPosition = composer.editor.getSelectionRange()[0]; + const preceding = composer.fields.content().slice(0, cursorPosition); const precedingNewlines = preceding.length == 0 ? 0 : 3 - preceding.match(/(\n{0,2})$/)[0].length; - component.editor.insertAtCursor( + composer.editor.insertAtCursor( Array(precedingNewlines).join('\n') + // Insert up to two newlines, depending on preceding whitespace (quote ? '> ' + mention + quote.trim().replace(/\n/g, '\n> ') + '\n\n' @@ -24,11 +25,15 @@ function insertMention(post, component, quote) { } export default function reply(post, quote) { - const component = app.composer.component; - if (component && component.props.post && component.props.post.discussion() === post.discussion()) { - insertMention(post, component, quote); + if (app.composer.bodyMatches(EditPostComposer) && app.composer.body.attrs.post.discussion() === post.discussion()) { + // If we're already editing a post in the discussion of post we're quoting, + // insert the mention directly. + insertMention(post, app.composer, quote); } else { + // The default "Reply" action behavior will only open a new composer if + // necessary, but it will always be a ReplyComposer, hence the exceptional + // case above. DiscussionControls.replyAction.call(post.discussion()) - .then(newComponent => insertMention(post, newComponent, quote)); + .then(composer => insertMention(post, composer, quote)); } }