DEV: Async a bit more of Composer (#18013)

This commit is contained in:
Jarek Radosz 2022-08-21 12:11:10 +02:00 committed by GitHub
parent ff0f43014c
commit 9130565895
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 36 additions and 46 deletions

View File

@ -650,8 +650,6 @@ export default Controller.extend({
} else { } else {
await this.cancelComposer(); await this.cancelComposer();
} }
return false;
}, },
fullscreenComposer() { fullscreenComposer() {
@ -1054,7 +1052,7 @@ export default Controller.extend({
@param {Boolean} [opts.skipDraftCheck] @param {Boolean} [opts.skipDraftCheck]
@param {Boolean} [opts.skipJumpOnSave] Option to skip navigating to the post when saved in this composer session @param {Boolean} [opts.skipJumpOnSave] Option to skip navigating to the post when saved in this composer session
**/ **/
open(opts = {}) { async open(opts = {}) {
if (!opts.draftKey) { if (!opts.draftKey) {
throw new Error("composer opened without a proper draft key"); throw new Error("composer opened without a proper draft key");
} }
@ -1107,15 +1105,15 @@ export default Controller.extend({
composerModel = null; composerModel = null;
} }
let promise = new Promise((resolve, reject) => { try {
if (composerModel && composerModel.replyDirty) { if (composerModel?.replyDirty) {
// If we're already open, we don't have to do anything // If we're already open, we don't have to do anything
if ( if (
composerModel.composeState === Composer.OPEN && composerModel.composeState === Composer.OPEN &&
composerModel.draftKey === opts.draftKey && composerModel.draftKey === opts.draftKey &&
!opts.action !opts.action
) { ) {
return resolve(); return;
} }
// If it's the same draft, just open it up again. // If it's the same draft, just open it up again.
@ -1125,13 +1123,13 @@ export default Controller.extend({
) { ) {
composerModel.set("composeState", Composer.OPEN); composerModel.set("composeState", Composer.OPEN);
if (!opts.action) { if (!opts.action) {
return resolve(); return;
} }
} }
return this.cancelComposer() await this.cancelComposer();
.then(() => this.open(opts)) await this.open(opts);
.then(resolve, reject); return;
} }
if (composerModel && composerModel.action !== opts.action) { if (composerModel && composerModel.action !== opts.action) {
@ -1140,45 +1138,37 @@ export default Controller.extend({
// we need a draft sequence for the composer to work // we need a draft sequence for the composer to work
if (opts.draftSequence === undefined) { if (opts.draftSequence === undefined) {
return Draft.get(opts.draftKey) let data = await Draft.get(opts.draftKey);
.then((data) => {
if (opts.skipDraftCheck) { if (opts.skipDraftCheck) {
data.draft = undefined; data.draft = undefined;
return data; } else {
} data = await this.confirmDraftAbandon(data);
return this.confirmDraftAbandon(data); }
})
.then((data) => { opts.draft ||= data.draft;
if (!opts.draft && data.draft) { opts.draftSequence = data.draft_sequence;
opts.draft = data.draft;
} await this._setModel(composerModel, opts);
opts.draftSequence = data.draft_sequence; return;
return this._setModel(composerModel, opts);
})
.then(resolve, reject);
} }
// otherwise, do the draft check async // otherwise, do the draft check async
else if (!opts.draft && !opts.skipDraftCheck) { if (!opts.draft && !opts.skipDraftCheck) {
Draft.get(opts.draftKey) let data = await Draft.get(opts.draftKey);
.then((data) => { data = await this.confirmDraftAbandon(data);
return this.confirmDraftAbandon(data);
}) if (data.draft) {
.then((data) => { opts.draft = data.draft;
if (data.draft) { opts.draftSequence = data.draft_sequence;
opts.draft = data.draft; await this.open(opts);
opts.draftSequence = data.draft_sequence; }
return this.open(opts);
}
});
} }
return this._setModel(composerModel, opts).then(resolve, reject); await this._setModel(composerModel, opts);
}); } finally {
promise = promise.finally(() => {
this.skipAutoSave = false; this.skipAutoSave = false;
}); }
return promise;
}, },
// Given a potential instance and options, set the model for this composer. // Given a potential instance and options, set the model for this composer.
@ -1326,7 +1316,7 @@ export default Controller.extend({
cancel(this._saveDraftDebounce); cancel(this._saveDraftDebounce);
} }
return new Promise((resolve, reject) => { return new Promise((resolve) => {
if (this.get("model.hasMetaData") || this.get("model.replyDirty")) { if (this.get("model.hasMetaData") || this.get("model.replyDirty")) {
const modal = showModal("discard-draft", { const modal = showModal("discard-draft", {
model: this.model, model: this.model,
@ -1352,7 +1342,7 @@ export default Controller.extend({
return resolve(); return resolve();
}, },
// needed to resume saving drafts if composer stays open // needed to resume saving drafts if composer stays open
onDismissModal: () => reject(), onDismissModal: () => resolve(),
}); });
} else { } else {
// it is possible there is some sort of crazy draft with no body ... just give up on it // it is possible there is some sort of crazy draft with no body ... just give up on it