Mailspring/internal_packages/preferences/lib/tabs/preferences-accounts.cjsx
Ben Gotow 213bbde692 fix(onboarding): Tweaks, styles, etc. for new onboarding experience
Summary:
Remove logout menu item and buttons, turn Link External Account to Add Account

Onboarding window starts hidden, is shown when react component is mounted and sized

Use get/setBounds to animate position and size at the same time smoothly

Fix specs, change 401 notice

Delay bouncing to Gmail to show users the Gmail screen momentarily

Make the animated resizing code defer so it doesn't run in a hard loop, and other animations can run at the same time

Bring back crossfade between screens, remove left/right shift on welcome screens

Test Plan: Run tests

Reviewers: drew, evan

Reviewed By: evan

Maniphest Tasks: T3529

Differential Revision: https://phab.nylas.com/D2054
2015-09-23 09:59:34 -07:00

122 lines
3.8 KiB
CoffeeScript

React = require 'react'
_ = require 'underscore'
{AccountStore, DatabaseStore, EdgehillAPI} = require 'nylas-exports'
{RetinaImg, Flexbox} = require 'nylas-component-kit'
class PreferencesAccounts extends React.Component
@displayName: 'PreferencesAccounts'
@propTypes:
config: React.PropTypes.object.isRequired
constructor: (@props) ->
@state = @getStateFromStores()
componentDidMount: =>
@unsubscribe = AccountStore.listen @_onAccountChange
componentWillUnmount: =>
@unsubscribe?()
render: =>
<div className="container-accounts">
{@_renderAccounts()}
<div style={textAlign:"right", marginTop: '20'}>
<button className="btn btn-large" onClick={@_onAddAccount}>Add Account...</button>
</div>
{@_renderLinkedAccounts()}
</div>
_renderAccounts: =>
return false unless @state.accounts
allowUnlinking = @state.accounts.length > 1
<div>
<div className="section-header">
Accounts:
</div>
{ @state.accounts.map (account) =>
<div className="well large" style={marginBottom:10} key={account.id}>
<Flexbox direction="row" style={alignItems: 'middle'}>
<div style={textAlign: "center"}>
<RetinaImg name={"ic-settings-account-#{account.provider}.png"}
fallback="ic-settings-account-imap.png"
mode={RetinaImg.Mode.ContentPreserve} />
</div>
<div style={flex: 1, marginLeft: 10}>
<div className="account-name">{account.emailAddress}</div>
<div className="account-subtext">{account.name || "No name provided."} ({account.displayProvider()})</div>
</div>
<div style={textAlign:"right", marginTop:10, display: if allowUnlinking then 'inline-block' else 'none'}>
<button className="btn btn-large" onClick={ => @_onUnlinkAccount(account) }>Unlink</button>
</div>
</Flexbox>
</div>
}
</div>
_renderLinkedAccounts: =>
tokens = @getSecondaryTokens()
return false unless tokens.length > 0
<div>
<div className="section-header">
Linked Accounts:
</div>
{ tokens.map (token) =>
<div className="well small" key={token.id}>
{@_renderLinkedAccount(token)}
</div>
}
</div>
_renderLinkedAccount: (token) =>
<Flexbox direction="row" style={alignItems: "center"}>
<div>
<RetinaImg name={"ic-settings-account-#{token.provider}.png"} fallback="ic-settings-account-imap.png" />
</div>
<div style={flex: 1, marginLeft: 10}>
<div className="account-name">{token.provider}</div>
</div>
<div style={textAlign:"right"}>
<button onClick={ => @_onUnlinkToken(token) } className="btn btn-large">Unlink</button>
</div>
</Flexbox>
getStateFromStores: =>
accounts: AccountStore.items()
getSecondaryTokens: =>
return [] unless @props.config
tokens = @props.config.get('tokens') || []
tokens = tokens.filter (token) -> token.provider isnt 'nylas'
tokens
_onAddAccount: =>
require('remote').getGlobal('application').windowManager.newOnboardingWindow()
_onAccountChange: =>
@setState(@getStateFromStores())
_onUnlinkAccount: (account) =>
return [] unless @props.config
tokens = @props.config.get('tokens') || []
token = _.find tokens, (t) ->
t.provider is 'nylas' and t.identifier is account.emailAddress
tokens = _.without(tokens, token)
if not token
console.warn("Could not find nylas token for email address #{account.emailAddress}")
return
DatabaseStore.unpersistModel(account).then =>
# TODO: Delete other mail data
EdgehillAPI.unlinkToken(token)
_onUnlinkToken: (token) =>
EdgehillAPI.unlinkToken(token)
return
module.exports = PreferencesAccounts