feat(default-alias): Add functionality to select a default alias

Summary:
- Update Account model witha default alias and DraftStore methods that
construct new messages to use default alias if available.
- Update AccountDetails page and add selector to select default alias

Test Plan: - Unit tests

Reviewers: evan, bengotow

Reviewed By: bengotow

Differential Revision: https://phab.nylas.com/D2352
This commit is contained in:
Juan Tejada 2015-12-14 14:34:13 -08:00
parent f0cc7afb54
commit 832d0b8dcf
4 changed files with 68 additions and 6 deletions

View file

@ -51,6 +51,13 @@ class PreferencesAccountDetails extends Component {
return `${name} <${email}>`;
}
_updatedDefaultAlias(originalAlias, newAlias, defaultAlias) {
if (originalAlias === defaultAlias) {
return newAlias;
}
return defaultAlias;
}
_saveChanges = ()=> {
this.props.onAccountUpdated(this.props.account, this.state);
}
@ -73,21 +80,54 @@ class PreferencesAccountDetails extends Component {
_onAccountAliasUpdated = (newAlias, alias, idx)=> {
const coercedAlias = this._makeAlias(newAlias);
const aliases = this.state.aliases.slice();
let defaultAlias = this.state.defaultAlias;
if (defaultAlias === alias) {
defaultAlias = coercedAlias;
}
aliases[idx] = coercedAlias;
this.setState({aliases}, ()=> {
this.setState({aliases, defaultAlias}, ()=> {
this._saveChanges();
});
}
_onAccountAliasRemoved = (alias, idx)=> {
const aliases = this.state.aliases.slice();
let defaultAlias = this.state.defaultAlias;
if (defaultAlias === alias) {
defaultAlias = null;
}
aliases.splice(idx, 1);
this.setState({aliases}, ()=> {
this.setState({aliases, defaultAlias}, ()=> {
this._saveChanges();
});
}
_onDefaultAliasSelected = (event)=> {
const defaultAlias = event.target.value === 'None' ? null : event.target.value;
this.setState({defaultAlias}, ()=> {
this._saveChanges();
});
}
// Renderers
_renderDefaultAliasSelector(account) {
const aliases = account.aliases;
const defaultAlias = account.defaultAlias || 'None';
if (aliases.length > 0) {
return (
<div className="default-alias-selector">
<span>Default alias: </span>
<select value={defaultAlias} onChange={this._onDefaultAliasSelected}>
<option>None</option>
{aliases.map((alias, idx)=> <option key={`alias-${idx}`} value={alias}>{alias}</option>)}
</select>
</div>
);
}
}
render() {
const account = this.state;
const aliasPlaceholder = this._makeAlias(
@ -111,6 +151,7 @@ class PreferencesAccountDetails extends Component {
onDeleteItem={this._onAccountAliasRemoved} >
{account.aliases}
</EditableList>
{this._renderDefaultAliasSelector(account)}
</div>
);
}

View file

@ -62,6 +62,16 @@
font-size: 0.9em;
width: 100%;
}
.default-alias-selector {
font-size: 0.9em;
float: right;
&>select {
min-width: 35%;
max-width: 243px;
}
}
}
}
}

View file

@ -53,6 +53,11 @@ class Account extends Model
queryable: false
modelKey: 'aliases'
'defaultAlias': Attributes.Object
queryable: false
modelKey: 'defaultAlias'
jsonKey: 'default_alias'
constructor: ->
super
@aliases ||= []

View file

@ -151,6 +151,12 @@ class DraftStore
########### PRIVATE ####################################################
_getFromField: (account) ->
if account.defaultAlias?
account.meUsingAlias(account.defaultAlias)
else
account.me()
_doneWithSession: (session) ->
session.teardown()
delete @_draftSessions[session.draftClientId]
@ -280,7 +286,7 @@ class DraftStore
_constructDraft: ({attributes, thread}) =>
return new Message _.extend {}, attributes,
from: [AccountStore.current().me()]
from: [@_getFromField(AccountStore.current())]
date: (new Date)
draft: true
pristine: true
@ -369,7 +375,7 @@ class DraftStore
draft = new Message
body: ""
from: [account.me()]
from: [@_getFromField(account)]
date: (new Date)
draft: true
pristine: true
@ -420,7 +426,7 @@ class DraftStore
draft = new Message
body: query.body || ''
subject: query.subject || '',
from: [account.me()]
from: [@_getFromField(account)]
date: (new Date)
draft: true
pristine: true