From 7a4b6c6139967e92eb0ddf06732788cdf16407a9 Mon Sep 17 00:00:00 2001 From: ddasilva Date: Fri, 22 Jun 2018 10:13:49 +0200 Subject: [PATCH 1/7] Wording updates --- static/i18n/en/errors.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/static/i18n/en/errors.yml b/static/i18n/en/errors.yml index 640ff96d..dfa2a70b 100644 --- a/static/i18n/en/errors.yml +++ b/static/i18n/en/errors.yml @@ -22,10 +22,10 @@ DeviceSocketNoHandler: Oops, device connection failed (handler {{query}}). Pleas LatestMCUInstalledError: MCU on device already up to date. HardResetFail: Reset failed. Please try again. -ManagerAPIsFail: Our services are currently unavailable. Please try again later. -ManagerUnexpected: Unexpected error occurred ({{msg}}). Please try again later. -ManagerNotEnoughSpace: Not enough room left on your device. Please uninstall some apps and try again. +ManagerAPIsFail: Services are unavailable. Please try again. +ManagerUnexpected: Unexpected error occurred ({{msg}}). Please try again. +ManagerNotEnoughSpace: Not enough storage on device. Uninstall some apps and try again. ManagerDeviceLocked: Device is locked ManagerAppAlreadyInstalled: App is already installed -ManagerAppRelyOnBTC: You must install Bitcoin application first -ManagerUninstallBTCDep: You must uninstall other altcoins first +ManagerAppRelyOnBTC: First install the Bitcoin app +ManagerUninstallBTCDep: Other apps depend on Bitcoin, uninstall those first From f323653854fe6a354037c57670282a53edee6592 Mon Sep 17 00:00:00 2001 From: ddasilva Date: Tue, 26 Jun 2018 10:01:09 +0200 Subject: [PATCH 2/7] Wording review 1 --- .../steps/02-step-connect-device.js | 2 +- static/i18n/en/app.yml | 130 +++++++++--------- static/i18n/en/errors.yml | 2 +- static/i18n/en/onboarding.yml | 24 ++-- static/i18n/fr/app.yml | 2 +- 5 files changed, 81 insertions(+), 79 deletions(-) diff --git a/src/components/modals/AddAccounts/steps/02-step-connect-device.js b/src/components/modals/AddAccounts/steps/02-step-connect-device.js index f3815588..81e2bd2e 100644 --- a/src/components/modals/AddAccounts/steps/02-step-connect-device.js +++ b/src/components/modals/AddAccounts/steps/02-step-connect-device.js @@ -12,7 +12,7 @@ import { CurrencyCircleIcon } from 'components/base/CurrencyBadge' import type { StepProps } from '../index' function StepConnectDevice({ t, currency, device, setAppOpened }: StepProps) { - invariant(currency, 'No currency given') + invariant(currency, 'No crypto asset given') return ( diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 3d94114d..e01bd94b 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -13,14 +13,14 @@ common: selectAccount: Select an account selectAccountNoOption: 'No account matching "{{accountName}}"' selectCurrency: Choose a crypto asset - selectCurrencyNoOption: 'No currency matching "{{currencyName}}"' + selectCurrencyNoOption: 'No crypto asset "{{currencyName}}"' selectExchange: Select an exchange selectExchangeNoOption: 'No exchange matching "{{exchangeName}}"' sortBy: Sort by search: Search save: Save password: Password - editProfile: Edit profile + editProfile: Preferences lockApplication: Lock Ledger Live showMore: Show more max: Max @@ -61,10 +61,10 @@ time: month: Month year: Year since: - day: since a day - week: since a week - month: since a month - year: since a year + day: past day + week: past week + month: past month + year: past year sidebar: menu: Menu accounts: Accounts ({{count}}) @@ -75,20 +75,20 @@ account: receive: Receive lastOperations: Last operations emptyState: - title: No funds yet? - desc: Make sure the <1><0>{{currency}} app is installed to receive funds. # replace [cryptocurrency] and make it bold + title: No crypto assets yet? + desc: Make sure the <1><0>{{currency}} app is installed to receive crypto assets # replace [cryptocurrency] and make it bold buttons: - receiveFunds: Receive funds + receiveFunds: Receive settings: title: Edit account advancedLogs: Advanced logs accountName: title: Account name - desc: Describe this account. - error: An account name is required. + desc: Describe this account + error: An account name is required unit: title: Unit - desc: Choose the unit to display. + desc: Choose the unit to display endpointConfig: title: Node desc: The API node to use @@ -96,16 +96,16 @@ account: dashboard: title: Portfolio emptyAccountTile: - desc: Lorem ipsum dolor sit amet, consectetur adipiscing elit - createAccount: Create Account + desc: Add accounts to manage more crypto assets + createAccount: Add account accounts: title: Accounts ({{count}}) greeting: morning: "Good morning" evening: "Good evening" afternoon: "Good afternoon" - summary: "Here's the summary of your account." - summary_plural: "Here's the summary of your {{count}} accounts." + summary: "Here's the summary of your account" + summary_plural: "Here's the summary of your {{count}} accounts" noAccounts: No accounts yet recentActivity: Recent activity totalBalance: Total balance @@ -115,15 +115,15 @@ dashboard: currentAddress: title: Current address for: Address for <1><0>{{accountName}} - message: Your receive address has not been confirmed on your Ledger device. Verify the address for optimal security. + message: Your receive address has not been confirmed on your Ledger device. Please verify the address for optimal security. deviceConnect: step1: choose: "We detected {{count}} connected devices, please select one:" connect: Connect and unlock your <1>Ledger device # remove key: <3>PIN code - dashboard: test + dashboard: Not used. # This key is not used. Still managed in JS. emptyState: sidebar: - text: Press the + button to add an account to your portfolio. + text: Press the + button to add an account to your portfolio dashboard: title: 'Add accounts to your portfolio' desc: Your portfolio has no accounts the first time Ledger Live is launched. Open the Manager to install apps on your Ledger device before you start adding accounts to your portfolio. @@ -153,13 +153,13 @@ addAccounts: editName: Edit name newAccount: New account legacyAccount: '{{accountName}} (legacy)' - noAccountToImport: All {{currencyName}} accounts found are already in your portfolio. - success: Account successfully added to your portfolio. + noAccountToImport: No existing {{currencyName}} accounts to add + success: Account added to your portfolio # success_plural: Accounts successfully added to your portfolio. createNewAccount: title: Create new account - noOperationOnLastAccount: 'You have to receive funds on {{accountName}} before you can create a new account.' - noAccountToCreate: No {{currencyName}} account was found to create. + noOperationOnLastAccount: 'You have to receive crypto assets on {{accountName}} before you can create a new account.' + noAccountToCreate: No {{currencyName}} account was found to create somethingWentWrong: Something went wrong during synchronization, please try again. cta: add: 'Add account' @@ -189,21 +189,21 @@ manager: all: Apps installing: 'Installing {{app}}...' uninstalling: 'Uninstalling {{app}}...' - installSuccess: '{{app}} is now installed on your device.' - uninstallSuccess: '{{app}} has been uninstalled from your device.' - alreadyInstalled: '{{app}} is already installed on your device.' + installSuccess: '{{app}} is now installed on your device' + uninstallSuccess: '{{app}} has been uninstalled from your device' + alreadyInstalled: '{{app}} is already installed on your device' help: Remove and reinstall to update apps firmware: installed: 'Firmware version {{version}}' update: Update firmware updateTitle: Firmware update continue: Continue update - latest: 'Firmware version {{version}} is available.' + latest: 'Firmware version {{version}} is available' disclaimerTitle: 'You are about to install the latest <1><0>firmware {{version}}' disclaimerAppDelete: Please note that all the apps installed on your device will be deleted. disclaimerAppReinstall: You will be able to re-install your apps after the firmware update title: Manager - subtitle: Install apps or update your device. + subtitle: Select apps to use on your device device: title: Connect your device desc: Follow the steps below to use the Manager @@ -213,7 +213,7 @@ manager: noDashboard: Navigate to the dashboard on your device (TEMPLATED NEEDED) noGenuine: Allow the Manager to continue (TEMPLATE NEEDED) receive: - title: Receive funds + title: Receive crypto assets steps: chooseAccount: title: Choose account @@ -224,27 +224,27 @@ receive: confirmAddress: title: Confirm address action: Confirm address on device - text: To receive funds, confirm the address on your device. + text: To receive crypto assets, confirm the address on your device support: Ledger Support error: title: Receive address rejected - text: Please try again or request Ledger Support assistance when in doubt. + text: Please try again or contact Support when in doubt receiveFunds: - title: Receive funds + title: Receive crypto assets label: Amount (optional) send: - title: Send funds + title: Send crypto assets totalSpent: Total steps: amount: - title: Create payment + title: Send crypto assets selectAccountDebit: Select an account to debit recipientAddress: Recipient address # can't control the tooltip! amount: Amount max: Max fees: Fees advancedOptions: Advanced options - useRBF: Use the RBF transaction. + useRBF: Use a replace-by-fee transaction message: Leave a message (140) rippleTag: Tag ethereumGasLimit: Gas limit @@ -258,7 +258,7 @@ send: Carefully verify the transaction details displayed one by one on your device before you proceed. # blue # nano - body: Press the right button to confirm the transaction. + body: Press the right button to confirm the transaction confirmation: title: Confirmation success: @@ -283,24 +283,26 @@ settings: about: Help display: desc: - language: Language - languageDesc: Choose the language to display. + language: Display language + languageDesc: Set the language displayed in Ledger Live. counterValue: Base currency - counterValueDesc: Choose the currency to display next to your balance and operations. An exchange is used (via BTC pair). + counterValueDesc: Choose the currency to display next to your balance and operations. + exchange: Rate provider ({{ticker}}) + exchangeDesc: Choose the provider of the base currency exchange rates region: Region - regionDesc: Choose the region in which you’re located to set the application’s time zone. + regionDesc: Choose the region in which you’re located to set the Ledger Live's time zone. stock: Regional market indicator stockDesc: Choose Western to display an increase in market value in blue. Choose Eastern to display an increase in market value in red. currencies: - desc: Select a cryptocurrency to edit its settings. + desc: Select a cryptocurrency to edit its settings exchange: Rate provider ({{ticker}}) - exchangeDesc: Choose the provider of the base currency exchange rates (via BTC). + exchangeDesc: Choose the provider of the base currency exchange rates confirmationsToSpend: Number of confirmations required to spend - confirmationsToSpendDesc: Set the number of confirmations required for your funds to be spendable. # A higher number of confirmations decreases the probability that a transaction is rejected. + confirmationsToSpendDesc: Set the number of network confirmations required for your crypto assets to be spendable. # A higher number of confirmations decreases the probability that a transaction is rejected. confirmationsNb: Number of confirmations - confirmationsNbDesc: Set the number of blocks a transaction needs to be included in to consider it as confirmed. # A higher number of confirmations increases the certainty that a transaction cannot be reversed. + confirmationsNbDesc: Set the number of network confirmations for a transaction to be marked as confirmed. # A higher number of confirmations increases the certainty that a transaction cannot be reversed. transactionsFees: Default transaction fees - transactionsFeesDesc: Select your default transaction fees. The higher the fee, the quicker the transaction will be processed. + transactionsFeesDesc: Select your default transaction fees. The higher the fee, the faster the transaction will be processed. explorer: Blockchain explorer explorerDesc: Choose which explorer is used to look up the operation details in the blockchain. profile: @@ -309,17 +311,17 @@ settings: passwordDesc: Enhance your privacy. Set a password to encrypt Ledger Live data stored on your computer, including account names, balances, transactions and public addresses. changePassword: Change password sync: Synchronize accounts - syncDesc: Resynchronize your accounts with the network. + syncDesc: Resynchronize your accounts with the network export: Export logs - exportDesc: Exporting Ledger Live logs may be necessary for troubleshooting purposes. + exportDesc: Exporting Ledger Live logs may be necessary for troubleshooting purposes softResetTitle: Clear cache - softResetDesc: Clear the Ledger Live cache to force resynchronization with the blockchain. + softResetDesc: Clear the Ledger Live cache to force resynchronization with the blockchain softReset: Clear hardResetTitle: Reset Ledger Live - hardResetDesc: Erase all Ledger Live data stored on your computer, including your profile, accounts, transaction history and settings. The private keys that manage your crypto assets remain secure on your Ledger device. + hardResetDesc: Erase all Ledger Live data stored on your computer, including your accounts, transaction history and preferences. The private keys that manage your crypto assets remain secure on your Ledger device. hardReset: Reset developerMode: Developer mode - developerModeDesc: Show developer apps in the Manager and enable testnet currencies. + developerModeDesc: Show developer apps in the Manager analytics: Analytics analyticsDesc: Enable analytics of anonymous data to help Ledger improve the user experience. This includes the operating system, language, firmware versions and the number of added accounts. reportErrors: Usage and diagnostics @@ -340,31 +342,31 @@ settings: softResetModal: title: Clear cache subTitle: Are you sure? - desc: Clearing the Ledger Live cache forces network resynchronization. + desc: Clearing the Ledger Live cache forces network resynchronization removeAccountModal: title: Remove account subTitle: Are you sure? - desc: The account will no longer be included in your portfolio. Accounts can always be re-added. + desc: The account will no longer be included in your portfolio. This operation does not affect your assets. Accounts can always be re-added. exportLogs: title: Export logs - desc: Exporting Ledger Live logs may be necessary for troubleshooting purposes. + desc: Exporting Ledger Live logs may be necessary for troubleshooting purposes btn: Export password: - warning_0: Warning 0 - warning_1: Warning 1 - warning_2: Warning 2 - warning_3: Warning 3 - warning_4: Warning 4 - errorMessageIncorrectPassword: The password you entered is incorrect. - errorMessageNotMatchingPassword: Passwords don't match. + warning_0: Very weak + warning_1: Weak + warning_2: Medium + warning_3: Strong + warning_4: Very strong + errorMessageIncorrectPassword: The password you entered is incorrect + errorMessageNotMatchingPassword: Passwords don't match inputFields: newPassword: label: Password - placeholder: + placeholder: #remove confirmPassword: label: Confirm password - placeholder: - currentPassword: + placeholder: #remove + currentPassword: #remove label: Current password placeholder: changePassword: @@ -379,7 +381,7 @@ password: title: Disable data encryption desc: Ledger Live data will be stored unencrypted on your computer. This includes account names, balances, transactions and public addresses. update: - newVersionReady: A new update is available. + newVersionReady: A new update is available relaunch: Update now crash: oops: Oops, something went wrong diff --git a/static/i18n/en/errors.yml b/static/i18n/en/errors.yml index dfa2a70b..be247375 100644 --- a/static/i18n/en/errors.yml +++ b/static/i18n/en/errors.yml @@ -10,7 +10,7 @@ BtcUnmatchedApp: 'Open the ‘{{currencyName}}’ app on your Ledger device to p WrongAppOpened: 'Open the ‘{{currencyName}}’ app on your Ledger device to proceed.' WrongDeviceForAccount: 'Use the device associated with the account ‘{{accountName}}’.' LedgerAPINotAvailable: 'Ledger API not available for {{currencyName}}.' -LedgerAPIError: 'Ledger API error. Try again later. (HTTP {{status}})' +LedgerAPIError: 'Ledger API error. Try again. (HTTP {{status}})' NetworkDown: 'Your internet connection seems down.' NoAddressesFound: 'No accounts were found.' UserRefusedOnDevice: Transaction refused on device. diff --git a/static/i18n/en/onboarding.yml b/static/i18n/en/onboarding.yml index d813a43f..e4078a2d 100644 --- a/static/i18n/en/onboarding.yml +++ b/static/i18n/en/onboarding.yml @@ -26,7 +26,7 @@ noDevice: trackOrder: title: Track your order learnMore: - title: Learn about Ledger Live + title: Learn about Ledger selectDevice: title: Select your device ledgerNanoCard: @@ -35,9 +35,9 @@ selectDevice: title: Ledger Blue selectPIN: disclaimer: - note1: Choose your own PIN code. This code will unlock your device. - note2: An 8-digit PIN code offers an optimum level of security. - note3: Never use a device supplied with a PIN code or a 24-word recovery phrase. + note1: Choose your own PIN code. This code will unlock your device #remove dot - dotted line should be in red. Increase size of the hand (+50%?) + note2: An 8-digit PIN code offers an optimum level of security + note3: Never use a device supplied with a PIN code or a 24-word recovery phrase initialize: title: Choose your PIN code instructions: @@ -87,10 +87,10 @@ writeSeed: step2: Type the first word of your recovery phrase. Select the word when it appears. step3: Repeat the process until the last word. disclaimer: - note1: Carefully secure your 24-word recovery phrase out of sight. - note2: Make sure you are the sole holder of your recovery phrase. - note3: Ledger does not keep any backup of your recovery phrase. - note4: Never use a device supplied with a recovery phrase or a PIN code. + note1: Carefully secure your 24-word recovery phrase out of sight + note2: Make sure you are the sole holder of your recovery phrase + note3: Ledger does not keep any backup of your recovery phrase + note4: Never use a device supplied with a recovery phrase or a PIN code genuineCheck: title: Security checklist descNano: Before getting started, please confirm @@ -101,7 +101,7 @@ genuineCheck: step2: title: Did you save your recovery phrase by yourself? step3: - title: Do you have a genuine Ledger device? + title: Is your Ledger device genuine? isGenuinePassed: Your device is genuine buttons: genuineCheck: Check now @@ -109,10 +109,10 @@ genuineCheck: errorPage: ledgerNano: title: Oops, something went wrong... - desc: Go back to the security checklist or request Ledger Support assistance. + desc: Go back to the security checklist or request Ledger Support assistance ledgerBlue: title: Oops, something went wrong... - desc: Go back to the security checklist or request Ledger Support assistance. + desc: Go back to the security checklist or request Ledger Support assistance setPassword: title: Encrypt Ledger Live data desc: Set a password to encrypt Ledger Live data stored on your computer, including account names, balances, transactions and public addresses. @@ -131,7 +131,7 @@ analytics: desc: Enable analytics of anonymous data to help Ledger improve the user experience. This includes the operating system, language, firmware versions and the number of added accounts. sentryLogs: title: Report bugs - desc: Automatically send reports to help Ledger fix bugs. + desc: Automatically send reports to help Ledger fix bugs finish: title: Your device is ready! desc: Proceed to your porfolio and start adding your accounts... diff --git a/static/i18n/fr/app.yml b/static/i18n/fr/app.yml index c156fedd..6c1ac554 100644 --- a/static/i18n/fr/app.yml +++ b/static/i18n/fr/app.yml @@ -14,7 +14,7 @@ common: selectAccount: Select an account selectAccountNoOption: 'No account matching "{{accountName}}"' selectCurrency: Choose a crypto asset - selectCurrencyNoOption: 'No currency matching "{{currencyName}}"' + selectCurrencyNoOption: 'No crypto asset matching "{{currencyName}}"' selectExchange: Select an exchange selectExchangeNoOption: 'No exchange matching "{{exchangeName}}"' sortBy: Sort by From 84ab13a8a009570391795ffa8d138198fa91b480 Mon Sep 17 00:00:00 2001 From: ddasilva Date: Tue, 26 Jun 2018 23:12:27 +0200 Subject: [PATCH 3/7] Wording updates --- static/i18n/en/app.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index e01bd94b..1ccecfd3 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -76,7 +76,7 @@ account: lastOperations: Last operations emptyState: title: No crypto assets yet? - desc: Make sure the <1><0>{{currency}} app is installed to receive crypto assets # replace [cryptocurrency] and make it bold + desc: Receive in this accoung with the the <1><0>{{currency}} app in the Manager buttons: receiveFunds: Receive settings: @@ -213,7 +213,7 @@ manager: noDashboard: Navigate to the dashboard on your device (TEMPLATED NEEDED) noGenuine: Allow the Manager to continue (TEMPLATE NEEDED) receive: - title: Receive crypto assets + title: Receive steps: chooseAccount: title: Choose account @@ -233,7 +233,7 @@ receive: title: Receive crypto assets label: Amount (optional) send: - title: Send crypto assets + title: Send totalSpent: Total steps: amount: From 814d7c9587e2a2d6da3300da53e74616cb24d4ac Mon Sep 17 00:00:00 2001 From: ddasilva Date: Wed, 27 Jun 2018 00:12:52 +0200 Subject: [PATCH 4/7] Replace funds by crypto assets, improved empty state texts --- static/i18n/en/onboarding.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/static/i18n/en/onboarding.yml b/static/i18n/en/onboarding.yml index e4078a2d..0dec341c 100644 --- a/static/i18n/en/onboarding.yml +++ b/static/i18n/en/onboarding.yml @@ -35,9 +35,9 @@ selectDevice: title: Ledger Blue selectPIN: disclaimer: - note1: Choose your own PIN code. This code will unlock your device #remove dot - dotted line should be in red. Increase size of the hand (+50%?) - note2: An 8-digit PIN code offers an optimum level of security - note3: Never use a device supplied with a PIN code or a 24-word recovery phrase + note1: 'Choose your own PIN code: this code will unlock your device.' # dotted line should be in red. Increase size of the hand (+50%?) + note2: An 8-digit PIN code offers an optimum level of security. + note3: Never use a device supplied with a PIN code or a 24-word recovery phrase. initialize: title: Choose your PIN code instructions: @@ -45,13 +45,13 @@ selectPIN: step1: Connect the Ledger Nano S to your computer. step2: Press both buttons simultaneously as instructed on the screen. step3: Press the right button to select Configure as new device?. # Configure as new device?. - step4: 'Choose a PIN code between 4 and 8 digits long followed by the checkmark (✓).' + step4: 'Choose a PIN code between 4 and 8 digits long, followed by the checkmark (✓).' blue: step1: Connect the Ledger Blue to your computer. step2: Tap on Configure as new device. step3: Choose a PIN code between 4 and 8 digits long. restore: - title: Start restoration - Choose your PIN code + title: Choose your PIN code instructions: nano: step1: Connect the Ledger Nano S to your computer. @@ -87,10 +87,10 @@ writeSeed: step2: Type the first word of your recovery phrase. Select the word when it appears. step3: Repeat the process until the last word. disclaimer: - note1: Carefully secure your 24-word recovery phrase out of sight - note2: Make sure you are the sole holder of your recovery phrase - note3: Ledger does not keep any backup of your recovery phrase - note4: Never use a device supplied with a recovery phrase or a PIN code + note1: Carefully secure your 24-word recovery phrase out of sight. + note2: Make sure you are the sole holder of your recovery phrase. + note3: Ledger does not keep any backup of your recovery phrase. + note4: Never use a device supplied with a recovery phrase or a PIN code. genuineCheck: title: Security checklist descNano: Before getting started, please confirm From 663c47ad1e36284ddd6034245e861e09de78ebae Mon Sep 17 00:00:00 2001 From: ddasilva Date: Wed, 27 Jun 2018 10:22:00 +0200 Subject: [PATCH 5/7] Treat PR comments --- static/i18n/en/app.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 1ccecfd3..0cb03d93 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -76,7 +76,7 @@ account: lastOperations: Last operations emptyState: title: No crypto assets yet? - desc: Receive in this accoung with the the <1><0>{{currency}} app in the Manager + desc: Ensure the <1><0>{{currency}} app is installed and start receiving buttons: receiveFunds: Receive settings: @@ -133,9 +133,9 @@ emptyState: exchange: title: Exchange visitWebsite: Visit website - coinhouse: 'Coinhouse is the trusted platform for individuals and institutional investors looking to analyze, acquire, sell and securely store cryptoassets.' - changelly: 'Changelly is a popular instant cryptocurrency exchange with 100+ coins and tokens listed.' - coinmama: 'Coinmama is a financial service that makes it fast, safe and fun to buy digital currency, anywhere in the world.' + coinhouse: 'Coinhouse is the trusted platform for individuals and institutional investors looking to analyze, acquire, sell and securely store crypto assets.' + changelly: 'Changelly is a popular instant crypto asset exchange with 100+ coins and tokens listed.' + coinmama: 'Coinmama is a financial service that makes it fast, safe and fun to buy digital assets, anywhere in the world.' genuinecheck: modal: title: Genuine check @@ -274,7 +274,7 @@ send: releaseNotes: title: Release notes version: Version {{versionNb}} -settings: +settings: # Always ensure descriptions carry full stops (.) title: Settings tabs: display: Display @@ -282,21 +282,21 @@ settings: profile: Profile about: Help display: - desc: + desc: Control Ledger Live's appearance. language: Display language languageDesc: Set the language displayed in Ledger Live. counterValue: Base currency counterValueDesc: Choose the currency to display next to your balance and operations. exchange: Rate provider ({{ticker}}) - exchangeDesc: Choose the provider of the base currency exchange rates + exchangeDesc: Choose the provider of the exchange rate between Bitcoin and your selected base currency. region: Region regionDesc: Choose the region in which you’re located to set the Ledger Live's time zone. stock: Regional market indicator stockDesc: Choose Western to display an increase in market value in blue. Choose Eastern to display an increase in market value in red. currencies: - desc: Select a cryptocurrency to edit its settings + desc: Select a crypto asset to edit its settings. exchange: Rate provider ({{ticker}}) - exchangeDesc: Choose the provider of the base currency exchange rates + exchangeDesc: Choose the provider of the rate between the selected crypto asset and Bitcoin. This intermediary calculation enables the calculation of your balance in your base currency, for indicative purposes only. confirmationsToSpend: Number of confirmations required to spend confirmationsToSpendDesc: Set the number of network confirmations required for your crypto assets to be spendable. # A higher number of confirmations decreases the probability that a transaction is rejected. confirmationsNb: Number of confirmations @@ -306,28 +306,28 @@ settings: explorer: Blockchain explorer explorerDesc: Choose which explorer is used to look up the operation details in the blockchain. profile: - desc: + desc: Set the preferences for your profile. password: Data encryption passwordDesc: Enhance your privacy. Set a password to encrypt Ledger Live data stored on your computer, including account names, balances, transactions and public addresses. changePassword: Change password sync: Synchronize accounts - syncDesc: Resynchronize your accounts with the network + syncDesc: Resynchronize your accounts with the network. export: Export logs - exportDesc: Exporting Ledger Live logs may be necessary for troubleshooting purposes + exportDesc: Exporting Ledger Live logs may be necessary for troubleshooting purposes. softResetTitle: Clear cache - softResetDesc: Clear the Ledger Live cache to force resynchronization with the blockchain + softResetDesc: Clear the Ledger Live cache to force resynchronization with the blockchain. softReset: Clear hardResetTitle: Reset Ledger Live - hardResetDesc: Erase all Ledger Live data stored on your computer, including your accounts, transaction history and preferences. The private keys that manage your crypto assets remain secure on your Ledger device. + hardResetDesc: Erase all Ledger Live data stored on your computer, including your accounts, transaction history and settings. The private keys to access your crypto assetsin the blockchain remain secure on your Ledger device and on your Recovery sheet. hardReset: Reset developerMode: Developer mode - developerModeDesc: Show developer apps in the Manager + developerModeDesc: Show developer apps in the Manager and enable testnet apps. analytics: Analytics analyticsDesc: Enable analytics of anonymous data to help Ledger improve the user experience. This includes the operating system, language, firmware versions and the number of added accounts. reportErrors: Usage and diagnostics reportErrorsDesc: Share anonymous usage and diagnostics data to help improve Ledger products, services and security features. about: - desc: + desc: Learn about Ledger Live features or get help. version: Ledger Live version releaseNotesBtn: Show release notes # Close button instead of continue. faq: Ledger Support @@ -338,7 +338,7 @@ settings: termsDesc: --- Check with Legal --- hardResetModal: title: Reset Ledger Live - desc: Resetting will erase all Ledger Live data stored on your computer, including your profile, accounts, transaction history and application settings. The keys to access your crypto assets in the blockchain remain secure on your Ledger device. + desc: Erase all Ledger Live data stored on your computer, including your accounts, transaction history and settings. The private keys to access your crypto assets in the blockchain remain secure on your Ledger device and on your Recovery sheet. softResetModal: title: Clear cache subTitle: Are you sure? @@ -349,7 +349,7 @@ settings: desc: The account will no longer be included in your portfolio. This operation does not affect your assets. Accounts can always be re-added. exportLogs: title: Export logs - desc: Exporting Ledger Live logs may be necessary for troubleshooting purposes + desc: Exporting Ledger Live logs may be necessary for troubleshooting purposes. btn: Export password: warning_0: Very weak From e632b2235d1b4fece5ce8ad2fd041d376aa2838f Mon Sep 17 00:00:00 2001 From: ddasilva Date: Wed, 27 Jun 2018 10:24:08 +0200 Subject: [PATCH 6/7] typo --- static/i18n/en/app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/i18n/en/app.yml b/static/i18n/en/app.yml index 0cb03d93..e90be497 100644 --- a/static/i18n/en/app.yml +++ b/static/i18n/en/app.yml @@ -318,7 +318,7 @@ settings: # Always ensure descriptions carry full stops (.) softResetDesc: Clear the Ledger Live cache to force resynchronization with the blockchain. softReset: Clear hardResetTitle: Reset Ledger Live - hardResetDesc: Erase all Ledger Live data stored on your computer, including your accounts, transaction history and settings. The private keys to access your crypto assetsin the blockchain remain secure on your Ledger device and on your Recovery sheet. + hardResetDesc: Erase all Ledger Live data stored on your computer, including your accounts, transaction history and settings. The private keys to access your crypto assets in the blockchain remain secure on your Ledger device and on your Recovery sheet. hardReset: Reset developerMode: Developer mode developerModeDesc: Show developer apps in the Manager and enable testnet apps. From 278373ed9b15aa2d198475b066c2a9a38d43ca5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Wed, 27 Jun 2018 11:32:20 +0200 Subject: [PATCH 7/7] Bootstrap analytics - Two components: and . we should try to ALWAYS use them. only case you might not use them is for imperative events (click, etc..) - also: introduce a "Use system locale" for the language because analytics need to diffferenciate if lang was set by user of fallbacked. it's also better when we'll introduce new lang to users to directly auto switch to their system's - started to track some pages and events. there will be more required and we'll have to add some in the next days --- scripts/download-analytics.sh | 10 ++ src/analytics/Track.js | 29 +++++ src/analytics/TrackPage.js | 14 +++ src/analytics/inject-in-window.js | 18 ++++ src/analytics/segment.js | 100 ++++++++++++++++++ src/components/AccountPage/index.js | 8 ++ src/components/DashboardPage/index.js | 8 ++ src/components/ExchangePage/ExchangeCard.js | 51 +++++---- src/components/ExchangePage/index.js | 44 ++++---- src/components/OperationsList/index.js | 14 +++ src/components/SettingsPage/sections/About.js | 2 + .../SettingsPage/sections/Currencies.js | 2 + .../SettingsPage/sections/Display.js | 38 ++++--- .../SettingsPage/sections/Profile.js | 2 + src/components/modals/AddAccounts/index.js | 2 + .../steps/01-step-choose-currency.js | 2 + .../steps/02-step-connect-device.js | 2 + .../AddAccounts/steps/03-step-import.js | 2 + .../AddAccounts/steps/04-step-finish.js | 2 + .../modals/Receive/01-step-account.js | 2 + .../modals/Receive/02-step-connect-device.js | 16 +++ .../modals/Receive/03-step-confirm-address.js | 2 + .../modals/Receive/04-step-receive-funds.js | 2 + src/components/modals/Receive/index.js | 4 +- src/components/modals/Send/01-step-amount.js | 3 + .../modals/Send/02-step-connect-device.js | 16 +++ .../modals/Send/03-step-verification.js | 2 + .../modals/Send/04-step-confirmation.js | 2 + src/components/modals/Send/index.js | 4 +- src/components/modals/StepConnectDevice.js | 1 + src/config/constants.js | 1 + src/helpers/staticPath.js | 8 +- src/helpers/systemLocale.js | 11 ++ src/middlewares/analytics.js | 18 ++++ src/reducers/settings.js | 47 ++++---- src/renderer/createStore.js | 1 + src/renderer/init.js | 4 +- static/analytics.min.js | 11 ++ static/i18n/en/language.yml | 1 + 39 files changed, 420 insertions(+), 86 deletions(-) create mode 100755 scripts/download-analytics.sh create mode 100644 src/analytics/Track.js create mode 100644 src/analytics/TrackPage.js create mode 100644 src/analytics/inject-in-window.js create mode 100644 src/analytics/segment.js create mode 100644 src/components/modals/Receive/02-step-connect-device.js create mode 100644 src/components/modals/Send/02-step-connect-device.js create mode 100644 src/helpers/systemLocale.js create mode 100644 src/middlewares/analytics.js create mode 100644 static/analytics.min.js diff --git a/scripts/download-analytics.sh b/scripts/download-analytics.sh new file mode 100755 index 00000000..daf8a3b1 --- /dev/null +++ b/scripts/download-analytics.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -z $ANALYTICS_KEY ]; then + echo 'ANALYTICS_KEY must be set' + exit 1 +fi + +cd `dirname $0`/.. + +wget https://cdn.segment.com/analytics.js/v1/$ANALYTICS_KEY/analytics.min.js -O static/analytics.min.js diff --git a/src/analytics/Track.js b/src/analytics/Track.js new file mode 100644 index 00000000..9c5d82e2 --- /dev/null +++ b/src/analytics/Track.js @@ -0,0 +1,29 @@ +import { PureComponent } from 'react' +import { track } from './segment' + +class Track extends PureComponent<{ + onMount?: boolean, + onUnmount?: boolean, + onUpdate?: boolean, + event: string, + properties?: Object, +}> { + componentDidMount() { + if (this.props.onMount) this.track() + } + componentDidUpdate() { + if (this.props.onUpdate) this.track() + } + componentWillUnmount() { + if (this.props.onUnmount) this.track() + } + track = () => { + const { event, properties } = this.props + track(event, properties) + } + render() { + return null + } +} + +export default Track diff --git a/src/analytics/TrackPage.js b/src/analytics/TrackPage.js new file mode 100644 index 00000000..2e18e868 --- /dev/null +++ b/src/analytics/TrackPage.js @@ -0,0 +1,14 @@ +import { PureComponent } from 'react' +import { page } from './segment' + +class TrackPage extends PureComponent<{ category: string, name?: string, properties?: Object }> { + componentDidMount() { + const { category, name, properties } = this.props + page(category, name, properties) + } + render() { + return null + } +} + +export default TrackPage diff --git a/src/analytics/inject-in-window.js b/src/analytics/inject-in-window.js new file mode 100644 index 00000000..859c2981 --- /dev/null +++ b/src/analytics/inject-in-window.js @@ -0,0 +1,18 @@ +/* eslint-disable */ +import { getPath } from 'helpers/staticPath' + +// prettier-ignore +!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t { + if (loaded) return + loaded = true + var n = document.createElement('script') + n.type = 'text/javascript' + n.async = !0 + n.src = getPath('analytics.min.js') + var a = document.getElementsByTagName('script')[0] + a.parentNode.insertBefore(n, a) +} diff --git a/src/analytics/segment.js b/src/analytics/segment.js new file mode 100644 index 00000000..d239db10 --- /dev/null +++ b/src/analytics/segment.js @@ -0,0 +1,100 @@ +// @flow + +import uuid from 'uuid/v4' +import logger from 'logger' +import invariant from 'invariant' +import user from 'helpers/user' +import { DEBUG_ANALYTICS } from 'config/constants' +import { langAndRegionSelector } from 'reducers/settings' +import { getSystemLocale } from 'helpers/systemLocale' +import { load } from './inject-in-window' + +invariant(typeof window !== 'undefined', 'analytics/segment must be called on renderer thread') + +const sessionId = uuid() + +const getContext = store => { + const state = store.getState() + const { language, region } = langAndRegionSelector(state) + const systemLocale = getSystemLocale() + return { + ip: '0.0.0.0', + appVersion: __APP_VERSION__, + language, + region, + environment: __DEV__ ? 'development' : 'production', + systemLanguage: systemLocale.language, + systemRegion: systemLocale.region, + sessionId, + } +} + +let storeInstance // is the redux store. it's also used as a flag to know if analytics is on or off. + +export const start = (store: *) => { + storeInstance = store + const { analytics } = window + if (typeof analytics === 'undefined') { + logger.error('analytics is not available') + return + } + const { id } = user() + load() + analytics.identify( + id, + {}, + { + context: getContext(store), + }, + ) + if (DEBUG_ANALYTICS) { + logger.log(`analytics: start() with user id ${id}`) + } +} + +export const stop = () => { + storeInstance = null + const { analytics } = window + if (typeof analytics === 'undefined') { + logger.error('analytics is not available') + return + } + analytics.reset() + if (DEBUG_ANALYTICS) { + logger.log(`analytics: stop()`) + } +} + +export const track = (event: string, properties: ?Object) => { + if (!storeInstance) { + return + } + const { analytics } = window + if (typeof analytics === 'undefined') { + logger.error('analytics is not available') + return + } + analytics.track(event, properties, { + context: getContext(storeInstance), + }) + if (DEBUG_ANALYTICS) { + logger.log(`analytics: track(${event},`, properties) + } +} + +export const page = (category: string, name: ?string, properties: ?Object) => { + if (!storeInstance) { + return + } + const { analytics } = window + if (typeof analytics === 'undefined') { + logger.error('analytics is not available') + return + } + analytics.page(category, name, properties, { + context: getContext(storeInstance), + }) + if (DEBUG_ANALYTICS) { + logger.log(`analytics: page(${category}, ${name || ''},`, properties) + } +} diff --git a/src/components/AccountPage/index.js b/src/components/AccountPage/index.js index 29797f2c..2da8032f 100644 --- a/src/components/AccountPage/index.js +++ b/src/components/AccountPage/index.js @@ -9,6 +9,7 @@ import styled from 'styled-components' import type { Currency, Account } from '@ledgerhq/live-common/lib/types' import SyncOneAccountOnMount from 'components/SyncOneAccountOnMount' import Tooltip from 'components/base/Tooltip' +import TrackPage from 'analytics/TrackPage' import { MODAL_SEND, MODAL_RECEIVE, MODAL_SETTINGS_ACCOUNT } from 'config/constants' @@ -106,6 +107,13 @@ class AccountPage extends PureComponent { return ( // Force re-render account page, for avoid animation + diff --git a/src/components/DashboardPage/index.js b/src/components/DashboardPage/index.js index 9ffcd9a4..2582a017 100644 --- a/src/components/DashboardPage/index.js +++ b/src/components/DashboardPage/index.js @@ -1,6 +1,7 @@ // @flow import React, { PureComponent, Fragment } from 'react' +import uniq from 'lodash/uniq' import { compose } from 'redux' import { translate } from 'react-i18next' import { connect } from 'react-redux' @@ -26,6 +27,7 @@ import type { TimeRange } from 'reducers/settings' import { reorderAccounts } from 'actions/accounts' import { saveSettings } from 'actions/settings' +import TrackPage from 'analytics/TrackPage' import UpdateNotifier from 'components/UpdateNotifier' import BalanceInfos from 'components/BalanceSummary/BalanceInfos' import BalanceSummary from 'components/BalanceSummary' @@ -92,12 +94,18 @@ class DashboardPage extends PureComponent { const timeFrame = this.handleGreeting() const imagePath = i('empty-account-tile.svg') const totalAccounts = accounts.length + const totalCurrencies = uniq(accounts.map(a => a.currency.id)).length + const totalOperations = accounts.reduce((sum, a) => sum + a.operations.length, 0) const displayOperationsHelper = (account: Account) => account.operations.length > 0 const displayOperations = accounts.some(displayOperationsHelper) return ( + {totalAccounts > 0 ? ( diff --git a/src/components/ExchangePage/ExchangeCard.js b/src/components/ExchangePage/ExchangeCard.js index 7e6a00b8..0ae25b9d 100644 --- a/src/components/ExchangePage/ExchangeCard.js +++ b/src/components/ExchangePage/ExchangeCard.js @@ -1,7 +1,8 @@ // @flow -import React from 'react' +import React, { PureComponent } from 'react' import { shell } from 'electron' +import { track } from 'analytics/segment' import type { T } from 'types/common' @@ -10,31 +11,35 @@ import Box, { Card } from 'components/base/Box' import { FakeLink } from 'components/base/Link' type CardType = { + id: string, logo: any, - desc: string, url: string, } -export default function ExchangeCard({ t, card }: { t: T, card: CardType }) { - const { logo, desc } = card - return ( - shell.openExternal(card.url)} - > - - {logo} - - - {desc} - - {t('app:exchange.visitWebsite')} - +export default class ExchangeCard extends PureComponent<{ t: T, card: CardType }> { + onClick = () => { + const { card } = this.props + shell.openExternal(card.url) + track('VisitExchange', { id: card.id, url: card.url }) + } + render() { + const { + card: { logo, id }, + t, + } = this.props + return ( + + + {logo} - - - ) + + {t(`app:exchange.${id}`)} + + {t('app:exchange.visitWebsite')} + + + + + ) + } } diff --git a/src/components/ExchangePage/index.js b/src/components/ExchangePage/index.js index f5c7f129..d4e5a799 100644 --- a/src/components/ExchangePage/index.js +++ b/src/components/ExchangePage/index.js @@ -5,6 +5,7 @@ import { translate } from 'react-i18next' import type { T } from 'types/common' +import TrackPage from 'analytics/TrackPage' import Box from 'components/base/Box' import ExchangeCard from './ExchangeCard' @@ -16,32 +17,33 @@ type Props = { t: T, } +const cards = [ + { + key: 'coinhouse', + id: 'coinhouse', + url: 'https://www.coinhouse.com/r/157530', + logo: , + }, + { + key: 'changelly', + id: 'coinhouse', + url: 'https://changelly.com/?ref_id=aac789605a01', + logo: , + }, + { + key: 'coinmama', + id: 'coinhouse', + url: 'http://go.coinmama.com/visit/?bta=51801&nci=5343', + logo: , + }, +] + class ExchangePage extends PureComponent { render() { const { t } = this.props - const cards = [ - { - key: 'coinhouse', - url: 'https://www.coinhouse.com/r/157530', - logo: , - desc: t('app:exchange.coinhouse'), - }, - { - key: 'changelly', - url: 'https://changelly.com/?ref_id=aac789605a01', - logo: , - desc: t('app:exchange.changelly'), - }, - { - key: 'coinmama', - url: 'http://go.coinmama.com/visit/?bta=51801&nci=5343', - logo: , - desc: t('app:exchange.coinmama'), - }, - ] - return ( + {t('app:exchange.title')} diff --git a/src/components/OperationsList/index.js b/src/components/OperationsList/index.js index 6fdcece6..6a9d5bc4 100644 --- a/src/components/OperationsList/index.js +++ b/src/components/OperationsList/index.js @@ -25,6 +25,7 @@ import IconAngleDown from 'icons/AngleDown' import Box, { Card } from 'components/base/Box' import Text from 'components/base/Text' import Defer from 'components/base/Defer' +import Track from 'analytics/Track' import SectionTitle from './SectionTitle' import OperationC from './Operation' @@ -129,6 +130,19 @@ export class OperationsList extends PureComponent { ))} + {groupedOperations.completed ? ( + sum + s.data.length, + 0, + ), + }} + /> + ) : null} {!groupedOperations.completed ? ( {t('app:common.showMore')} diff --git a/src/components/SettingsPage/sections/About.js b/src/components/SettingsPage/sections/About.js index c2e2bf50..24ef9871 100644 --- a/src/components/SettingsPage/sections/About.js +++ b/src/components/SettingsPage/sections/About.js @@ -14,6 +14,7 @@ import { Tabbable } from 'components/base/Box' import { openModal } from 'reducers/modals' import { MODAL_RELEASES_NOTES } from 'config/constants' +import TrackPage from 'analytics/TrackPage' import { SettingsSection as Section, @@ -61,6 +62,7 @@ class SectionAbout extends PureComponent { return (
+
} title={t('app:settings.tabs.about')} diff --git a/src/components/SettingsPage/sections/Currencies.js b/src/components/SettingsPage/sections/Currencies.js index bef1773d..30055332 100644 --- a/src/components/SettingsPage/sections/Currencies.js +++ b/src/components/SettingsPage/sections/Currencies.js @@ -18,6 +18,7 @@ import type { SettingsState } from 'reducers/settings' import { currenciesSelector } from 'reducers/accounts' import { currencySettingsDefaults } from 'helpers/SettingsDefaults' +import TrackPage from 'analytics/TrackPage' import SelectCurrency from 'components/SelectCurrency' import StepperNumber from 'components/base/StepperNumber' import ExchangeSelect from 'components/SelectExchange' @@ -94,6 +95,7 @@ class TabCurrencies extends PureComponent { const defaults = currencySettingsDefaults(currency) return (
+
} title={t('app:settings.tabs.currencies')} diff --git a/src/components/SettingsPage/sections/Display.js b/src/components/SettingsPage/sections/Display.js index 4c17ba93..cc25139a 100644 --- a/src/components/SettingsPage/sections/Display.js +++ b/src/components/SettingsPage/sections/Display.js @@ -13,6 +13,7 @@ import { import type { SettingsState as Settings } from 'reducers/settings' import type { T } from 'types/common' +import TrackPage from 'analytics/TrackPage' import Box from 'components/base/Box' import SelectExchange from 'components/SelectExchange' import Select from 'components/base/Select' @@ -52,9 +53,9 @@ type Props = { type State = { cachedMarketIndicator: string, - cachedLanguageKey: string, + cachedLanguageKey: ?string, cachedCounterValue: ?Object, - cachedRegion: string, + cachedRegion: ?string, } class TabProfile extends PureComponent { @@ -131,9 +132,12 @@ class TabProfile extends PureComponent { const counterValueCurrency = counterValueCurrencyLocalSelector(settings) const counterValueExchange = counterValueExchangeLocalSelector(settings) - const languages = languageKeys.map(key => ({ value: key, label: t(`language:${key}`) })) - const currentLanguage = languages.find(l => l.value === cachedLanguageKey) + const languages = [{ value: null, label: t(`language:system`) }].concat( + languageKeys.map(key => ({ value: key, label: t(`language:${key}`) })), + ) const regionsFiltered = regions.filter(({ language }) => cachedLanguageKey === language) + + const currentLanguage = languages.find(l => l.value === cachedLanguageKey) const currentRegion = regionsFiltered.find(({ region }) => cachedRegion === region) || regionsFiltered[0] @@ -143,6 +147,7 @@ class TabProfile extends PureComponent { return (
+
} title={t('app:settings.tabs.display')} @@ -187,16 +192,21 @@ class TabProfile extends PureComponent { options={languages} /> - - item && item.name} + value={currentRegion} + options={regionsFiltered} + /> + + )} { const isPasswordEnabled = settings.password.isEnabled === true return (
+
} title={t('app:settings.tabs.profile')} diff --git a/src/components/modals/AddAccounts/index.js b/src/components/modals/AddAccounts/index.js index 3d56f246..31aed232 100644 --- a/src/components/modals/AddAccounts/index.js +++ b/src/components/modals/AddAccounts/index.js @@ -6,6 +6,7 @@ import { connect } from 'react-redux' import { translate } from 'react-i18next' import { createStructuredSelector } from 'reselect' +import Track from 'analytics/Track' import SyncSkipUnderPriority from 'components/SyncSkipUnderPriority' import type { Currency, Account } from '@ledgerhq/live-common/lib/types' @@ -227,6 +228,7 @@ class AddAccounts extends PureComponent { steps={this.STEPS} {...addtionnalProps} > + )} diff --git a/src/components/modals/AddAccounts/steps/01-step-choose-currency.js b/src/components/modals/AddAccounts/steps/01-step-choose-currency.js index 86a1e2e0..214168f8 100644 --- a/src/components/modals/AddAccounts/steps/01-step-choose-currency.js +++ b/src/components/modals/AddAccounts/steps/01-step-choose-currency.js @@ -2,6 +2,7 @@ import React, { Fragment } from 'react' +import TrackPage from 'analytics/TrackPage' import SelectCurrency from 'components/SelectCurrency' import Button from 'components/base/Button' import CurrencyBadge from 'components/base/CurrencyBadge' @@ -15,6 +16,7 @@ function StepChooseCurrency({ currency, setCurrency }: StepProps) { export function StepChooseCurrencyFooter({ transitionTo, currency, t }: StepProps) { return ( + {currency && }