mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-09-21 07:46:06 +08:00
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:
parent
34dc2e331f
commit
579d4ad71b
|
@ -1,8 +1,9 @@
|
||||||
{PreferencesUIStore, ExtensionRegistry} = require 'nylas-exports'
|
{PreferencesUIStore, ExtensionRegistry} = require 'nylas-exports'
|
||||||
SignatureComposerExtension = require './signature-composer-extension'
|
SignatureComposerExtension = require './signature-composer-extension'
|
||||||
|
SignatureStore = require './signature-store'
|
||||||
|
|
||||||
module.exports =
|
module.exports =
|
||||||
activate: (@state={}) ->
|
activate: ->
|
||||||
@preferencesTab = new PreferencesUIStore.TabItem
|
@preferencesTab = new PreferencesUIStore.TabItem
|
||||||
tabId: "Signatures"
|
tabId: "Signatures"
|
||||||
displayName: "Signatures"
|
displayName: "Signatures"
|
||||||
|
@ -11,8 +12,12 @@ module.exports =
|
||||||
ExtensionRegistry.Composer.register(SignatureComposerExtension)
|
ExtensionRegistry.Composer.register(SignatureComposerExtension)
|
||||||
PreferencesUIStore.registerPreferencesTab(@preferencesTab)
|
PreferencesUIStore.registerPreferencesTab(@preferencesTab)
|
||||||
|
|
||||||
|
@signatureStore = new SignatureStore()
|
||||||
|
@signatureStore.activate()
|
||||||
|
|
||||||
deactivate: ->
|
deactivate: ->
|
||||||
ExtensionRegistry.Composer.unregister(SignatureComposerExtension)
|
ExtensionRegistry.Composer.unregister(SignatureComposerExtension)
|
||||||
PreferencesUIStore.unregisterPreferencesTab(@preferencesTab.sectionId)
|
PreferencesUIStore.unregisterPreferencesTab(@preferencesTab.sectionId)
|
||||||
|
@signatureStore.deactivate()
|
||||||
|
|
||||||
serialize: -> @state
|
serialize: ->
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{ComposerExtension, AccountStore} = require 'nylas-exports'
|
{ComposerExtension, AccountStore} = require 'nylas-exports'
|
||||||
|
SignatureUtils = require './signature-utils'
|
||||||
|
|
||||||
class SignatureComposerExtension extends ComposerExtension
|
class SignatureComposerExtension extends ComposerExtension
|
||||||
@prepareNewDraft: ({draft}) ->
|
@prepareNewDraft: ({draft}) ->
|
||||||
|
@ -6,13 +7,6 @@ class SignatureComposerExtension extends ComposerExtension
|
||||||
signature = NylasEnv.config.get("nylas.account-#{accountId}.signature")
|
signature = NylasEnv.config.get("nylas.account-#{accountId}.signature")
|
||||||
return unless signature
|
return unless signature
|
||||||
|
|
||||||
insertionPoint = draft.body.indexOf('<blockquote')
|
draft.body = SignatureUtils.applySignature(draft.body, signature)
|
||||||
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)
|
|
||||||
|
|
||||||
module.exports = SignatureComposerExtension
|
module.exports = SignatureComposerExtension
|
||||||
|
|
33
internal_packages/composer-signature/lib/signature-store.es6
Normal file
33
internal_packages/composer-signature/lib/signature-store.es6
Normal 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;
|
29
internal_packages/composer-signature/lib/signature-utils.es6
Normal file
29
internal_packages/composer-signature/lib/signature-utils.es6
Normal 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;
|
||||||
|
|
|
@ -23,6 +23,24 @@ describe "SignatureComposerExtension", ->
|
||||||
SignatureComposerExtension.prepareNewDraft(draft: b)
|
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>')
|
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", ->
|
describe "when a signature is not defined", ->
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
spyOn(NylasEnv.config, 'get').andCallFake ->
|
spyOn(NylasEnv.config, 'get').andCallFake ->
|
||||||
|
|
|
@ -619,6 +619,7 @@ class ComposerView extends React.Component
|
||||||
|
|
||||||
_onChangeParticipants: (changes={}) =>
|
_onChangeParticipants: (changes={}) =>
|
||||||
@_addToProxy(changes)
|
@_addToProxy(changes)
|
||||||
|
Actions.draftParticipantsChanged(@props.draftClientId, changes)
|
||||||
|
|
||||||
_onChangeSubject: (event) =>
|
_onChangeSubject: (event) =>
|
||||||
@_addToProxy(subject: event.target.value)
|
@_addToProxy(subject: event.target.value)
|
||||||
|
|
|
@ -524,6 +524,8 @@ class Actions
|
||||||
###
|
###
|
||||||
@setMetadata: ActionScopeWindow
|
@setMetadata: ActionScopeWindow
|
||||||
|
|
||||||
|
@draftParticipantsChanged: ActionScopeWindow
|
||||||
|
|
||||||
# Read the actions we declared on the dummy Actions object above
|
# Read the actions we declared on the dummy Actions object above
|
||||||
# and translate them into Reflux Actions
|
# and translate them into Reflux Actions
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue