DEV: Allow focusComposer to reply to existing topic (#15896)

Another use case for focusComposer() is if the user is
already inside a topic but another component (such as the
floating chat window) needs to open the composer. This
commit also fixes the appendText option to only prepend
2 new lines if there is text before the text to be appended.

Follow up 7850ee318f
This commit is contained in:
Martin Brennan 2022-02-11 10:16:06 +10:00 committed by GitHub
parent a4ff69bd99
commit e814f77eaa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 12 deletions

View File

@ -402,19 +402,46 @@ export default Controller.extend({
// //
// opts: // opts:
// //
// - fallbackToNewTopic: if true, and there is no draft, the composer will // - topic: if this is present, the composer will be opened with the reply
// be opened with the create_topic action and a new topic draft key // action and the current topic key and draft sequence
// - fallbackToNewTopic: if true, and there is no draft and no topic,
// the composer will be opened with the create_topic action and a new
// topic draft key
// - insertText: the text to append to the composer once it is opened // - insertText: the text to append to the composer once it is opened
// - openOpts: this object will be passed to this.open if fallbackToNewTopic is // - openOpts: this object will be passed to this.open if fallbackToNewTopic is
// true // true or topic is provided
@action @action
focusComposer(opts = {}) { focusComposer(opts = {}) {
if (this.get("model.viewOpen")) { this._openComposerForFocus(opts).then(() => {
this._focusAndInsertText(opts.insertText); this._focusAndInsertText(opts.insertText);
});
},
_openComposerForFocus(opts) {
if (this.get("model.viewOpen")) {
return Promise.resolve();
} else { } else {
const opened = this.openIfDraft(); const opened = this.openIfDraft();
if (!opened && opts.fallbackToNewTopic) { if (opened) {
this.open( return Promise.resolve();
}
if (opts.topic) {
return this.open(
Object.assign(
{
action: Composer.REPLY,
draftKey: opts.topic.get("draft_key"),
draftSequence: opts.topic.get("draft_sequence"),
topic: opts.topic,
},
opts.openOpts || {}
)
);
}
if (opts.fallbackToNewTopic) {
return this.open(
Object.assign( Object.assign(
{ {
action: Composer.CREATE_TOPIC, action: Composer.CREATE_TOPIC,
@ -422,11 +449,7 @@ export default Controller.extend({
}, },
opts.openOpts || {} opts.openOpts || {}
) )
).then(() => { );
this._focusAndInsertText(opts.insertText);
});
} else if (opened) {
this._focusAndInsertText(opts.insertText);
} }
} }
}, },

View File

@ -661,7 +661,11 @@ const Composer = RestModel.extend({
} }
if (opts && opts.new_line) { if (opts && opts.new_line) {
if (before.length > 0) {
text = "\n\n" + text.trim(); text = "\n\n" + text.trim();
} else {
text = text.trim();
}
} }
this.set("reply", before + text + after); this.set("reply", before + text + after);