Browse Source

fixes #1114 plus some other little bugs (#1162)

master
NastiaS 7 years ago
committed by Gaëtan Renaudeau
parent
commit
212b1a062d
  1. 14
      src/components/IsUnlocked.js
  2. 8
      src/components/Onboarding/steps/SetPassword.js
  3. 15
      src/components/SelectExchange.js
  4. 15
      src/components/SettingsPage/DisablePasswordModal.js
  5. 14
      src/components/SettingsPage/PasswordForm.js
  6. 11
      src/components/SettingsPage/PasswordModal.js
  7. 52
      src/components/modals/AccountSettingRenderBody.js
  8. 14
      src/components/modals/ReleaseNotes/ReleaseNotesBody.js
  9. 25
      src/components/modals/Send/steps/04-step-confirmation.js
  10. 17
      static/i18n/en/app.json
  11. 20
      static/i18n/en/errors.json

14
src/components/IsUnlocked.js

@ -20,11 +20,15 @@ import hardReset from 'helpers/hardReset'
import { fetchAccounts } from 'actions/accounts' import { fetchAccounts } from 'actions/accounts'
import { isLocked, unlock } from 'reducers/application' import { isLocked, unlock } from 'reducers/application'
import { createCustomErrorClass } from 'helpers/errors'
import Box from 'components/base/Box' import Box from 'components/base/Box'
import InputPassword from 'components/base/InputPassword' import InputPassword from 'components/base/InputPassword'
import Button from './base/Button/index' import Button from './base/Button/index'
import ConfirmModal from './base/Modal/ConfirmModal' import ConfirmModal from './base/Modal/ConfirmModal'
const PasswordIncorrectError = createCustomErrorClass('PasswordIncorrect')
type InputValue = { type InputValue = {
password: string, password: string,
} }
@ -39,7 +43,7 @@ type Props = {
} }
type State = { type State = {
inputValue: InputValue, inputValue: InputValue,
incorrectPassword: boolean, incorrectPassword: ?Error,
isHardResetting: boolean, isHardResetting: boolean,
isHardResetModalOpened: boolean, isHardResetModalOpened: boolean,
} }
@ -58,7 +62,7 @@ const defaultState = {
inputValue: { inputValue: {
password: '', password: '',
}, },
incorrectPassword: false, incorrectPassword: null,
isHardResetting: false, isHardResetting: false,
isHardResetModalOpened: false, isHardResetModalOpened: false,
} }
@ -104,7 +108,7 @@ class IsUnlocked extends Component<Props, State> {
...prev.inputValue, ...prev.inputValue,
[key]: value, [key]: value,
}, },
incorrectPassword: false, incorrectPassword: null,
})) }))
handleSubmit = async (e: SyntheticEvent<HTMLFormElement>) => { handleSubmit = async (e: SyntheticEvent<HTMLFormElement>) => {
@ -122,7 +126,7 @@ class IsUnlocked extends Component<Props, State> {
...defaultState, ...defaultState,
}) })
} else { } else {
this.setState({ incorrectPassword: true }) this.setState({ incorrectPassword: new PasswordIncorrectError() })
} }
} }
@ -177,7 +181,7 @@ class IsUnlocked extends Component<Props, State> {
type="password" type="password"
onChange={this.handleChangeInput('password')} onChange={this.handleChangeInput('password')}
value={inputValue.password} value={inputValue.password}
error={incorrectPassword && t('app:password.errorMessageIncorrectPassword')} error={incorrectPassword}
/> />
</Box> </Box>
<Button type="button" mt={3} small onClick={this.handleOpenHardResetModal}> <Button type="button" mt={3} small onClick={this.handleOpenHardResetModal}>

8
src/components/Onboarding/steps/SetPassword.js

@ -28,14 +28,12 @@ type State = {
currentPassword: string, currentPassword: string,
newPassword: string, newPassword: string,
confirmPassword: string, confirmPassword: string,
incorrectPassword: boolean,
} }
const INITIAL_STATE = { const INITIAL_STATE = {
currentPassword: '', currentPassword: '',
newPassword: '', newPassword: '',
confirmPassword: '', confirmPassword: '',
incorrectPassword: false,
} }
class SetPassword extends PureComponent<StepProps, State> { class SetPassword extends PureComponent<StepProps, State> {
@ -59,9 +57,6 @@ class SetPassword extends PureComponent<StepProps, State> {
} }
handleInputChange = (key: string) => (value: string) => { handleInputChange = (key: string) => (value: string) => {
if (this.state.incorrectPassword) {
this.setState({ incorrectPassword: false })
}
this.setState({ [key]: value }) this.setState({ [key]: value })
} }
@ -74,7 +69,7 @@ class SetPassword extends PureComponent<StepProps, State> {
render() { render() {
const { nextStep, prevStep, t, settings, onboarding } = this.props const { nextStep, prevStep, t, settings, onboarding } = this.props
const { newPassword, currentPassword, incorrectPassword, confirmPassword } = this.state const { newPassword, currentPassword, confirmPassword } = this.state
const isPasswordEnabled = settings.password.isEnabled === true const isPasswordEnabled = settings.password.isEnabled === true
@ -119,7 +114,6 @@ class SetPassword extends PureComponent<StepProps, State> {
newPassword={newPassword} newPassword={newPassword}
currentPassword={currentPassword} currentPassword={currentPassword}
confirmPassword={confirmPassword} confirmPassword={confirmPassword}
incorrectPassword={incorrectPassword}
isValid={this.isValid} isValid={this.isValid}
onChange={this.handleInputChange} onChange={this.handleInputChange}
t={t} t={t}

15
src/components/SelectExchange.js

@ -8,7 +8,8 @@ import logger from 'logger'
import Track from 'analytics/Track' import Track from 'analytics/Track'
import Select from 'components/base/Select' import Select from 'components/base/Select'
import Text from 'components/base/Text' import Box from 'components/base/Box'
import TranslatedError from 'components/TranslatedError'
import CounterValues from 'helpers/countervalues' import CounterValues from 'helpers/countervalues'
import type { T } from 'types/common' import type { T } from 'types/common'
@ -101,9 +102,15 @@ class SelectExchange extends Component<
const value = options.find(e => e.id === exchangeId) const value = options.find(e => e.id === exchangeId)
return error ? ( return error ? (
<Text ff="Open Sans|SemiBold" color="dark" fontSize={4}> <Box
{t('app:common.error.load')} style={{ wordWrap: 'break-word', width: 250 }}
</Text> color="alertRed"
ff="Open Sans|SemiBold"
fontSize={3}
textAlign="center"
>
<TranslatedError error={error} />
</Box>
) : ( ) : (
<Fragment> <Fragment>
{exchanges ? ( {exchanges ? (

15
src/components/SettingsPage/DisablePasswordModal.js

@ -2,6 +2,7 @@
import React, { PureComponent } from 'react' import React, { PureComponent } from 'react'
import bcrypt from 'bcryptjs' import bcrypt from 'bcryptjs'
import { createCustomErrorClass } from 'helpers/errors'
import Box from 'components/base/Box' import Box from 'components/base/Box'
import Button from 'components/base/Button' import Button from 'components/base/Button'
@ -11,6 +12,8 @@ import { Modal, ModalContent, ModalBody, ModalTitle, ModalFooter } from 'compone
import type { T } from 'types/common' import type { T } from 'types/common'
const PasswordIncorrectError = createCustomErrorClass('PasswordIncorrect')
type Props = { type Props = {
t: T, t: T,
onClose: Function, onClose: Function,
@ -21,12 +24,12 @@ type Props = {
type State = { type State = {
currentPassword: string, currentPassword: string,
incorrectPassword: boolean, incorrectPassword: ?Error,
} }
const INITIAL_STATE = { const INITIAL_STATE = {
currentPassword: '', currentPassword: '',
incorrectPassword: false, incorrectPassword: null,
} }
// TODO: combine with the refactored password form // TODO: combine with the refactored password form
@ -42,7 +45,7 @@ class DisablePasswordModal extends PureComponent<Props, State> {
const { isPasswordEnabled, currentPasswordHash, onChangePassword } = this.props const { isPasswordEnabled, currentPasswordHash, onChangePassword } = this.props
if (isPasswordEnabled) { if (isPasswordEnabled) {
if (!bcrypt.compareSync(currentPassword, currentPasswordHash)) { if (!bcrypt.compareSync(currentPassword, currentPasswordHash)) {
this.setState({ incorrectPassword: true }) this.setState({ incorrectPassword: new PasswordIncorrectError() })
return return
} }
onChangePassword('') onChangePassword('')
@ -53,7 +56,7 @@ class DisablePasswordModal extends PureComponent<Props, State> {
handleInputChange = (key: string) => (value: string) => { handleInputChange = (key: string) => (value: string) => {
if (this.state.incorrectPassword) { if (this.state.incorrectPassword) {
this.setState({ incorrectPassword: false }) this.setState({ incorrectPassword: null })
} }
this.setState({ [key]: value }) this.setState({ [key]: value })
} }
@ -87,9 +90,7 @@ class DisablePasswordModal extends PureComponent<Props, State> {
id="password" id="password"
onChange={this.handleInputChange('currentPassword')} onChange={this.handleInputChange('currentPassword')}
value={currentPassword} value={currentPassword}
error={ error={incorrectPassword}
incorrectPassword && t('app:password.errorMessageIncorrectPassword')
}
/> />
</Box> </Box>
)} )}

14
src/components/SettingsPage/PasswordForm.js

@ -6,15 +6,19 @@ import Box from 'components/base/Box'
import InputPassword from 'components/base/InputPassword' import InputPassword from 'components/base/InputPassword'
import Label from 'components/base/Label' import Label from 'components/base/Label'
import { createCustomErrorClass } from 'helpers/errors'
import type { T } from 'types/common' import type { T } from 'types/common'
const PasswordsDontMatchError = createCustomErrorClass('PasswordsDontMatch')
type Props = { type Props = {
t: T, t: T,
isPasswordEnabled: boolean, isPasswordEnabled: boolean,
currentPassword: string, currentPassword: string,
newPassword: string, newPassword: string,
confirmPassword: string, confirmPassword: string,
incorrectPassword: boolean, incorrectPassword?: ?Error,
onSubmit: Function, onSubmit: Function,
isValid: () => boolean, isValid: () => boolean,
onChange: Function, onChange: Function,
@ -47,7 +51,7 @@ class PasswordForm extends PureComponent<Props> {
id="currentPassword" id="currentPassword"
onChange={onChange('currentPassword')} onChange={onChange('currentPassword')}
value={currentPassword} value={currentPassword}
error={incorrectPassword && t('app:password.errorMessageIncorrectPassword')} error={incorrectPassword}
/> />
</Box> </Box>
)} )}
@ -70,11 +74,7 @@ class PasswordForm extends PureComponent<Props> {
id="confirmPassword" id="confirmPassword"
onChange={onChange('confirmPassword')} onChange={onChange('confirmPassword')}
value={confirmPassword} value={confirmPassword}
error={ error={!isValid() && confirmPassword.length > 0 && new PasswordsDontMatchError()}
!isValid() &&
confirmPassword.length > 0 &&
t('app:password.errorMessageNotMatchingPassword')
}
/> />
</Box> </Box>
</Box> </Box>

11
src/components/SettingsPage/PasswordModal.js

@ -5,12 +5,15 @@ import bcrypt from 'bcryptjs'
import type { T } from 'types/common' import type { T } from 'types/common'
import { createCustomErrorClass } from 'helpers/errors'
import Box from 'components/base/Box' import Box from 'components/base/Box'
import Button from 'components/base/Button' import Button from 'components/base/Button'
import { Modal, ModalContent, ModalBody, ModalTitle, ModalFooter } from 'components/base/Modal' import { Modal, ModalContent, ModalBody, ModalTitle, ModalFooter } from 'components/base/Modal'
import PasswordForm from './PasswordForm' import PasswordForm from './PasswordForm'
const PasswordIncorrectError = createCustomErrorClass('PasswordIncorrect')
type Props = { type Props = {
t: T, t: T,
onClose: () => void, onClose: () => void,
@ -23,14 +26,14 @@ type State = {
currentPassword: string, currentPassword: string,
newPassword: string, newPassword: string,
confirmPassword: string, confirmPassword: string,
incorrectPassword: boolean, incorrectPassword: ?Error,
} }
const INITIAL_STATE = { const INITIAL_STATE = {
currentPassword: '', currentPassword: '',
newPassword: '', newPassword: '',
confirmPassword: '', confirmPassword: '',
incorrectPassword: false, incorrectPassword: null,
} }
class PasswordModal extends PureComponent<Props, State> { class PasswordModal extends PureComponent<Props, State> {
@ -49,7 +52,7 @@ class PasswordModal extends PureComponent<Props, State> {
const { isPasswordEnabled, currentPasswordHash, onChangePassword } = this.props const { isPasswordEnabled, currentPasswordHash, onChangePassword } = this.props
if (isPasswordEnabled) { if (isPasswordEnabled) {
if (!bcrypt.compareSync(currentPassword, currentPasswordHash)) { if (!bcrypt.compareSync(currentPassword, currentPasswordHash)) {
this.setState({ incorrectPassword: true }) this.setState({ incorrectPassword: new PasswordIncorrectError() })
return return
} }
onChangePassword(newPassword) onChangePassword(newPassword)
@ -60,7 +63,7 @@ class PasswordModal extends PureComponent<Props, State> {
handleInputChange = (key: string) => (value: string) => { handleInputChange = (key: string) => (value: string) => {
if (this.state.incorrectPassword) { if (this.state.incorrectPassword) {
this.setState({ incorrectPassword: false }) this.setState({ incorrectPassword: null })
} }
this.setState({ [key]: value }) this.setState({ [key]: value })
} }

52
src/components/modals/AccountSettingRenderBody.js

@ -17,6 +17,8 @@ import { setDataModal } from 'reducers/modals'
import { getBridgeForCurrency } from 'bridge' import { getBridgeForCurrency } from 'bridge'
import { createCustomErrorClass } from 'helpers/errors'
import TrackPage from 'analytics/TrackPage' import TrackPage from 'analytics/TrackPage'
import Spoiler from 'components/base/Spoiler' import Spoiler from 'components/base/Spoiler'
import CryptoCurrencyIcon from 'components/CryptoCurrencyIcon' import CryptoCurrencyIcon from 'components/CryptoCurrencyIcon'
@ -34,11 +36,14 @@ import {
ConfirmModal, ConfirmModal,
} from 'components/base/Modal' } from 'components/base/Modal'
const AccountNameRequiredError = createCustomErrorClass('AccountNameRequired')
const EnpointConfigError = createCustomErrorClass('EnpointConfig')
type State = { type State = {
accountName: ?string, accountName: ?string,
accountUnit: ?Unit, accountUnit: ?Unit,
endpointConfig: ?string, endpointConfig: ?string,
accountNameError: boolean, accountNameError: ?Error,
endpointConfigError: ?Error, endpointConfigError: ?Error,
isRemoveAccountModalOpen: boolean, isRemoveAccountModalOpen: boolean,
} }
@ -67,7 +72,7 @@ const defaultState = {
accountName: null, accountName: null,
accountUnit: null, accountUnit: null,
endpointConfig: null, endpointConfig: null,
accountNameError: false, accountNameError: null,
endpointConfigError: null, endpointConfigError: null,
isRemoveAccountModalOpen: false, isRemoveAccountModalOpen: false,
} }
@ -116,7 +121,7 @@ class HelperComp extends PureComponent<Props, State> {
} }
} catch (endpointConfigError) { } catch (endpointConfigError) {
if (handleChangeEndpointConfig_id === this.handleChangeEndpointConfig_id) { if (handleChangeEndpointConfig_id === this.handleChangeEndpointConfig_id) {
this.setState({ endpointConfigError }) this.setState({ endpointConfigError: new EnpointConfigError() })
} }
} }
} }
@ -133,18 +138,24 @@ class HelperComp extends PureComponent<Props, State> {
const { updateAccount, setDataModal } = this.props const { updateAccount, setDataModal } = this.props
const { accountName, accountUnit, endpointConfig, endpointConfigError } = this.state const { accountName, accountUnit, endpointConfig, endpointConfigError } = this.state
const name = validateNameEdition(account, accountName)
account = { if (!account.name.length) {
...account, this.setState({ accountNameError: new AccountNameRequiredError() })
unit: accountUnit || account.unit, } else if (!endpointConfigError) {
name, const name = validateNameEdition(account, accountName)
}
if (endpointConfig && !endpointConfigError) { account = {
account.endpointConfig = endpointConfig ...account,
unit: accountUnit || account.unit,
name,
}
if (endpointConfig && !endpointConfigError) {
account.endpointConfig = endpointConfig
}
updateAccount(account)
setDataModal(MODAL_SETTINGS_ACCOUNT, { account })
onClose()
} }
updateAccount(account)
setDataModal(MODAL_SETTINGS_ACCOUNT, { account })
onClose()
} }
handleFocus = (e: any, name: string) => { handleFocus = (e: any, name: string) => {
@ -152,7 +163,10 @@ class HelperComp extends PureComponent<Props, State> {
switch (name) { switch (name) {
case 'accountName': case 'accountName':
this.setState({ accountNameError: false }) this.setState({ accountNameError: null })
break
case 'endpointConfig':
this.setState({ endpointConfigError: null })
break break
default: default:
break break
@ -214,7 +228,7 @@ class HelperComp extends PureComponent<Props, State> {
maxLength={MAX_ACCOUNT_NAME_SIZE} maxLength={MAX_ACCOUNT_NAME_SIZE}
onChange={this.handleChangeName} onChange={this.handleChangeName}
onFocus={e => this.handleFocus(e, 'accountName')} onFocus={e => this.handleFocus(e, 'accountName')}
error={accountNameError && new Error(t('app:account.settings.accountName.error'))} error={accountNameError}
/> />
</Box> </Box>
</Container> </Container>
@ -250,11 +264,7 @@ class HelperComp extends PureComponent<Props, State> {
} }
onChange={this.handleChangeEndpointConfig} onChange={this.handleChangeEndpointConfig}
onFocus={e => this.handleFocus(e, 'endpointConfig')} onFocus={e => this.handleFocus(e, 'endpointConfig')}
error={ error={endpointConfigError}
endpointConfigError
? new Error(t('app:account.settings.endpointConfig.error'))
: null
}
/> />
</Box> </Box>
</Container> </Container>

14
src/components/modals/ReleaseNotes/ReleaseNotesBody.js

@ -11,8 +11,9 @@ import GrowScroll from 'components/base/GrowScroll'
import Text from 'components/base/Text' import Text from 'components/base/Text'
import Spinner from 'components/base/Spinner' import Spinner from 'components/base/Spinner'
import GradientBox from 'components/GradientBox' import GradientBox from 'components/GradientBox'
import TranslatedError from 'components/TranslatedError'
import TrackPage from 'analytics/TrackPage' import TrackPage from 'analytics/TrackPage'
import Markdow, { Notes } from 'components/base/Markdown' import Markdown, { Notes } from 'components/base/Markdown'
import { ModalBody, ModalTitle, ModalContent, ModalFooter } from 'components/base/Modal' import { ModalBody, ModalTitle, ModalContent, ModalFooter } from 'components/base/Modal'
import type { T } from 'types/common' import type { T } from 'types/common'
@ -79,14 +80,21 @@ class ReleaseNotesBody extends PureComponent<Props, State> {
return notes.map(note => ( return notes.map(note => (
<Notes mb={6} key={note.tag_name}> <Notes mb={6} key={note.tag_name}>
<Title>{t('app:releaseNotes.version', { versionNb: note.tag_name })}</Title> <Title>{t('app:releaseNotes.version', { versionNb: note.tag_name })}</Title>
<Markdow>{note.body}</Markdow> <Markdown>{note.body}</Markdown>
</Notes> </Notes>
)) ))
} else if (error) { } else if (error) {
return ( return (
<Notes> <Notes>
<Title>{t('app:releaseNotes.version', { versionNb: version })}</Title> <Title>{t('app:releaseNotes.version', { versionNb: version })}</Title>
<Markdow>{t('app:common.error.load')}</Markdow> <Box
style={{ wordWrap: 'break-word' }}
color="alertRed"
ff="Open Sans|SemiBold"
fontSize={3}
>
<TranslatedError error={error} />
</Box>
</Notes> </Notes>
) )
} }

25
src/components/modals/Send/steps/04-step-confirmation.js

@ -49,23 +49,28 @@ export default function StepConfirmation({ t, optimisticOperation, error }: Step
: error : error
? colors.alertRed ? colors.alertRed
: colors.grey : colors.grey
const tPrefix = optimisticOperation
? 'app:send.steps.confirmation.success'
: error
? 'app:send.steps.confirmation.error'
: 'app:send.steps.confirmation.pending'
const translatedErrTitle = error ? <TranslatedError error={error} /> || '' : ''
const translatedErrDesc = error ? <TranslatedError error={error} field="description" /> || '' : ''
return ( return (
<Container> <Container>
<TrackPage category="Send Flow" name="Step 4" /> <TrackPage category="Send Flow" name="Step 4" />
<span style={{ color: iconColor }}> <span style={{ color: iconColor }}>
<Icon size={43} /> <Icon size={43} />
</span> </span>
<Title>{translatedErrTitle || t(`${tPrefix}.title`)}</Title> <Title>
{error ? (
<TranslatedError error={error} />
) : optimisticOperation ? (
t('app:send.steps.confirmation.success.title')
) : (
t('app:send.steps.confirmation.pending.title')
)}
</Title>
<Text style={{ userSelect: 'text' }} color="smoke"> <Text style={{ userSelect: 'text' }} color="smoke">
{optimisticOperation ? multiline(t(`${tPrefix}.text`)) : error ? translatedErrDesc : null} {optimisticOperation ? (
multiline(t('app:send.steps.confirmation.success.text'))
) : error ? (
<TranslatedError error={error} field="description" />
) : null}
</Text> </Text>
</Container> </Container>
) )
@ -109,7 +114,7 @@ export function StepConfirmationFooter({
transitionTo('amount') transitionTo('amount')
}} }}
> >
{t('app:send.steps.confirmation.error.cta')} {t('app:common.retry')}
</Button> </Button>
) : null} ) : null}
</Fragment> </Fragment>

17
static/i18n/en/app.json

@ -51,9 +51,6 @@
"error": "Synchronization error", "error": "Synchronization error",
"refresh": "Refresh", "refresh": "Refresh",
"ago": "Synced {{time}}" "ago": "Synced {{time}}"
},
"error": {
"load": "Unable to load"
} }
}, },
"buttons": { "buttons": {
@ -97,8 +94,7 @@
"advancedLogs": "Advanced logs", "advancedLogs": "Advanced logs",
"accountName": { "accountName": {
"title": "Account name", "title": "Account name",
"desc": "Describe this account", "desc": "Describe this account"
"error": "An account name is required"
}, },
"unit": { "unit": {
"title": "Unit", "title": "Unit",
@ -106,8 +102,7 @@
}, },
"endpointConfig": { "endpointConfig": {
"title": "Node", "title": "Node",
"desc": "The API node to use", "desc": "The API node to use"
"error": "Invalid endpoint"
} }
} }
}, },
@ -339,10 +334,10 @@
"confirmation": { "confirmation": {
"title": "Confirmation", "title": "Confirmation",
"success": { "success": {
"title": "Transaction sent",
"text":
"The transaction has been signed and sent to the network. Your account balance will update once the blockchain has confirmed the transaction.",
"cta": "View operation details" "cta": "View operation details"
},
"error": {
"cta": "Retry"
} }
} }
} }
@ -452,8 +447,6 @@
} }
}, },
"password": { "password": {
"errorMessageIncorrectPassword": "The password you entered is incorrect",
"errorMessageNotMatchingPassword": "Passwords don't match",
"inputFields": { "inputFields": {
"newPassword": { "newPassword": {
"label": "New password" "label": "New password"

20
static/i18n/en/errors.json

@ -3,6 +3,10 @@
"title": "{{message}}", "title": "{{message}}",
"description": "Something went wrong. Please retry or contact us." "description": "Something went wrong. Please retry or contact us."
}, },
"AccountNameRequired": {
"title": "An account name is required",
"description": "Please provide with an account name"
},
"BtcUnmatchedApp": { "BtcUnmatchedApp": {
"title": "That's the wrong app", "title": "That's the wrong app",
"description": "Open the ‘{{managerAppName}}’ app on your device" "description": "Open the ‘{{managerAppName}}’ app on your device"
@ -31,6 +35,10 @@
"title": "Oops, device was disconnected", "title": "Oops, device was disconnected",
"description": "The connection to the device was lost, so please try again." "description": "The connection to the device was lost, so please try again."
}, },
"EnpointConfig": {
"title": "Invalid endpoint",
"description": "Please provide with a valid endpoint"
},
"FeeEstimationFailed": { "FeeEstimationFailed": {
"title": "Sorry, fee estimation failed", "title": "Sorry, fee estimation failed",
"description": "Try setting a custom fee (status: {{status}})" "description": "Try setting a custom fee (status: {{status}})"
@ -93,6 +101,18 @@
"title": "Oops, not enough balance", "title": "Oops, not enough balance",
"description": "Make sure the account to debit has sufficient balance" "description": "Make sure the account to debit has sufficient balance"
}, },
"PasswordsDontMatch": {
"title": "Passwords don't match",
"description": "Please try again"
},
"PasswordIncorrect": {
"title": "The password you entered is incorrect",
"description": "Please try again"
},
"SelectExchangesLoadError": {
"title": "Unable to load",
"description": "Can't load the exchanges"
},
"TimeoutError": { "TimeoutError": {
"title": "Oops, a time out occurred", "title": "Oops, a time out occurred",
"description": "It took too long for the server to respond." "description": "It took too long for the server to respond."

Loading…
Cancel
Save