From c8e99036f557038c1579c8cb9191b20026256d8c Mon Sep 17 00:00:00 2001 From: ledger-bot <37080477+ledger-bot@users.noreply.github.com> Date: Tue, 19 Jun 2018 14:14:54 +0200 Subject: [PATCH 01/60] New translations app.yml (French) --- static/i18n/fr/app.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/i18n/fr/app.yml b/static/i18n/fr/app.yml index b04103c1..b98f23bf 100644 --- a/static/i18n/fr/app.yml +++ b/static/i18n/fr/app.yml @@ -79,6 +79,10 @@ account: unit: title: Unit desc: Lorem ipsum dolort amet + endpointConfig: + title: Node + desc: The API node to use + error: Invalid endpoint dashboard: title: Dashboard accounts: From 532393fbc5cae8bb185dc263eea826b1fb678c57 Mon Sep 17 00:00:00 2001 From: ledger-bot <37080477+ledger-bot@users.noreply.github.com> Date: Tue, 19 Jun 2018 14:14:55 +0200 Subject: [PATCH 02/60] New translations errors.yml (French) --- static/i18n/fr/errors.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/i18n/fr/errors.yml b/static/i18n/fr/errors.yml index 3a00f039..c8209f96 100644 --- a/static/i18n/fr/errors.yml +++ b/static/i18n/fr/errors.yml @@ -17,3 +17,8 @@ LedgerAPIError: 'A problem occurred with Ledger API. Please try again later. (HT NetworkDown: 'Your internet connection seems down. Please try again later.' NoAddressesFound: 'No accounts found' UserRefusedOnDevice: Transaction have been aborted +WebsocketConnectionError: An error occurred with the socket connection +WebsocketConnectionFailed: Failed to establish a socket connection +DeviceSocketFail: Device socket failure +DeviceSocketNoBulkStatus: Device socket failure (bulk) +DeviceSocketNoHandler: Device socket failure (handler {{query}}) From 6b5b262cc088d2ea2429bb7b36239c52a0d6de6a Mon Sep 17 00:00:00 2001 From: ledger-bot <37080477+ledger-bot@users.noreply.github.com> Date: Tue, 19 Jun 2018 14:14:56 +0200 Subject: [PATCH 03/60] New translations language.yml (French) --- static/i18n/fr/language.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/i18n/fr/language.yml b/static/i18n/fr/language.yml index 1eb9d4d1..0e320439 100644 --- a/static/i18n/fr/language.yml +++ b/static/i18n/fr/language.yml @@ -1,3 +1,3 @@ --- -en: Anglais -fr: Français +en: English +fr: French From d54a3fb832813bb6dd517835e4b8e8ad2ff5b346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 14:59:03 +0200 Subject: [PATCH 04/60] fix ripple scan to show twice a New Account proposal --- src/bridge/RippleJSBridge.js | 37 +++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/bridge/RippleJSBridge.js b/src/bridge/RippleJSBridge.js index a8fb4621..e1016654 100644 --- a/src/bridge/RippleJSBridge.js +++ b/src/bridge/RippleJSBridge.js @@ -256,6 +256,7 @@ const RippleJSBridge: WalletBridge = { const derivations = getDerivations(currency) for (const derivation of derivations) { + const legacy = derivation !== derivations[derivations.length - 1] for (let index = 0; index < 255; index++) { const freshAddressPath = derivation({ currency, x: index, segwit: false }) const { address } = await await getAddress @@ -280,22 +281,24 @@ const RippleJSBridge: WalletBridge = { if (!info) { // account does not exist in Ripple server // we are generating a new account locally - next({ - id: accountId, - xpub: '', - name: getNewAccountPlaceholderName(currency, index), - freshAddress, - freshAddressPath, - balance: 0, - blockHeight: maxLedgerVersion, - index, - currency, - operations: [], - pendingOperations: [], - unit: currency.units[0], - archived: false, - lastSyncDate: new Date(), - }) + if (!legacy) { + next({ + id: accountId, + xpub: '', + name: getNewAccountPlaceholderName(currency, index), + freshAddress, + freshAddressPath, + balance: 0, + blockHeight: maxLedgerVersion, + index, + currency, + operations: [], + pendingOperations: [], + unit: currency.units[0], + archived: false, + lastSyncDate: new Date(), + }) + } break } @@ -315,7 +318,7 @@ const RippleJSBridge: WalletBridge = { const account: $Exact = { id: accountId, xpub: '', - name: getAccountPlaceholderName(currency, index), + name: getAccountPlaceholderName(currency, index, legacy), freshAddress, freshAddressPath, balance, From 5adf9d7c716a47e403b75ae99a3eec66e47b83ab Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 15:06:03 +0200 Subject: [PATCH 05/60] Fix empty state text for add account --- src/components/modals/AddAccounts/steps/03-step-import.js | 2 +- static/i18n/en/app.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/modals/AddAccounts/steps/03-step-import.js b/src/components/modals/AddAccounts/steps/03-step-import.js index 4573e6a8..e148a7ab 100644 --- a/src/components/modals/AddAccounts/steps/03-step-import.js +++ b/src/components/modals/AddAccounts/steps/03-step-import.js @@ -161,7 +161,7 @@ class StepImport extends PureComponent { }) const importableAccountsEmpty = t('app:addAccounts.noAccountToImport', { - currencyName: currency ? ` ${currency.name}}` : '', + currencyName: currency ? ` ${currency.name}` : '', }) return ( diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 293005ae..f45ddfe1 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -138,7 +138,7 @@ addAccounts: editName: Edit name newAccount: New account legacyAccount: '{{accountName}} (legacy)' - noAccountToImport: We didnt find any {{currencyName}}} account to import. + noAccountToImport: We didnt find any {{currencyName}} account to import. success: Great success! createNewAccount: title: Create new account From 28feb3ead2b3a02bb95eb23faa8e499aef8f4a9a Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 15:10:03 +0200 Subject: [PATCH 06/60] Hide top bar vertical bar when no accounts --- src/components/TopBar/ActivityIndicator.js | 55 +++++++++------------- src/components/TopBar/index.js | 17 +++++-- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/src/components/TopBar/ActivityIndicator.js b/src/components/TopBar/ActivityIndicator.js index a2c9ff31..fb7b1e58 100644 --- a/src/components/TopBar/ActivityIndicator.js +++ b/src/components/TopBar/ActivityIndicator.js @@ -10,7 +10,6 @@ import type { T } from 'types/common' import type { AsyncState } from 'reducers/bridgeSync' import { globalSyncStateSelector } from 'reducers/bridgeSync' -import { hasAccountsSelector } from 'reducers/accounts' import { BridgeSyncConsumer } from 'bridge/BridgeSyncContext' import CounterValues from 'helpers/countervalues' @@ -23,7 +22,6 @@ import ItemContainer from './ItemContainer' const mapStateToProps = createStructuredSelector({ globalSyncState: globalSyncStateSelector, - hasAccounts: hasAccountsSelector, }) type Props = { @@ -128,37 +126,28 @@ class ActivityIndicatorInner extends PureComponent { } } -const ActivityIndicator = ({ - globalSyncState, - hasAccounts, - t, -}: { - globalSyncState: AsyncState, - hasAccounts: boolean, - t: T, -}) => - !hasAccounts ? null : ( - - {setSyncBehavior => ( - - {cvPolling => { - const isPending = cvPolling.pending || globalSyncState.pending - const isError = cvPolling.error || globalSyncState.error - return ( - - ) - }} - - )} - - ) +const ActivityIndicator = ({ globalSyncState, t }: { globalSyncState: AsyncState, t: T }) => ( + + {setSyncBehavior => ( + + {cvPolling => { + const isPending = cvPolling.pending || globalSyncState.pending + const isError = cvPolling.error || globalSyncState.error + return ( + + ) + }} + + )} + +) export default compose( translate(), diff --git a/src/components/TopBar/index.js b/src/components/TopBar/index.js index 11b4bd1c..13d88557 100644 --- a/src/components/TopBar/index.js +++ b/src/components/TopBar/index.js @@ -12,6 +12,7 @@ import type { T } from 'types/common' import { lock } from 'reducers/application' import { hasPassword } from 'reducers/settings' +import { hasAccountsSelector } from 'reducers/accounts' import { openModal } from 'reducers/modals' import IconLock from 'icons/Lock' @@ -54,6 +55,7 @@ const Bar = styled.div` const mapStateToProps = state => ({ hasPassword: hasPassword(state), + hasAccounts: hasAccountsSelector(state), }) const mapDispatchToProps = { @@ -63,6 +65,7 @@ const mapDispatchToProps = { type Props = { hasPassword: boolean, + hasAccounts: boolean, history: RouterHistory, location: Location, lock: Function, @@ -91,17 +94,21 @@ class TopBar extends PureComponent { } } render() { - const { hasPassword, t } = this.props + const { hasPassword, hasAccounts, t } = this.props return ( - - - - + {hasAccounts && ( + + + + + + + )} t('app:settings.title')}> From 94dea24d2dc1ccff53acde16bcd582bcda7adba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 15:11:52 +0200 Subject: [PATCH 07/60] Fix a rendering bug when you send coin from an account to another --- src/components/OperationsList/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/OperationsList/index.js b/src/components/OperationsList/index.js index 92aacc4d..6fdcece6 100644 --- a/src/components/OperationsList/index.js +++ b/src/components/OperationsList/index.js @@ -119,7 +119,7 @@ export class OperationsList extends PureComponent { Date: Tue, 19 Jun 2018 15:20:37 +0200 Subject: [PATCH 08/60] Bugfix TranslatedError to crash the app in some error cases --- src/components/TranslatedError.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/TranslatedError.js b/src/components/TranslatedError.js index 7cb125ca..0fea7a3d 100644 --- a/src/components/TranslatedError.js +++ b/src/components/TranslatedError.js @@ -4,6 +4,7 @@ // - an error can have parameters, to use them, just use field of the Error object, that's what we give to `t()` // - returned value is intentially not styled (is universal). wrap this in whatever you need +import logger from 'logger' import { PureComponent } from 'react' import { translate } from 'react-i18next' import type { T } from 'types/common' @@ -18,7 +19,12 @@ class TranslatedError extends PureComponent { const { t, error } = this.props if (!error) return null if (typeof error === 'string') return error - return t(`errors:${error.name}`, error) + const translation = t(`errors:${error.name}`, error) + if (translation) { + return translation + } + logger.warn('TranslatedError: no transation!', error.name, error) + return error.message || error.name || '' } } From 01a913aadee4384e07c4817bb95588fa8bd3d13d Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 15:42:15 +0200 Subject: [PATCH 09/60] Adjust the Selects empty option texts --- src/components/SelectAccount/index.js | 3 +++ src/components/SelectCurrency/index.js | 3 +++ src/components/SelectExchange.js | 4 ++++ src/components/SettingsPage/sections/Display.js | 2 +- static/i18n/en/app.yml | 4 ++++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/components/SelectAccount/index.js b/src/components/SelectAccount/index.js index 3c1fe001..7e683cd9 100644 --- a/src/components/SelectAccount/index.js +++ b/src/components/SelectAccount/index.js @@ -69,6 +69,9 @@ const RawSelectAccount = ({ accounts, onChange, value, t, ...props }: Props) => renderValue={renderOption} renderOption={renderOption} placeholder={t('app:common.selectAccount')} + noOptionsMessage={({ inputValue }) => + t('app:common.selectAccountNoOption', { accountName: inputValue }) + } onChange={onChange} /> ) diff --git a/src/components/SelectCurrency/index.js b/src/components/SelectCurrency/index.js index 3d23dd91..6c7d9a54 100644 --- a/src/components/SelectCurrency/index.js +++ b/src/components/SelectCurrency/index.js @@ -40,6 +40,9 @@ const SelectCurrency = ({ onChange, value, t, placeholder, currencies, ...props renderValue={renderOption} options={options} placeholder={placeholder || t('app:common.selectCurrency')} + noOptionsMessage={({ inputValue }: { inputValue: string }) => + t('app:common.selectCurrencyNoOption', { currencyName: inputValue }) + } onChange={item => onChange(item ? item.currency : null)} {...props} /> diff --git a/src/components/SelectExchange.js b/src/components/SelectExchange.js index 168d509e..93c76db9 100644 --- a/src/components/SelectExchange.js +++ b/src/components/SelectExchange.js @@ -93,6 +93,10 @@ class SelectExchange extends Component< options={options} onChange={onChange} isLoading={options.length === 0} + placeholder={t('app:common.selectExchange')} + noOptionsMessage={({ inputValue }) => + t('app:common.selectExchangeNoOption', { exchangeName: inputValue }) + } {...props} /> ) diff --git a/src/components/SettingsPage/sections/Display.js b/src/components/SettingsPage/sections/Display.js index 1b3bd457..0a19b62a 100644 --- a/src/components/SettingsPage/sections/Display.js +++ b/src/components/SettingsPage/sections/Display.js @@ -169,7 +169,7 @@ class TabProfile extends PureComponent { to={counterValueCurrency} exchangeId={counterValueExchange} onChange={this.handleChangeExchange} - minWidth={150} + minWidth={200} /> diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index f45ddfe1..000c43a3 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -11,7 +11,11 @@ common: chooseWalletPlaceholder: Choose a wallet... currency: Currency selectAccount: Select an account + selectAccountNoOption: 'No account matching "{{accountName}}"' selectCurrency: Select a currency + selectCurrencyNoOption: 'No currency matching "{{currencyName}}"' + selectExchange: Select an exchange + selectExchangeNoOption: 'No exchange matching "{{exchangeName}}"' sortBy: Sort by search: Search save: Save From d921791da241bed7d2de17b07505c89f1889c635 Mon Sep 17 00:00:00 2001 From: Thibaut Boustany Date: Tue, 19 Jun 2018 15:46:52 +0200 Subject: [PATCH 10/60] =?UTF-8?q?Awesome=20new=20icon=20=F0=9F=98=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/icon.icns | Bin 26586 -> 0 bytes build/icon.ico | Bin 103756 -> 0 bytes build/icon.png | Bin 3849 -> 137916 bytes build/icons/512x512.png | Bin 3849 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 build/icon.icns delete mode 100644 build/icon.ico delete mode 100644 build/icons/512x512.png diff --git a/build/icon.icns b/build/icon.icns deleted file mode 100644 index e5e51d5cc2921bf55a104494939d3f9b145dffbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26586 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 literal 3849 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 diff --git a/build/icons/512x512.png b/build/icons/512x512.png deleted file mode 100644 index 314953dd7a112de285f841a24e0ad2e93d39db59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3849 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 From 93cc431a24113fb6445b43df2f7d8a3efbd5e551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 15:54:09 +0200 Subject: [PATCH 11/60] initial version of a Placeholder for when no countervalues loaded yet --- src/components/AccountPage/index.js | 10 +- src/components/BalanceSummary/BalanceInfos.js | 95 ++++++++++++------- src/components/BalanceSummary/index.js | 95 ++++++++++--------- src/components/DashboardPage/index.js | 9 +- src/components/Placeholder.js | 9 ++ src/config/constants.js | 4 + src/helpers/countervalues.js | 3 +- 7 files changed, 141 insertions(+), 84 deletions(-) create mode 100644 src/components/Placeholder.js diff --git a/src/components/AccountPage/index.js b/src/components/AccountPage/index.js index 5aadb530..4ea52c02 100644 --- a/src/components/AccountPage/index.js +++ b/src/components/AccountPage/index.js @@ -148,10 +148,14 @@ class AccountPage extends PureComponent { counterValue={counterValue} daysCount={daysCount} selectedTimeRange={selectedTimeRange} - renderHeader={({ totalBalance, sinceBalance, refBalance }) => ( + renderHeader={({ isAvailable, totalBalance, sinceBalance, refBalance }) => ( - + { { since={selectedTimeRange} /> - - {t(`app:time.since.${since}`)} + {!isAvailable ? ( + + ) : ( + + )} + {!isAvailable ? ( + + ) : ( + {t(`app:time.since.${since}`)} + )} ) } export function BalanceSinceDiff(props: Props) { - const { t, totalBalance, sinceBalance, since, counterValue, ...otherProps } = props + const { t, totalBalance, sinceBalance, since, counterValue, isAvailable, ...otherProps } = props return ( - - {t(`app:time.since.${since}`)} + {!isAvailable ? ( + + ) : ( + + )} + {!isAvailable ? ( + + ) : ( + {t(`app:time.since.${since}`)} + )} ) } export function BalanceTotal(props: BalanceTotalProps) { - const { unit, totalBalance, children } = props + const { unit, totalBalance, isAvailable, children } = props return ( - - {children} + {!isAvailable ? ( + + ) : ( + + )} + {!isAvailable ? : children} ) } @@ -93,16 +116,21 @@ BalanceTotal.defaultProps = { } function BalanceInfos(props: Props) { - const { t, totalBalance, since, sinceBalance, refBalance, counterValue } = props + const { t, totalBalance, since, sinceBalance, refBalance, isAvailable, counterValue } = props return ( - + {t('app:dashboard.totalBalance')} *, } @@ -37,54 +38,54 @@ const BalanceSummary = ({ return ( - {({ isAvailable, balanceHistory, balanceStart, balanceEnd }) => - !isAvailable ? null : ( - - {renderHeader ? ( - - {renderHeader({ - selectedTimeRange, - // FIXME refactor these - totalBalance: balanceEnd, - sinceBalance: balanceStart, - refBalance: balanceStart, - })} - - ) : null} - - formatShort(counterValue.units[0], val)} - renderTooltip={ - isAvailable && !account - ? d => ( - - - - {d.date.toISOString().substr(0, 10)} - - - ) - : undefined - } - /> + {({ isAvailable, balanceHistory, balanceStart, balanceEnd }) => ( + + {renderHeader ? ( + + {renderHeader({ + isAvailable, + selectedTimeRange, + // FIXME refactor these + totalBalance: balanceEnd, + sinceBalance: balanceStart, + refBalance: balanceStart, + })} - - ) - } + ) : null} + + formatShort(counterValue.units[0], val)} + isInteractive={isAvailable} + renderTooltip={ + isAvailable && !account + ? d => ( + + + + {d.date.toISOString().substr(0, 10)} + + + ) + : undefined + } + /> + + + )} ) diff --git a/src/components/DashboardPage/index.js b/src/components/DashboardPage/index.js index 4267a429..c92116ce 100644 --- a/src/components/DashboardPage/index.js +++ b/src/components/DashboardPage/index.js @@ -120,10 +120,17 @@ class DashboardPage extends PureComponent { accounts={accounts} selectedTimeRange={selectedTimeRange} daysCount={daysCount} - renderHeader={({ totalBalance, selectedTimeRange, sinceBalance, refBalance }) => ( + renderHeader={({ + isAvailable, + totalBalance, + selectedTimeRange, + sinceBalance, + refBalance, + }) => ( (p.dark ? '#C2C2C2' : '#D6D6D6')}; + width: ${p => p.width}px; + height: 10px; + border-radius: 5px; + margin: 5px 0; +` diff --git a/src/config/constants.js b/src/config/constants.js index 74ca72ef..51a9637b 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -29,6 +29,10 @@ export const DEVICE_DISCONNECT_DEBOUNCE = intFromEnv('LEDGER_DEVICE_DISCONNECT_D // Endpoints... +export const LEDGER_COUNTERVALUES_API = stringFromEnv( + 'LEDGER_COUNTERVALUES_API', + 'https://ledger-countervalue-poc.herokuapp.com', +) export const LEDGER_REST_API_BASE = stringFromEnv( 'LEDGER_REST_API_BASE', 'https://api.ledgerwallet.com/', diff --git a/src/helpers/countervalues.js b/src/helpers/countervalues.js index a6671bcf..7f8801b1 100644 --- a/src/helpers/countervalues.js +++ b/src/helpers/countervalues.js @@ -1,6 +1,7 @@ // @flow import { createSelector } from 'reselect' +import { LEDGER_COUNTERVALUES_API } from 'config/constants' import createCounterValues from '@ledgerhq/live-common/lib/countervalues' import { setExchangePairsAction } from 'actions/settings' import { currenciesSelector } from 'reducers/accounts' @@ -53,7 +54,7 @@ const addExtraPollingHooks = (schedulePoll, cancelPoll) => { const CounterValues = createCounterValues({ log: (...args) => logger.log('CounterValues:', ...args), - getAPIBaseURL: () => 'https://ledger-countervalue-poc.herokuapp.com', + getAPIBaseURL: () => LEDGER_COUNTERVALUES_API, storeSelector: state => state.countervalues, pairsSelector, setExchangePairsAction, From 74fb9d0db18f052b127f187e25e328378f7901a2 Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 16:06:41 +0200 Subject: [PATCH 12/60] Cleanify the AccountPage settings button --- src/components/AccountPage/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/AccountPage/index.js b/src/components/AccountPage/index.js index 5aadb530..469ea436 100644 --- a/src/components/AccountPage/index.js +++ b/src/components/AccountPage/index.js @@ -129,11 +129,9 @@ class AccountPage extends PureComponent { )} t('app:account.settings.title')}> openModal(MODAL_SETTINGS_ACCOUNT, { account })}> - + + + From 57b0f3464e9ced866319338ced7a27c3f9d9fa09 Mon Sep 17 00:00:00 2001 From: Thibaut Boustany Date: Tue, 19 Jun 2018 16:18:51 +0200 Subject: [PATCH 13/60] Save pubkey for Ripple and Ethereum accounts --- src/bridge/EthereumJSBridge.js | 4 ++-- src/bridge/RippleJSBridge.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bridge/EthereumJSBridge.js b/src/bridge/EthereumJSBridge.js index 8bf3006e..7bf2854f 100644 --- a/src/bridge/EthereumJSBridge.js +++ b/src/bridge/EthereumJSBridge.js @@ -170,7 +170,7 @@ const EthereumBridge: WalletBridge = { async function stepAddress( index, - { address, path: freshAddressPath }, + { address, path: freshAddressPath, publicKey }, isStandard, ): { account?: Account, complete?: boolean } { const balance = await api.getAccountBalance(address) @@ -181,7 +181,7 @@ const EthereumBridge: WalletBridge = { if (finished) return { complete: true } const freshAddress = address - const accountId = `ethereumjs:${currency.id}:${address}` + const accountId = `ethereumjs:${currency.id}:${address}:${publicKey}` if (txs.length === 0) { // this is an empty account diff --git a/src/bridge/RippleJSBridge.js b/src/bridge/RippleJSBridge.js index a8fb4621..f3ebb0cd 100644 --- a/src/bridge/RippleJSBridge.js +++ b/src/bridge/RippleJSBridge.js @@ -258,12 +258,12 @@ const RippleJSBridge: WalletBridge = { for (const derivation of derivations) { for (let index = 0; index < 255; index++) { const freshAddressPath = derivation({ currency, x: index, segwit: false }) - const { address } = await await getAddress + const { address, publicKey } = await await getAddress .send({ currencyId: currency.id, devicePath: deviceId, path: freshAddressPath }) .toPromise() if (finished) return - const accountId = `ripplejs:${currency.id}:${address}` + const accountId = `ripplejs:${currency.id}:${address}:${publicKey}` let info try { From 3c43e899faded47d264439a6244f00dcadd855d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 16:18:54 +0200 Subject: [PATCH 14/60] placeholder for graph --- src/components/BalanceSummary/index.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/components/BalanceSummary/index.js b/src/components/BalanceSummary/index.js index dc813ae5..4a84fd9e 100644 --- a/src/components/BalanceSummary/index.js +++ b/src/components/BalanceSummary/index.js @@ -56,12 +56,25 @@ const BalanceSummary = ({ ({ + ...i, + value: + 10000 * + (1 + + 0.1 * Math.sin(i.date * Math.cos(i.date)) + // random-ish + 0.5 * Math.cos(i.date / 2000000000 + Math.sin(i.date / 1000000000))), // general curve trend + })) + } height={200} currency={counterValue} tickXScale={selectedTimeRange} - renderTickY={val => formatShort(counterValue.units[0], val)} + renderTickY={ + isAvailable ? val => formatShort(counterValue.units[0], val) : () => '' + } isInteractive={isAvailable} renderTooltip={ isAvailable && !account From 34b30c56817824d6d079107876a70999ca181ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 16:28:02 +0200 Subject: [PATCH 15/60] Fix errors --- src/components/TranslatedError.js | 2 +- static/i18n/en/errors.yml | 9 +++++---- static/i18n/fr/errors.yml | 13 +++++-------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/components/TranslatedError.js b/src/components/TranslatedError.js index 0fea7a3d..d9d3f8b5 100644 --- a/src/components/TranslatedError.js +++ b/src/components/TranslatedError.js @@ -24,7 +24,7 @@ class TranslatedError extends PureComponent { return translation } logger.warn('TranslatedError: no transation!', error.name, error) - return error.message || error.name || '' + return error.message || error.name || t('errors:generic') } } diff --git a/static/i18n/en/errors.yml b/static/i18n/en/errors.yml index 456fc91a..8f853eb0 100644 --- a/static/i18n/en/errors.yml +++ b/static/i18n/en/errors.yml @@ -1,7 +1,8 @@ -RangeError: {{message}} -Error: {{message}} -LedgerAPIErrorWithMessage: {{message}} -TransportStatusError: {{message}} +generic: An error occurred +RangeError: '{{message}}' +Error: '{{message}}' +LedgerAPIErrorWithMessage: '{{message}}' +TransportStatusError: '{{message}}' FeeEstimationFailed: 'fee estimation failed (status: {{status}})' NotEnoughBalance: 'Not enough balance' BtcUnmatchedApp: 'You must open application ‘{{currencyName}}’ on the device' diff --git a/static/i18n/fr/errors.yml b/static/i18n/fr/errors.yml index 3a00f039..cc7c183b 100644 --- a/static/i18n/fr/errors.yml +++ b/static/i18n/fr/errors.yml @@ -1,12 +1,9 @@ --- -RangeError: - - message -Error: - - message -LedgerAPIErrorWithMessage: - - message -TransportStatusError: - - message +generic: An error occurred +RangeError: '{{message}}' +Error: '{{message}}' +LedgerAPIErrorWithMessage: '{{message}}' +TransportStatusError: '{{message}}' FeeEstimationFailed: 'fee estimation failed (status: {{status}})' NotEnoughBalance: 'Not enough balance' BtcUnmatchedApp: 'You must open application ‘{{currencyName}}’ on the device' From d2fe8c5ff2fc37992c6a08a9e85c62ec7a9aeef4 Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 16:37:33 +0200 Subject: [PATCH 16/60] Ability to import accounts even if sync is not finished yet --- src/components/modals/AddAccounts/steps/03-step-import.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/modals/AddAccounts/steps/03-step-import.js b/src/components/modals/AddAccounts/steps/03-step-import.js index e148a7ab..3823acad 100644 --- a/src/components/modals/AddAccounts/steps/03-step-import.js +++ b/src/components/modals/AddAccounts/steps/03-step-import.js @@ -246,11 +246,12 @@ export const StepImportFooter = ({ const willClose = !willCreateAccount && !willAddAccounts const onClick = willClose ? onCloseModal : onClickAdd + const hasCheckedAccounts = !!checkedAccountsIds.length return ( {currency && } - From a4bab020ecd3b149060f176e271a91f8ee1d426d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 17:29:56 +0200 Subject: [PATCH 17/60] Add timeout for genuine and sync --- src/bridge/BridgeSyncContext.js | 37 +++++++++++++++--------- src/components/Workflow/EnsureGenuine.js | 3 ++ src/config/constants.js | 2 ++ static/i18n/en/errors.yml | 1 + 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/bridge/BridgeSyncContext.js b/src/bridge/BridgeSyncContext.js index 83f71842..dcba6613 100644 --- a/src/bridge/BridgeSyncContext.js +++ b/src/bridge/BridgeSyncContext.js @@ -6,6 +6,7 @@ import invariant from 'invariant' import logger from 'logger' import shuffle from 'lodash/shuffle' +import { timeout } from 'rxjs/operators/timeout' import React, { Component } from 'react' import priorityQueue from 'async/priorityQueue' import { connect } from 'react-redux' @@ -16,7 +17,12 @@ import { setAccountSyncState } from 'actions/bridgeSync' import { bridgeSyncSelector, syncStateLocalSelector } from 'reducers/bridgeSync' import type { BridgeSyncState } from 'reducers/bridgeSync' import { accountsSelector } from 'reducers/accounts' -import { SYNC_BOOT_DELAY, SYNC_ALL_INTERVAL, SYNC_MAX_CONCURRENT } from 'config/constants' +import { + SYNC_BOOT_DELAY, + SYNC_ALL_INTERVAL, + SYNC_MAX_CONCURRENT, + SYNC_TIMEOUT, +} from 'config/constants' import { getBridgeForCurrency } from '.' type BridgeSyncProviderProps = { @@ -73,19 +79,22 @@ class Provider extends Component { this.props.setAccountSyncState(accountId, { pending: true, error: null }) // TODO use Subscription to unsubscribe at relevant time - bridge.synchronize(account).subscribe({ - next: accountUpdater => { - this.props.updateAccountWithUpdater(accountId, accountUpdater) - }, - complete: () => { - this.props.setAccountSyncState(accountId, { pending: false, error: null }) - next() - }, - error: error => { - this.props.setAccountSyncState(accountId, { pending: false, error }) - next() - }, - }) + bridge + .synchronize(account) + .pipe(timeout(SYNC_TIMEOUT)) + .subscribe({ + next: accountUpdater => { + this.props.updateAccountWithUpdater(accountId, accountUpdater) + }, + complete: () => { + this.props.setAccountSyncState(accountId, { pending: false, error: null }) + next() + }, + error: error => { + this.props.setAccountSyncState(accountId, { pending: false, error }) + next() + }, + }) } const syncQueue = priorityQueue(synchronize, SYNC_MAX_CONCURRENT) diff --git a/src/components/Workflow/EnsureGenuine.js b/src/components/Workflow/EnsureGenuine.js index 831d60c8..42cb971d 100644 --- a/src/components/Workflow/EnsureGenuine.js +++ b/src/components/Workflow/EnsureGenuine.js @@ -1,7 +1,9 @@ // @flow +import { timeout } from 'rxjs/operators/timeout' import { PureComponent } from 'react' import isEqual from 'lodash/isEqual' +import { GENUINE_TIMEOUT } from 'config/constants' import type { Device } from 'types/common' import getIsGenuine from 'commands/getIsGenuine' @@ -60,6 +62,7 @@ class EnsureGenuine extends PureComponent { try { const res = await getIsGenuine .send({ devicePath: device.path, targetId: infos.targetId }) + .pipe(timeout(GENUINE_TIMEOUT)) .toPromise() if (this._unmounting) return const isGenuine = res === '0000' diff --git a/src/config/constants.js b/src/config/constants.js index 51a9637b..5e5f8b09 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -20,6 +20,8 @@ export const GET_CALLS_RETRY = intFromEnv('GET_CALLS_RETRY', 2) export const SYNC_MAX_CONCURRENT = intFromEnv('LEDGER_SYNC_MAX_CONCURRENT', 6) export const SYNC_BOOT_DELAY = 2 * 1000 export const SYNC_ALL_INTERVAL = 60 * 1000 +export const GENUINE_TIMEOUT = intFromEnv('GENUINE_TIMEOUT', 60 * 1000) +export const SYNC_TIMEOUT = intFromEnv('SYNC_TIMEOUT', 30 * 1000) export const CHECK_APP_INTERVAL_WHEN_INVALID = 600 export const CHECK_APP_INTERVAL_WHEN_VALID = 1200 diff --git a/static/i18n/en/errors.yml b/static/i18n/en/errors.yml index 8f853eb0..2d542878 100644 --- a/static/i18n/en/errors.yml +++ b/static/i18n/en/errors.yml @@ -3,6 +3,7 @@ RangeError: '{{message}}' Error: '{{message}}' LedgerAPIErrorWithMessage: '{{message}}' TransportStatusError: '{{message}}' +TimeoutError: 'Timeout reached' FeeEstimationFailed: 'fee estimation failed (status: {{status}})' NotEnoughBalance: 'Not enough balance' BtcUnmatchedApp: 'You must open application ‘{{currencyName}}’ on the device' From 5cc2c8ae51fd4337ca5abc081048d33e8123e6f9 Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 17:33:10 +0200 Subject: [PATCH 18/60] Ability to cancel sync when adding accounts --- .../AddAccounts/steps/03-step-import.js | 42 +++++++++++++++---- static/i18n/en/app.yml | 2 + 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/components/modals/AddAccounts/steps/03-step-import.js b/src/components/modals/AddAccounts/steps/03-step-import.js index 3823acad..bc411a96 100644 --- a/src/components/modals/AddAccounts/steps/03-step-import.js +++ b/src/components/modals/AddAccounts/steps/03-step-import.js @@ -8,6 +8,7 @@ import uniq from 'lodash/uniq' import { getBridgeForCurrency } from 'bridge' import Box from 'components/base/Box' +import FakeLink from 'components/base/FakeLink' import CurrencyBadge from 'components/base/CurrencyBadge' import Button from 'components/base/Button' import AccountsList from 'components/base/AccountsList' @@ -20,13 +21,26 @@ class StepImport extends PureComponent { this.startScanAccountsDevice() } - componentWillUnmount() { - if (this.scanSubscription) { - this.scanSubscription.unsubscribe() + componentDidUpdate(prevProps: StepProps) { + // handle case when we click on stop sync + if (prevProps.scanStatus !== 'finished' && this.props.scanStatus === 'finished') { + this.unsub() } } + componentWillUnmount() { + this.unsub() + } + scanSubscription = null + _unsubscribed = false + + unsub = () => { + if (this.scanSubscription && !this._unsubscribed) { + this.scanSubscription.unsubscribe() + this._unsubscribed = true + } + } translateName(account: Account) { const { t } = this.props @@ -142,6 +156,8 @@ class StepImport extends PureComponent { t, } = this.props + const currencyName = currency ? currency.name : '' + const importableAccounts = scannedAccounts.filter(acc => { if (acc.operations.length <= 0) { return false @@ -160,9 +176,8 @@ class StepImport extends PureComponent { count: importableAccounts.length, }) - const importableAccountsEmpty = t('app:addAccounts.noAccountToImport', { - currencyName: currency ? ` ${currency.name}` : '', - }) + const importableAccountsEmpty = t('app:addAccounts.noAccountToImport', { currencyName }) + const hasAlreadyEmptyAccount = scannedAccounts.some(a => a.operations.length === 0) return ( @@ -180,7 +195,11 @@ class StepImport extends PureComponent { /> { export default StepImport export const StepImportFooter = ({ + setState, scanStatus, onClickAdd, onCloseModal, @@ -246,12 +266,16 @@ export const StepImportFooter = ({ const willClose = !willCreateAccount && !willAddAccounts const onClick = willClose ? onCloseModal : onClickAdd - const hasCheckedAccounts = !!checkedAccountsIds.length return ( {currency && } - diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 000c43a3..b190b2be 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -143,10 +143,12 @@ addAccounts: newAccount: New account legacyAccount: '{{accountName}} (legacy)' noAccountToImport: We didnt find any {{currencyName}} account to import. + cancelSync: Stop synchronization success: Great success! createNewAccount: title: Create new account noOperationOnLastAccount: You cannot create a new account because your last account has no operations + noAccountToCreate: We didnt find any {{currencyName}} account to create. retrySync: Retry sync cta: create: 'Create account' From b74a40b9c1f820c4289e8127be3fb512e11d1ced Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 18:25:48 +0200 Subject: [PATCH 19/60] Update default button hover & active styles --- src/components/base/Button/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/base/Button/index.js b/src/components/base/Button/index.js index dc7f2515..8953eb31 100644 --- a/src/components/base/Button/index.js +++ b/src/components/base/Button/index.js @@ -16,8 +16,12 @@ type Style = any // FIXME const buttonStyles: { [_: string]: Style } = { default: { default: noop, - active: noop, - hover: noop, + active: p => ` + background: ${rgba(p.theme.colors.fog, 0.3)}; + `, + hover: p => ` + background: ${rgba(p.theme.colors.fog, 0.2)}; + `, focus: () => ` box-shadow: ${focusedShadowStyle}; `, From 4a9912281cc3922b705f446b5266e3a926a43e62 Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 18:30:05 +0200 Subject: [PATCH 20/60] Refactor retry on add account fail --- .../AddAccounts/steps/03-step-import.js | 66 ++++++++++++++----- static/i18n/en/app.yml | 2 +- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/components/modals/AddAccounts/steps/03-step-import.js b/src/components/modals/AddAccounts/steps/03-step-import.js index bc411a96..bf894775 100644 --- a/src/components/modals/AddAccounts/steps/03-step-import.js +++ b/src/components/modals/AddAccounts/steps/03-step-import.js @@ -8,11 +8,10 @@ import uniq from 'lodash/uniq' import { getBridgeForCurrency } from 'bridge' import Box from 'components/base/Box' -import FakeLink from 'components/base/FakeLink' import CurrencyBadge from 'components/base/CurrencyBadge' import Button from 'components/base/Button' import AccountsList from 'components/base/AccountsList' -import IconExchange from 'icons/Exchange' +import IconExclamationCircleThin from 'icons/ExclamationCircleThin' import type { StepProps } from '../index' @@ -26,6 +25,11 @@ class StepImport extends PureComponent { if (prevProps.scanStatus !== 'finished' && this.props.scanStatus === 'finished') { this.unsub() } + + // handle case when we click on retry sync + if (prevProps.scanStatus !== 'scanning' && this.props.scanStatus === 'scanning') { + this.startScanAccountsDevice() + } } componentWillUnmount() { @@ -71,8 +75,12 @@ class StepImport extends PureComponent { setState({ scanStatus: 'scanning' }) + this._unsubscribed = false this.scanSubscription = bridge.scanAccountsOnDevice(currency, devicePath, { next: account => { + // FIXME: this is called even if we unsubscribed + if (this._unsubscribed) return + const { scannedAccounts, checkedAccountsIds, existingAccounts } = this.props const hasAlreadyBeenScanned = !!scannedAccounts.find(a => account.id === a.id) const hasAlreadyBeenImported = !!existingAccounts.find(a => account.id === a.id) @@ -87,8 +95,16 @@ class StepImport extends PureComponent { }) } }, - complete: () => setState({ scanStatus: 'finished' }), - error: err => setState({ scanStatus: 'error', err }), + complete: () => { + // FIXME: this is called even if we unsubscribed + if (this._unsubscribed) return + setState({ scanStatus: 'finished' }) + }, + error: err => { + // FIXME: this is called even if we unsubscribed + if (this._unsubscribed) return + setState({ scanStatus: 'error', err }) + }, }) } catch (err) { setState({ scanStatus: 'error', err }) @@ -145,6 +161,17 @@ class StepImport extends PureComponent { handleUnselectAll = () => this.props.setState({ checkedAccountsIds: [] }) + renderError() { + const { err, t } = this.props + invariant(err, 'Trying to render inexisting error') + return ( + + + {t('app:addAccounts.somethingWentWrong')} + + ) + } + render() { const { scanStatus, @@ -156,6 +183,10 @@ class StepImport extends PureComponent { t, } = this.props + if (err) { + return this.renderError() + } + const currencyName = currency ? currency.name : '' const importableAccounts = scannedAccounts.filter(acc => { @@ -208,17 +239,7 @@ class StepImport extends PureComponent { /> - {err && ( - - {err.message} - - - )} + {err && {err.message}} ) } @@ -270,12 +291,21 @@ export const StepImportFooter = ({ return ( {currency && } + {scanStatus === 'error' && ( + + )} {scanStatus === 'scanning' && ( - setState({ scanStatus: 'finished' })}> + )} - diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index b190b2be..3fab9aaa 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -149,7 +149,7 @@ addAccounts: title: Create new account noOperationOnLastAccount: You cannot create a new account because your last account has no operations noAccountToCreate: We didnt find any {{currencyName}} account to create. - retrySync: Retry sync + somethingWentWrong: Something went wrong during synchronization. cta: create: 'Create account' import: 'Import account' From 009f74725a0a6838ed0264d4f92f3bab82f01e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 18:34:17 +0200 Subject: [PATCH 21/60] add busy indicators --- src/components/DeviceBusyIndicator.js | 38 ++++++++++++++++++++++++++ src/components/LibcoreBusyIndicator.js | 37 +++++++++++++++++++++++++ src/components/layout/Default.js | 5 ++++ src/config/constants.js | 1 + src/helpers/deviceAccess.js | 19 +++++++++++-- src/helpers/withLibcore.js | 20 ++++++++++++-- src/main/bridge.js | 21 ++++++++------ src/renderer/events.js | 16 +++++++++-- 8 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 src/components/DeviceBusyIndicator.js create mode 100644 src/components/LibcoreBusyIndicator.js diff --git a/src/components/DeviceBusyIndicator.js b/src/components/DeviceBusyIndicator.js new file mode 100644 index 00000000..b77523bc --- /dev/null +++ b/src/components/DeviceBusyIndicator.js @@ -0,0 +1,38 @@ +import React, { PureComponent } from 'react' +import styled from 'styled-components' + +const Indicator = styled.div` + opacity: ${p => (p.busy ? 0.2 : 0)}; + width: 6px; + height: 6px; + border-radius: 3px; + background-color: black; + position: fixed; + bottom: 4px; + right: 4px; + z-index: 999; +` + +// NB this is done like this to be extremely performant. we don't want redux for this.. +const perPaths = {} +const instances = [] +export const onSetDeviceBusy = (path, busy) => { + perPaths[path] = busy + instances.forEach(i => i.forceUpdate()) +} + +class DeviceBusyIndicator extends PureComponent<{}> { + componentDidMount() { + instances.push(this) + } + componentWillUnmount() { + const i = instances.indexOf(this) + instances.splice(i, 1) + } + render() { + const busy = Object.values(perPaths).reduce((busy, b) => busy || b, false) + return + } +} + +export default DeviceBusyIndicator diff --git a/src/components/LibcoreBusyIndicator.js b/src/components/LibcoreBusyIndicator.js new file mode 100644 index 00000000..251f955b --- /dev/null +++ b/src/components/LibcoreBusyIndicator.js @@ -0,0 +1,37 @@ +import React, { PureComponent } from 'react' +import styled from 'styled-components' + +const Indicator = styled.div` + opacity: ${p => (p.busy ? 0.2 : 0)}; + width: 6px; + height: 6px; + border-radius: 3px; + background-color: black; + position: fixed; + bottom: 4px; + right: 4px; + z-index: 999; +` + +// NB this is done like this to be extremely performant. we don't want redux for this.. +let busy = false +const instances = [] +export const onSetLibcoreBusy = b => { + busy = b + instances.forEach(i => i.forceUpdate()) +} + +class LibcoreBusyIndicator extends PureComponent<{}> { + componentDidMount() { + instances.push(this) + } + componentWillUnmount() { + const i = instances.indexOf(this) + instances.splice(i, 1) + } + render() { + return + } +} + +export default LibcoreBusyIndicator diff --git a/src/components/layout/Default.js b/src/components/layout/Default.js index e7286fa0..c9a16c8c 100644 --- a/src/components/layout/Default.js +++ b/src/components/layout/Default.js @@ -17,6 +17,8 @@ import DashboardPage from 'components/DashboardPage' import ManagerPage from 'components/ManagerPage' import ExchangePage from 'components/ExchangePage' import SettingsPage from 'components/SettingsPage' +import LibcoreBusyIndicator from 'components/LibcoreBusyIndicator' +import DeviceBusyIndicator from 'components/DeviceBusyIndicator' import AppRegionDrag from 'components/AppRegionDrag' import IsUnlocked from 'components/IsUnlocked' @@ -96,6 +98,9 @@ class Default extends Component { + + + ) diff --git a/src/config/constants.js b/src/config/constants.js index 74ca72ef..473559a4 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -59,6 +59,7 @@ export const SKIP_GENUINE = boolFromEnv('SKIP_GENUINE') export const SKIP_ONBOARDING = boolFromEnv('SKIP_ONBOARDING') export const SHOW_LEGACY_NEW_ACCOUNT = boolFromEnv('SHOW_LEGACY_NEW_ACCOUNT') export const HIGHLIGHT_I18N = boolFromEnv('HIGHLIGHT_I18N') +export const DISABLE_ACTIVITY_INDICATORS = boolFromEnv('DISABLE_ACTIVITY_INDICATORS') // Other constants diff --git a/src/helpers/deviceAccess.js b/src/helpers/deviceAccess.js index 34aa3499..c380fe0c 100644 --- a/src/helpers/deviceAccess.js +++ b/src/helpers/deviceAccess.js @@ -18,7 +18,7 @@ export const withDevice: WithDevice = devicePath => { semaphorePerDevice[devicePath] || (semaphorePerDevice[devicePath] = createSemaphore(1)) return job => - takeSemaphorePromise(sem, async () => { + takeSemaphorePromise(sem, devicePath, async () => { const t = await retry(() => TransportNodeHid.open(devicePath), { maxRetry: 1 }) if (DEBUG_DEVICE) t.setDebugMode(true) @@ -32,17 +32,32 @@ export const withDevice: WithDevice = devicePath => { }) } -function takeSemaphorePromise(sem, f: () => Promise): Promise { +function takeSemaphorePromise(sem, devicePath, f: () => Promise): Promise { return new Promise((resolve, reject) => { sem.take(() => { + process.send({ + type: 'setDeviceBusy', + busy: true, + devicePath, + }) f().then( r => { sem.leave() resolve(r) + process.send({ + type: 'setDeviceBusy', + busy: false, + devicePath, + }) }, e => { sem.leave() reject(e) + process.send({ + type: 'setDeviceBusy', + busy: false, + devicePath, + }) }, ) }) diff --git a/src/helpers/withLibcore.js b/src/helpers/withLibcore.js index e2d42054..f1fe3fd4 100644 --- a/src/helpers/withLibcore.js +++ b/src/helpers/withLibcore.js @@ -3,8 +3,24 @@ // TODO: `core` should be typed type Job = Object => Promise -export default function withLibcore(job: Job): Promise { +let counter = 0 +export default async function withLibcore(job: Job): Promise { const core = require('./init-libcore').default core.getPoolInstance() - return job(core) + try { + if (counter++ === 0) { + process.send({ + type: 'setLibcoreBusy', + busy: true, + }) + } + return job(core) + } finally { + if (--counter === 0) { + process.send({ + type: 'setLibcoreBusy', + busy: false, + }) + } + } } diff --git a/src/main/bridge.js b/src/main/bridge.js index 2b71fcd1..79323d2e 100644 --- a/src/main/bridge.js +++ b/src/main/bridge.js @@ -97,16 +97,19 @@ ipcMainListenReceiveCommands({ }) function handleGlobalInternalMessage(payload) { - if (payload.type === 'executeHttpQueryOnRenderer') { - const win = getMainWindow && getMainWindow() - if (!win) { - logger.warn("can't executeHttpQueryOnRenderer because no renderer") - return + switch (payload.type) { + case 'setLibcoreBusy': + case 'setDeviceBusy': + case 'executeHttpQueryOnRenderer': { + const win = getMainWindow && getMainWindow() + if (!win) { + logger.warn(`can't ${payload.type} because no renderer`) + return + } + win.webContents.send(payload.type, payload) + break } - win.webContents.send('executeHttpQuery', { - id: payload.id, - networkArg: payload.networkArg, - }) + default: } } diff --git a/src/renderer/events.js b/src/renderer/events.js index bb106f27..63d266f2 100644 --- a/src/renderer/events.js +++ b/src/renderer/events.js @@ -15,7 +15,9 @@ import network from 'api/network' import { ipcRenderer } from 'electron' import debug from 'debug' -import { CHECK_UPDATE_DELAY } from 'config/constants' +import { CHECK_UPDATE_DELAY, DISABLE_ACTIVITY_INDICATORS } from 'config/constants' +import { onSetDeviceBusy } from 'components/DeviceBusyIndicator' +import { onSetLibcoreBusy } from 'components/LibcoreBusyIndicator' import { hasPassword } from 'reducers/settings' import { lock } from 'reducers/application' @@ -87,7 +89,7 @@ export default ({ store }: { store: Object }) => { } }) - ipcRenderer.on('executeHttpQuery', (event: any, { networkArg, id }) => { + ipcRenderer.on('executeHttpQueryOnRenderer', (event: any, { networkArg, id }) => { network(networkArg).then( result => { ipcRenderer.send('executeHttpQueryPayload', { type: 'success', id, result }) @@ -98,6 +100,16 @@ export default ({ store }: { store: Object }) => { ) }) + if (!DISABLE_ACTIVITY_INDICATORS) { + ipcRenderer.on('setLibcoreBusy', (event: any, { busy }) => { + onSetLibcoreBusy(busy) + }) + + ipcRenderer.on('setDeviceBusy', (event: any, { busy, devicePath }) => { + onSetDeviceBusy(devicePath, busy) + }) + } + if (__PROD__) { // TODO move this to "command" pattern const updaterHandlers = { From cc8dbb82ba353db3127a39a61290590109f0765f Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 18:38:12 +0200 Subject: [PATCH 22/60] Fix un-aligned back button & chevron, that was triggering me so much --- src/components/base/Modal/ModalTitle.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/base/Modal/ModalTitle.js b/src/components/base/Modal/ModalTitle.js index c4f4c7ed..cc812853 100644 --- a/src/components/base/Modal/ModalTitle.js +++ b/src/components/base/Modal/ModalTitle.js @@ -30,6 +30,7 @@ const Back = styled(Box).attrs({ })` cursor: pointer; position: absolute; + line-height: 1; top: 0; left: 0; From 927725b8f1975f6e446f8e077e2fe2a15a08077b Mon Sep 17 00:00:00 2001 From: Anastasia Poupeney Date: Tue, 19 Jun 2018 18:47:27 +0200 Subject: [PATCH 23/60] operation details --- src/components/base/Spoiler/index.js | 16 +- src/components/modals/OperationDetails.js | 175 +++++++++++++--------- static/i18n/en/app.yml | 4 +- 3 files changed, 117 insertions(+), 78 deletions(-) diff --git a/src/components/base/Spoiler/index.js b/src/components/base/Spoiler/index.js index 4cb21c01..1810223f 100644 --- a/src/components/base/Spoiler/index.js +++ b/src/components/base/Spoiler/index.js @@ -17,12 +17,12 @@ type State = { } const Title = styled(Text).attrs({ - ff: 'Museo Sans|Bold', - fontSize: 2, - color: 'dark', + ff: p => (p.ff ? p.ff : 'Museo Sans|Bold'), + fontSize: p => (p.fontSize ? p.fontSize : 2), + color: p => (p.color ? p.color : 'dark'), tabIndex: 0, })` - text-transform: uppercase; + text-transform: ${p => (!p.textTransform ? 'auto' : 'uppercase')}; letter-spacing: 1px; cursor: pointer; outline: none; @@ -41,15 +41,17 @@ class Spoiler extends PureComponent { toggle = () => this.setState({ isOpened: !this.state.isOpened }) render() { - const { title, children } = this.props + const { title, children, ...p } = this.props const { isOpened } = this.state return ( - + - {title} + + {title} + {isOpened && children} diff --git a/src/components/modals/OperationDetails.js b/src/components/modals/OperationDetails.js index 6f0b23c1..9e665e08 100644 --- a/src/components/modals/OperationDetails.js +++ b/src/components/modals/OperationDetails.js @@ -17,6 +17,7 @@ import { MODAL_OPERATION_DETAILS } from 'config/constants' import { getMarketColor } from 'styles/helpers' import Box from 'components/base/Box' +import Spoiler from 'components/base/Spoiler' import Button from 'components/base/Button' import Bar from 'components/base/Bar' import FormattedVal from 'components/base/FormattedVal' @@ -28,26 +29,23 @@ import { currencySettingsForAccountSelector, marketIndicatorSelector } from 'red import CounterValue from 'components/CounterValue' import ConfirmationCheck from 'components/OperationsList/ConfirmationCheck' - -const Line = styled(Box).attrs({ - horizontal: true, -})`` - -const ColLeft = styled(Box).attrs({ - color: 'smoke', - ff: 'Open Sans', - fontSize: 4, +import Ellipsis from '../base/Ellipsis' + +const OpDetailsTitle = styled(Box).attrs({ + ff: 'Museo Sans|ExtraBold', + fontSize: 2, + color: 'black', + textTransform: 'uppercase', + mb: 1, })` - width: 95px; + letter-spacing: 2px; ` -const ColRight = styled(Box).attrs({ - fontSize: 4, + +const OpDetailsData = styled(Box).attrs({ ff: 'Open Sans', - color: 'dark', - shrink: true, -})` - word-break: break-all; -` + color: 'smoke', + fontSize: 4, +})`` const CanSelect = styled.div` user-select: text; @@ -91,7 +89,8 @@ type Props = { const OperationDetails = connect(mapStateToProps)((props: Props) => { const { t, onClose, operation, account, currencySettings, marketIndicator } = props if (!operation || !account || !currencySettings) return null - const { hash, date, senders, recipients, type, fee } = operation + const { hash, date, senders, type, fee, recipients } = operation + const { name, unit, currency } = account const amount = getOperationAmountNumber(operation) const isNegative = operation.type === 'OUT' @@ -108,21 +107,21 @@ const OperationDetails = connect(mapStateToProps)((props: Props) => { return ( {t('app:operationDetails.title')} - - + + - + - + { - - {t('app:operationDetails.account')} - {name} - - - - {t('app:operationDetails.date')} - {moment(date).format('LLL')} - + + + {t('app:operationDetails.account')} + {name} + + + {t('app:operationDetails.date')} + {moment(date).format('LLL')} + + - - {t('app:operationDetails.status')} - - - {isConfirmed - ? t('app:operationDetails.confirmed') - : t('app:operationDetails.notConfirmed')} - - {`(${confirmations})`} - - + + + {t('app:operationDetails.fees')} + {fee ? ( + + + + + + ) : null} + + + {t('app:operationDetails.status')} + + + {isConfirmed + ? t('app:operationDetails.confirmed') + : t('app:operationDetails.notConfirmed')} + + {`(${confirmations})`} + + + - {fee ? ( - - - {t('app:operationDetails.fees')} - - - - - - - ) : null} - - {t('app:operationDetails.from')} - {uniqSenders.map(v => {v})} - + + {t('app:operationDetails.from')} + {uniqSenders.map(v => {v})} + - - {t('app:operationDetails.to')} - {recipients.map(v => {v} )} - + + {t('app:operationDetails.to')} + + - - {t('app:operationDetails.identifier')} - - {hash} - - + + {t('app:operationDetails.identifier')} + + + {hash} + + + + - + {url ? ( - ) : null} @@ -216,3 +222,32 @@ const OperationDetailsWrapper = ({ t }: { t: T }) => ( ) export default translate()(OperationDetailsWrapper) + +export function RenderRecipients({ recipients, t }: { recipients: *, t: T }) { + // Hardcoded for now + const numToShow = 2 + return ( + + + {recipients + .slice(0, numToShow) + .map(recipient => {recipient})} + + {recipients.length > numToShow && ( + + + {recipients + .slice(numToShow) + .map(recipient => {recipient})} + + + )} + + ) +} diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 293005ae..03385e48 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -158,8 +158,10 @@ operationDetails: fees: Fees from: From to: To - identifier: Identifier + identifier: Hash viewOperation: View operation + showMore: See {{recipients}} more + showLess: See Less operationList: noMoreOperations: No more operations manager: From 683456ac5766a0e122ef5d379c1f0aa166973f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 18:48:28 +0200 Subject: [PATCH 24/60] clean accounts will save to file --- src/actions/accounts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/accounts.js b/src/actions/accounts.js index 99ffe0c6..bea494fc 100644 --- a/src/actions/accounts.js +++ b/src/actions/accounts.js @@ -48,4 +48,4 @@ export const updateAccount: UpdateAccount = payload => ({ }, }) -export const cleanAccountsCache = () => ({ type: 'CLEAN_ACCOUNTS_CACHE' }) +export const cleanAccountsCache = () => ({ type: 'DB:CLEAN_ACCOUNTS_CACHE' }) From f1051b4f5b2e79afbf021d562cad7afd29475b01 Mon Sep 17 00:00:00 2001 From: Anastasia Poupeney Date: Tue, 19 Jun 2018 18:51:33 +0200 Subject: [PATCH 25/60] remode not needed --- static/i18n/en/app.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 03385e48..f2288758 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -161,7 +161,6 @@ operationDetails: identifier: Hash viewOperation: View operation showMore: See {{recipients}} more - showLess: See Less operationList: noMoreOperations: No more operations manager: From d5994a3a904c3256040b0cbb4e5aa40e28f92634 Mon Sep 17 00:00:00 2001 From: meriadec Date: Tue, 19 Jun 2018 18:53:56 +0200 Subject: [PATCH 26/60] Wording update --- src/components/modals/AddAccounts/steps/03-step-import.js | 2 +- static/i18n/en/app.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/modals/AddAccounts/steps/03-step-import.js b/src/components/modals/AddAccounts/steps/03-step-import.js index bf894775..b95885c3 100644 --- a/src/components/modals/AddAccounts/steps/03-step-import.js +++ b/src/components/modals/AddAccounts/steps/03-step-import.js @@ -298,7 +298,7 @@ export const StepImportFooter = ({ )} {scanStatus === 'scanning' && ( )} + + + + + + ) : ( + + )} + Date: Tue, 19 Jun 2018 21:04:39 +0200 Subject: [PATCH 31/60] disable continue button when skipping onboarding --- src/components/Onboarding/steps/GenuineCheck.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/Onboarding/steps/GenuineCheck.js b/src/components/Onboarding/steps/GenuineCheck.js index 36b93672..7b366498 100644 --- a/src/components/Onboarding/steps/GenuineCheck.js +++ b/src/components/Onboarding/steps/GenuineCheck.js @@ -270,12 +270,7 @@ class GenuineCheck extends PureComponent { - From 63ce0acedd2fd6aecb591fa64c2c053cbcb744f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 19 Jun 2018 21:09:37 +0200 Subject: [PATCH 32/60] enable app to render --- src/index.ejs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ejs b/src/index.ejs index 41fc793a..b9a84938 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -75,7 +75,6 @@ const preloadEl = document.getElementById('preload') const appEl = document.getElementById('app') const initApp = (options = {}) => { - return const { force = false } = options if (force) { From 2b719f341476f23d9d55a95841b601b5d93b8ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Wed, 20 Jun 2018 06:20:17 +0200 Subject: [PATCH 33/60] fix position of DeviceBusyIndicator --- src/components/DeviceBusyIndicator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DeviceBusyIndicator.js b/src/components/DeviceBusyIndicator.js index b77523bc..9997040c 100644 --- a/src/components/DeviceBusyIndicator.js +++ b/src/components/DeviceBusyIndicator.js @@ -8,7 +8,7 @@ const Indicator = styled.div` border-radius: 3px; background-color: black; position: fixed; - bottom: 4px; + top: 4px; right: 4px; z-index: 999; ` From fa4016f3bf3345c2eebf71f15e22deab500b2133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Wed, 20 Jun 2018 08:42:51 +0200 Subject: [PATCH 34/60] add a cache on SelectExchange --- src/components/SelectExchange.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/SelectExchange.js b/src/components/SelectExchange.js index 93c76db9..7872e598 100644 --- a/src/components/SelectExchange.js +++ b/src/components/SelectExchange.js @@ -1,6 +1,7 @@ // @flow import React, { Component } from 'react' import { translate } from 'react-i18next' +import LRU from 'lru-cache' import type { Currency } from '@ledgerhq/live-common/lib/types' import type { Exchange } from '@ledgerhq/live-common/lib/countervalues/types' import logger from 'logger' @@ -10,6 +11,18 @@ import Text from 'components/base/Text' import CounterValues from 'helpers/countervalues' import type { T } from 'types/common' +const cache = LRU({ max: 100 }) + +const getExchanges = (from: Currency, to: Currency) => { + const key = `${from.ticker}_${to.ticker}` + let promise = cache.get(key) + if (promise) return promise + promise = CounterValues.fetchExchangesForPair(from, to) + promise.catch(() => cache.del(key)) // if it's a failure, we don't want to keep the cache + cache.set(key, promise) + return promise +} + class SelectExchange extends Component< { from: Currency, @@ -65,7 +78,7 @@ class SelectExchange extends Component< const { _loadId } = this const { from, to } = this.props try { - const exchanges = await CounterValues.fetchExchangesForPair(from, to) + const exchanges = await getExchanges(from, to) if (!this._unmounted && this._loadId === _loadId) { this.setState({ exchanges }) } From 9521712723e6983d881b5ba6f77bb84a6b4ada7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Wed, 20 Jun 2018 08:48:19 +0200 Subject: [PATCH 35/60] add a cache on getEstimatedFees too --- src/api/Fees.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/api/Fees.js b/src/api/Fees.js index 21063c9d..7967f9a7 100644 --- a/src/api/Fees.js +++ b/src/api/Fees.js @@ -1,5 +1,6 @@ // @flow import invariant from 'invariant' +import LRU from 'lru-cache' import type { Currency } from '@ledgerhq/live-common/lib/types' import createCustomErrorClass from 'helpers/createCustomErrorClass' import { blockchainBaseURL } from './Ledger' @@ -11,10 +12,20 @@ export type Fees = { [_: string]: number, } +const cache = LRU({ + maxAge: 5 * 60 * 1000, +}) + export const getEstimatedFees = async (currency: Currency): Promise => { + const key = currency.id + let promise = cache.get(key) + if (promise) return promise.then(r => r.data) const baseURL = blockchainBaseURL(currency) invariant(baseURL, `Fees for ${currency.id} are not supported`) - const { data, status } = await network({ method: 'GET', url: `${baseURL}/fees` }) + promise = network({ method: 'GET', url: `${baseURL}/fees` }) + cache.set(key, promise) + const { data, status } = await promise + if (status < 200 || status >= 300) cache.del(key) if (data) { return data } From f5a862cb508dda5159fbf8d235f72f0552e750c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Wed, 20 Jun 2018 09:46:16 +0200 Subject: [PATCH 36/60] Make errors reported on init crash --- src/components/AppError.js | 23 ++++++++ src/components/RenderError.js | 97 +++++++++++++++++++++++++++++++ src/components/ThrowBlock.js | 85 +-------------------------- src/components/TranslatedError.js | 2 +- src/components/TriggerAppReady.js | 16 +++++ src/components/layout/Default.js | 5 +- src/renderer/init.js | 3 +- 7 files changed, 144 insertions(+), 87 deletions(-) create mode 100644 src/components/AppError.js create mode 100644 src/components/RenderError.js create mode 100644 src/components/TriggerAppReady.js diff --git a/src/components/AppError.js b/src/components/AppError.js new file mode 100644 index 00000000..7ae0ca90 --- /dev/null +++ b/src/components/AppError.js @@ -0,0 +1,23 @@ +// @flow + +import React from 'react' +import { ThemeProvider } from 'styled-components' +import { I18nextProvider } from 'react-i18next' +import theme from 'styles/theme' +import i18n from 'renderer/i18n/electron' +import TriggerAppReady from './TriggerAppReady' +import RenderError from './RenderError' + +// Like App except it just render an error + +const App = ({ language, error }: { error: Error, language: string }) => ( + + + + + + + +) + +export default App diff --git a/src/components/RenderError.js b/src/components/RenderError.js new file mode 100644 index 00000000..f8fb8a42 --- /dev/null +++ b/src/components/RenderError.js @@ -0,0 +1,97 @@ +// @flow + +import React, { PureComponent } from 'react' +import styled from 'styled-components' +import { shell, remote } from 'electron' +import qs from 'querystring' +import { translate } from 'react-i18next' + +import { rgba } from 'styles/helpers' +import db from 'helpers/db' + +import type { T } from 'types/common' + +import ExportLogsBtn from 'components/ExportLogsBtn' +import Box from 'components/base/Box' +import Button from 'components/base/Button' +import TranslatedError from './TranslatedError' + +type Props = { + error: Error, + t: T, + disableExport?: boolean, + children?: *, +} + +const Container = styled(Box).attrs({ + grow: true, + align: 'center', + justify: 'center', + bg: 'lightGraphite', + color: 'alertRed', + ff: 'Museo Sans|Bold', + flow: 2, +})`` + +const Inner = styled(Box).attrs({ + p: 2, + bg: p => rgba(p.theme.colors.alertRed, 0.05), + borderRadius: 1, +})` + border: ${p => `1px solid ${rgba(p.theme.colors.alertRed, 0.1)}`}; +` + +class RenderError extends PureComponent { + handleCreateIssue = () => { + const { error } = this.props + if (!error) { + return + } + const q = qs.stringify({ + title: `Error: ${error.message}`, + body: `Error was thrown: + +\`\`\` +${error.stack} +\`\`\` +`, + }) + shell.openExternal(`https://github.com/LedgerHQ/ledger-live-desktop/issues/new?${q}`) + } + + handleRestart = () => { + remote.app.relaunch() + remote.app.exit() + } + + handleReset = () => { + db.resetAll() + this.handleRestart() + } + + render() { + const { error, t, disableExport, children } = this.props + return ( + + + + + + + + {!disableExport ? : null} + + + {children} + + ) + } +} + +export default translate()(RenderError) diff --git a/src/components/ThrowBlock.js b/src/components/ThrowBlock.js index 4ca6a52e..89b0d497 100644 --- a/src/components/ThrowBlock.js +++ b/src/components/ThrowBlock.js @@ -1,49 +1,16 @@ // @flow - import logger from 'logger' import React, { PureComponent } from 'react' -import styled from 'styled-components' -import { shell, remote } from 'electron' -import qs from 'querystring' -import { translate } from 'react-i18next' - -import { rgba } from 'styles/helpers' -import db from 'helpers/db' - -import type { T } from 'types/common' - -import ExportLogsBtn from 'components/ExportLogsBtn' -import Box from 'components/base/Box' -import Button from 'components/base/Button' -import TranslatedError from './TranslatedError' +import RenderError from 'components/RenderError' type Props = { children: any, - t: T, } type State = { error: ?Error, } -const Container = styled(Box).attrs({ - grow: true, - align: 'center', - justify: 'center', - bg: 'lightGraphite', - color: 'alertRed', - ff: 'Museo Sans|Bold', - flow: 2, -})`` - -const Inner = styled(Box).attrs({ - p: 2, - bg: p => rgba(p.theme.colors.alertRed, 0.05), - borderRadius: 1, -})` - border: ${p => `1px solid ${rgba(p.theme.colors.alertRed, 0.1)}`}; -` - class ThrowBlock extends PureComponent { state = { error: null, @@ -54,59 +21,13 @@ class ThrowBlock extends PureComponent { this.setState({ error }) } - handleCreateIssue = () => { - const { error } = this.state - if (!error) { - return - } - const q = qs.stringify({ - title: `Error: ${error.message}`, - body: `Error was thrown: - -\`\`\` -${error.stack} -\`\`\` -`, - }) - shell.openExternal(`https://github.com/LedgerHQ/ledger-live-desktop/issues/new?${q}`) - } - - handleRestart = () => { - remote.app.relaunch() - remote.app.exit() - } - - handleReset = () => { - db.resetAll() - this.handleRestart() - } - render() { const { error } = this.state - const { t } = this.props if (error) { - return ( - - - - - - - - - - - - ) + return } return this.props.children } } -export default translate()(ThrowBlock) +export default ThrowBlock diff --git a/src/components/TranslatedError.js b/src/components/TranslatedError.js index d9d3f8b5..ff2ec07d 100644 --- a/src/components/TranslatedError.js +++ b/src/components/TranslatedError.js @@ -23,7 +23,7 @@ class TranslatedError extends PureComponent { if (translation) { return translation } - logger.warn('TranslatedError: no transation!', error.name, error) + logger.warn(`TranslatedError: no translation for '${error.name}'`, error) return error.message || error.name || t('errors:generic') } } diff --git a/src/components/TriggerAppReady.js b/src/components/TriggerAppReady.js new file mode 100644 index 00000000..e47f2ed2 --- /dev/null +++ b/src/components/TriggerAppReady.js @@ -0,0 +1,16 @@ +// @flow + +import { PureComponent } from 'react' + +export default class TriggerAppReady extends PureComponent<{}> { + componentDidMount() { + window.requestAnimationFrame(() => (this._timeout = setTimeout(() => window.onAppReady(), 300))) + } + componentWillUnmount() { + clearTimeout(this._timeout) + } + _timeout: * + render() { + return null + } +} diff --git a/src/components/layout/Default.js b/src/components/layout/Default.js index c9a16c8c..c107392e 100644 --- a/src/components/layout/Default.js +++ b/src/components/layout/Default.js @@ -19,6 +19,7 @@ import ExchangePage from 'components/ExchangePage' import SettingsPage from 'components/SettingsPage' import LibcoreBusyIndicator from 'components/LibcoreBusyIndicator' import DeviceBusyIndicator from 'components/DeviceBusyIndicator' +import TriggerAppReady from 'components/TriggerAppReady' import AppRegionDrag from 'components/AppRegionDrag' import IsUnlocked from 'components/IsUnlocked' @@ -41,7 +42,6 @@ type Props = { class Default extends Component { componentDidMount() { - window.requestAnimationFrame(() => (this._timeout = setTimeout(() => window.onAppReady(), 300))) window.addEventListener('keydown', this.kbShortcut) } @@ -59,7 +59,6 @@ class Default extends Component { } componentWillUnmount() { - clearTimeout(this._timeout) window.removeEventListener('keydown', this.kbShortcut) // Prevents adding multiple listeners when hot reloading } @@ -69,12 +68,12 @@ class Default extends Component { } } - _timeout = undefined _scrollContainer = null render() { return ( + {process.platform === 'darwin' && } diff --git a/src/renderer/init.js b/src/renderer/init.js index 0ad9407d..a91a2087 100644 --- a/src/renderer/init.js +++ b/src/renderer/init.js @@ -27,6 +27,7 @@ import hardReset from 'helpers/hardReset' import sentry from 'sentry/browser' import App from 'components/App' +import AppError from 'components/AppError' import 'styles/global' @@ -99,5 +100,5 @@ function r(Comp) { init().catch(e => { // for now we make the app crash instead of pending forever. later we can render the error OR try to recover, but probably this is unrecoverable cases. logger.error(e) - process.exit(1) + r() }) From f788f98fff6083277dfc30258b5191f2a59bcf2c Mon Sep 17 00:00:00 2001 From: meriadec Date: Wed, 20 Jun 2018 09:50:19 +0200 Subject: [PATCH 37/60] Make accounts save in db on ADD_ACCOUNT --- src/actions/accounts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/accounts.js b/src/actions/accounts.js index bea494fc..d5b58660 100644 --- a/src/actions/accounts.js +++ b/src/actions/accounts.js @@ -6,7 +6,7 @@ import db from 'helpers/db' export type AddAccount = Account => * export const addAccount: AddAccount = payload => ({ - type: 'ADD_ACCOUNT', + type: 'DB:ADD_ACCOUNT', payload, }) From 7ba5b93079cbd73fc6f18d38e70fbae9e05c95d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Wed, 20 Jun 2018 10:09:38 +0200 Subject: [PATCH 38/60] add SyncAgo because it's very useful thing to know... --- src/components/SyncAgo.js | 16 ++++++++++++++++ .../modals/AccountSettingRenderBody.js | 3 ++- static/i18n/en/app.yml | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/components/SyncAgo.js diff --git a/src/components/SyncAgo.js b/src/components/SyncAgo.js new file mode 100644 index 00000000..320732cf --- /dev/null +++ b/src/components/SyncAgo.js @@ -0,0 +1,16 @@ +// @flow + +import React, { PureComponent } from 'react' +import moment from 'moment' +import { translate } from 'react-i18next' +import type { T } from 'types/common' +import Box from './base/Box' + +class SyncAgo extends PureComponent<{ t: T, date: Date }> { + render() { + const { t, date } = this.props + return {t('app:common.sync.ago', { time: moment(date).fromNow() })} + } +} + +export default translate()(SyncAgo) diff --git a/src/components/modals/AccountSettingRenderBody.js b/src/components/modals/AccountSettingRenderBody.js index ee8594e8..c4aef19d 100644 --- a/src/components/modals/AccountSettingRenderBody.js +++ b/src/components/modals/AccountSettingRenderBody.js @@ -22,6 +22,7 @@ import Box from 'components/base/Box' import Button from 'components/base/Button' import Input from 'components/base/Input' import Select from 'components/base/Select' +import SyncAgo from 'components/SyncAgo' import { ModalBody, @@ -258,12 +259,12 @@ class HelperComp extends PureComponent {
) : null} +