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
This commit is contained in:
Juan Tejada 2016-02-24 00:19:17 -08:00
parent 34dc2e331f
commit 579d4ad71b
7 changed files with 92 additions and 10 deletions

View file

@ -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: ->

View file

@ -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('<blockquote')
signatureHTML = '<div class="nylas-n1-signature">' + signature + '</div>'
if insertionPoint is -1
insertionPoint = draft.body.length
signatureHTML = '<br/><br/>' + signatureHTML
draft.body = draft.body.slice(0, insertionPoint) + signatureHTML + draft.body.slice(insertionPoint)
draft.body = SignatureUtils.applySignature(draft.body, signature)
module.exports = SignatureComposerExtension

View file

@ -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;

View file

@ -0,0 +1,29 @@
const SignatureUtils = {
applySignature(body, signature) {
const signatureRegex = /<div class="nylas-n1-signature">.*<\/div>/;
let signatureHTML = '<div class="nylas-n1-signature">' + signature + '</div>';
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('<blockquote');
if (insertionPoint === -1) {
insertionPoint = newBody.length
signatureHTML = '<br/><br/>' + signatureHTML
}
}
return newBody.slice(0, insertionPoint) + signatureHTML + newBody.slice(insertionPoint)
},
}
export default SignatureUtils;

View file

@ -23,6 +23,24 @@ describe "SignatureComposerExtension", ->
SignatureComposerExtension.prepareNewDraft(draft: b)
expect(b.body).toEqual('This is a another test.<br/><br/><div class="nylas-n1-signature"><div id="signature">This is my signature.</div></div>')
it "should replace the signature if a signature is already present", ->
a = new Message
draft: true
body: 'This is a test! <div class="nylas-n1-signature"><div>SIG</div></div><blockquote>Hello world</blockquote>'
b = new Message
draft: true
body: 'This is a test! <div class="nylas-n1-signature"><div>SIG</div></div>'
c = new Message
draft: true
body: 'This is a test! <div class="nylas-n1-signature"></div>'
SignatureComposerExtension.prepareNewDraft(draft: a)
expect(a.body).toEqual("This is a test! <div class=\"nylas-n1-signature\">#{@signature}</div><blockquote>Hello world</blockquote>")
SignatureComposerExtension.prepareNewDraft(draft: b)
expect(b.body).toEqual("This is a test! <div class=\"nylas-n1-signature\">#{@signature}</div>")
SignatureComposerExtension.prepareNewDraft(draft: c)
expect(c.body).toEqual("This is a test! <div class=\"nylas-n1-signature\">#{@signature}</div>")
describe "when a signature is not defined", ->
beforeEach ->
spyOn(NylasEnv.config, 'get').andCallFake ->

View file

@ -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)

View file

@ -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