/* eslint global-require: 0 */ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { shell, ipcRenderer } from 'electron'; import { EditableList } from 'mailspring-component-kit'; import { RegExpUtils, KeyManager, Account } from 'mailspring-exports'; class AutoaddressControl extends Component { render() { const { autoaddress, onChange, onSaveChanges } = this.props; return (
When composing, automatically :
onChange(Object.assign({}, autoaddress, { value: e.target.value }))} onBlur={onSaveChanges} placeholder="Comma-separated email addresses" />
); } } class PreferencesAccountDetails extends Component { static propTypes = { account: PropTypes.object, onAccountUpdated: PropTypes.func.isRequired, }; constructor(props) { super(props); this.state = { account: props.account.clone() }; } componentWillReceiveProps(nextProps) { this.setState({ account: nextProps.account.clone() }); } componentWillUnmount() { this._saveChanges(); } // Helpers /** * @private Will transform any user input into alias format. * It will ignore any text after an email, if one is entered. * If no email is entered, it will use the account's email. * It will treat the text before the email as the name for the alias. * If no name is entered, it will use the account's name value. * @param {string} str - The string the user entered on the alias input * @param {object} [account=this.props.account] - The account object */ _makeAlias(str, account = this.props.account) { const emailRegex = RegExpUtils.emailRegex(); const match = emailRegex.exec(str); if (!match) { return `${str || account.name} <${account.emailAddress}>`; } const email = match[0]; let name = str.slice(0, Math.max(0, match.index - 1)); if (!name) { name = account.name || 'No name provided'; } name = name.trim(); // TODO Sanitize the name string return `${name} <${email}>`; } _saveChanges = () => { this.props.onAccountUpdated(this.props.account, this.state.account); }; _setState = (updates, callback = () => {}) => { const account = Object.assign(this.state.account.clone(), updates); this.setState({ account }, callback); }; _setStateAndSave = updates => { this._setState(updates, () => { this._saveChanges(); }); }; // Handlers _onAccountAutoaddressUpdated = autoaddress => { this._setState({ autoaddress }); }; _onAccountLabelUpdated = event => { this._setState({ label: event.target.value }); }; _onAccountAliasCreated = newAlias => { const coercedAlias = this._makeAlias(newAlias); const aliases = this.state.account.aliases.concat([coercedAlias]); this._setStateAndSave({ aliases }); }; _onAccountAliasUpdated = (newAlias, alias, idx) => { const coercedAlias = this._makeAlias(newAlias); const aliases = this.state.account.aliases.slice(); let defaultAlias = this.state.account.defaultAlias; if (defaultAlias === alias) { defaultAlias = coercedAlias; } aliases[idx] = coercedAlias; this._setStateAndSave({ aliases, defaultAlias }); }; _onAccountAliasRemoved = (alias, idx) => { const aliases = this.state.account.aliases.slice(); let defaultAlias = this.state.account.defaultAlias; if (defaultAlias === alias) { defaultAlias = null; } aliases.splice(idx, 1); this._setStateAndSave({ aliases, defaultAlias }); }; _onDefaultAliasSelected = event => { const defaultAlias = event.target.value === 'None' ? null : event.target.value; this._setStateAndSave({ defaultAlias }); }; _onReconnect = async () => { ipcRenderer.send('command', 'application:add-account', { existingAccountJSON: await KeyManager.insertAccountSecrets(this.state.account), }); }; _onResetCache = () => { AppEnv.mailsyncBridge.resetCacheForAccount(this.state.account); }; _onContactSupport = () => { shell.openExternal('https://support.getmailspring.com/hc/en-us/requests/new'); }; // Renderers _renderDefaultAliasSelector(account) { const aliases = account.aliases; const defaultAlias = account.defaultAlias || 'None'; if (aliases.length > 0) { return (
Default for new messages:
); } return null; } _renderErrorDetail(message, buttonText, buttonAction) { return (
{message}
{buttonText}
); } _renderSyncErrorDetails() { const { account } = this.state; switch (account.syncState) { case Account.SYNC_STATE_AUTH_FAILED: return this._renderErrorDetail( `Mailspring can no longer authenticate with ${account.emailAddress}. The password or authentication may have changed.`, 'Reconnect', this._onReconnect ); case Account.SYNC_STATE_ERROR: return this._renderErrorDetail( `Mailspring encountered errors syncing this account. Crash reports have been sent to the Mailspring team and we'll work to fix these errors in the next release.`, 'Try Reconnecting', this._onReconnect ); default: return null; } } render() { const { account } = this.state; const aliasPlaceholder = this._makeAlias(`alias@${account.emailAddress.split('@')[1]}`); return (
{this._renderSyncErrorDetails()}

Account Label

Account Settings

{account.provider === 'imap' ? 'Update Connection Settings...' : 'Re-authenticate...'}
Rebuild Cache...

Automatic CC / BCC

Aliases

You may need to configure aliases with your mail provider (Outlook, Gmail) before using them.
{this._renderDefaultAliasSelector(account)}
); } } export default PreferencesAccountDetails;