diff --git a/src/components/Composer.vue b/src/components/Composer.vue index e8c217aeb1..9035972e43 100644 --- a/src/components/Composer.vue +++ b/src/components/Composer.vue @@ -705,6 +705,11 @@ export default { required: true, }, + isDraft: { + type: Boolean, + default: false, + }, + requestMdn: { type: Boolean, default: false, @@ -1329,7 +1334,12 @@ export default { onEditorReady(editor) { this.bodyVal = editor.getData() - this.insertSignature() + + // Only append signature on opening drafts if alias changed. + // Otherwise leads to unwanted or even duplicate signatures. + if (!this.isDraft || this.changeSignature) { + this.insertSignature() + } if (this.smartReply) { this.bus.emit('append-to-body-at-cursor', this.smartReply) } diff --git a/src/components/NewMessageModal.vue b/src/components/NewMessageModal.vue index 406d2df9b3..70bf666100 100644 --- a/src/components/NewMessageModal.vue +++ b/src/components/NewMessageModal.vue @@ -90,6 +90,7 @@ :smime-sign="composerData.smimeSign" :smime-encrypt="composerData.smimeEncrypt" :is-first-open="modalFirstOpen" + :is-draft="composerData.draftId !== undefined" :request-mdn="composerData.requestMdn" :accounts="accounts" @update:from-account="patchComposerData({ accountId: $event })" diff --git a/src/tests/unit/components/Composer.vue.spec.js b/src/tests/unit/components/Composer.vue.spec.js index f6e7f8b32a..936abfd624 100644 --- a/src/tests/unit/components/Composer.vue.spec.js +++ b/src/tests/unit/components/Composer.vue.spec.js @@ -432,4 +432,86 @@ describe('Composer', () => { search: 'alice', })).toEqual(true) }) + + it('inserts the signature when composing a new message', () => { + const view = shallowMount(Composer, { + propsData: { + isFirstOpen: true, + isDraft: false, + accounts: [ + { + id: 123, + editorMode: 'plaintext', + isUnified: false, + aliases: [], + }, + ], + }, + mocks: { + $route, + }, + store, + localVue, + }) + const insertSignature = vi.spyOn(view.vm, 'insertSignature').mockImplementation(() => {}) + + view.vm.onEditorReady({ getData: () => '' }) + + expect(insertSignature).toHaveBeenCalled() + }) + + it('does not insert the signature when opening a draft', () => { + const view = shallowMount(Composer, { + propsData: { + isFirstOpen: true, + isDraft: true, + accounts: [ + { + id: 123, + editorMode: 'plaintext', + isUnified: false, + aliases: [], + }, + ], + }, + mocks: { + $route, + }, + store, + localVue, + }) + const insertSignature = vi.spyOn(view.vm, 'insertSignature').mockImplementation(() => {}) + + view.vm.onEditorReady({ getData: () => '' }) + + expect(insertSignature).not.toHaveBeenCalled() + }) + + it('inserts the signature on alias change even when opening a draft', () => { + const view = shallowMount(Composer, { + propsData: { + isFirstOpen: true, + isDraft: true, + accounts: [ + { + id: 123, + editorMode: 'plaintext', + isUnified: false, + aliases: [], + }, + ], + }, + mocks: { + $route, + }, + store, + localVue, + }) + const insertSignature = vi.spyOn(view.vm, 'insertSignature').mockImplementation(() => {}) + view.vm.changeSignature = true + + view.vm.onEditorReady({ getData: () => '' }) + + expect(insertSignature).toHaveBeenCalled() + }) })