From 579d4ad71b4036d068dec6e9929e345ec92b2f01 Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Wed, 24 Feb 2016 00:19:17 -0800 Subject: [PATCH] fix(signature): Update signature when account is changed in composer Summary: - Fixes #1239 - Adds action in composer view to indicate when draft partcipants have changed. This seemed like the simplest way to listen for this change without adding another extension point - Updates signature plugin to listen to this action and update signature accordingly - Adds test Test Plan: - Unit tests Reviewers: evan, bengotow Reviewed By: bengotow Differential Revision: https://phab.nylas.com/D2614 --- .../composer-signature/lib/main.coffee | 9 +++-- .../lib/signature-composer-extension.coffee | 10 ++---- .../lib/signature-store.es6 | 33 +++++++++++++++++++ .../lib/signature-utils.es6 | 29 ++++++++++++++++ .../signature-composer-extension-spec.coffee | 18 ++++++++++ .../composer/lib/composer-view.cjsx | 1 + src/flux/actions.coffee | 2 ++ 7 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 internal_packages/composer-signature/lib/signature-store.es6 create mode 100644 internal_packages/composer-signature/lib/signature-utils.es6 diff --git a/internal_packages/composer-signature/lib/main.coffee b/internal_packages/composer-signature/lib/main.coffee index 7e199d920..4be81bdaa 100644 --- a/internal_packages/composer-signature/lib/main.coffee +++ b/internal_packages/composer-signature/lib/main.coffee @@ -1,8 +1,9 @@ {PreferencesUIStore, ExtensionRegistry} = require 'nylas-exports' SignatureComposerExtension = require './signature-composer-extension' +SignatureStore = require './signature-store' module.exports = - activate: (@state={}) -> + activate: -> @preferencesTab = new PreferencesUIStore.TabItem tabId: "Signatures" displayName: "Signatures" @@ -11,8 +12,12 @@ module.exports = ExtensionRegistry.Composer.register(SignatureComposerExtension) PreferencesUIStore.registerPreferencesTab(@preferencesTab) + @signatureStore = new SignatureStore() + @signatureStore.activate() + deactivate: -> ExtensionRegistry.Composer.unregister(SignatureComposerExtension) PreferencesUIStore.unregisterPreferencesTab(@preferencesTab.sectionId) + @signatureStore.deactivate() - serialize: -> @state + serialize: -> diff --git a/internal_packages/composer-signature/lib/signature-composer-extension.coffee b/internal_packages/composer-signature/lib/signature-composer-extension.coffee index 8ce67ef93..818d95eb9 100644 --- a/internal_packages/composer-signature/lib/signature-composer-extension.coffee +++ b/internal_packages/composer-signature/lib/signature-composer-extension.coffee @@ -1,4 +1,5 @@ {ComposerExtension, AccountStore} = require 'nylas-exports' +SignatureUtils = require './signature-utils' class SignatureComposerExtension extends ComposerExtension @prepareNewDraft: ({draft}) -> @@ -6,13 +7,6 @@ class SignatureComposerExtension extends ComposerExtension signature = NylasEnv.config.get("nylas.account-#{accountId}.signature") return unless signature - insertionPoint = draft.body.indexOf('' - - if insertionPoint is -1 - insertionPoint = draft.body.length - signatureHTML = '

' + signatureHTML - - draft.body = draft.body.slice(0, insertionPoint) + signatureHTML + draft.body.slice(insertionPoint) + draft.body = SignatureUtils.applySignature(draft.body, signature) module.exports = SignatureComposerExtension diff --git a/internal_packages/composer-signature/lib/signature-store.es6 b/internal_packages/composer-signature/lib/signature-store.es6 new file mode 100644 index 000000000..8e55cff00 --- /dev/null +++ b/internal_packages/composer-signature/lib/signature-store.es6 @@ -0,0 +1,33 @@ +import {DraftStore, AccountStore, Actions} from 'nylas-exports'; +import SignatureUtils from './signature-utils'; + + +class SignatureStore { + + constructor() { + this.unsubscribe = ()=> {}; + } + + activate() { + this.unsubscribe = Actions.draftParticipantsChanged.listen(this.onParticipantsChanged); + } + + onParticipantsChanged(draftClientId, changes) { + if (!changes.from) { return; } + DraftStore.sessionForClientId(draftClientId).then((session)=> { + const draft = session.draft() + const {accountId} = AccountStore.accountForEmail(changes.from[0].email); + const signature = NylasEnv.config.get(`nylas.account-${accountId}.signature`) || ""; + + const body = SignatureUtils.applySignature(draft.body, signature); + session.changes.add({body}) + }); + } + + deactivate() { + this.unsubscribe() + } + +} + +export default SignatureStore; diff --git a/internal_packages/composer-signature/lib/signature-utils.es6 b/internal_packages/composer-signature/lib/signature-utils.es6 new file mode 100644 index 000000000..2c0d7ef67 --- /dev/null +++ b/internal_packages/composer-signature/lib/signature-utils.es6 @@ -0,0 +1,29 @@ + +const SignatureUtils = { + + applySignature(body, signature) { + const signatureRegex = /
.*<\/div>/; + + let signatureHTML = '
' + signature + '
'; + let insertionPoint = body.search(signatureRegex) + let newBody = body; + + // If there is a signature already present + if (insertionPoint !== -1) { + // Remove it + newBody = newBody.replace(signatureRegex, "") + } else { + insertionPoint = newBody.indexOf(' SignatureComposerExtension.prepareNewDraft(draft: b) expect(b.body).toEqual('This is a another test.

This is my signature.
') + it "should replace the signature if a signature is already present", -> + a = new Message + draft: true + body: 'This is a test!
SIG
Hello world
' + b = new Message + draft: true + body: 'This is a test!
SIG
' + c = new Message + draft: true + body: 'This is a test!
' + + SignatureComposerExtension.prepareNewDraft(draft: a) + expect(a.body).toEqual("This is a test!
#{@signature}
Hello world
") + SignatureComposerExtension.prepareNewDraft(draft: b) + expect(b.body).toEqual("This is a test!
#{@signature}
") + SignatureComposerExtension.prepareNewDraft(draft: c) + expect(c.body).toEqual("This is a test!
#{@signature}
") + describe "when a signature is not defined", -> beforeEach -> spyOn(NylasEnv.config, 'get').andCallFake -> diff --git a/internal_packages/composer/lib/composer-view.cjsx b/internal_packages/composer/lib/composer-view.cjsx index b8c3800d6..bffd42f19 100644 --- a/internal_packages/composer/lib/composer-view.cjsx +++ b/internal_packages/composer/lib/composer-view.cjsx @@ -619,6 +619,7 @@ class ComposerView extends React.Component _onChangeParticipants: (changes={}) => @_addToProxy(changes) + Actions.draftParticipantsChanged(@props.draftClientId, changes) _onChangeSubject: (event) => @_addToProxy(subject: event.target.value) diff --git a/src/flux/actions.coffee b/src/flux/actions.coffee index 646509401..a07d7084e 100644 --- a/src/flux/actions.coffee +++ b/src/flux/actions.coffee @@ -524,6 +524,8 @@ class Actions ### @setMetadata: ActionScopeWindow + @draftParticipantsChanged: ActionScopeWindow + # Read the actions we declared on the dummy Actions object above # and translate them into Reflux Actions