diff --git a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx index dbd61d0056..d61f020aa9 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/module/PortfolioContextProvider.tsx @@ -10,6 +10,20 @@ import { defaultPortfolioState, } from './state'; +export const PortfolioDetailsTab = { + Performance: 'Performance', + Overview: 'Overview', + Transactions: 'Transactions', +} as const; +export type PortfolioDetailsTab = typeof PortfolioDetailsTab[keyof typeof PortfolioDetailsTab]; + +export const PortfolioListTab = { + Wallet: 'Wallet', + Dapps: 'Dapps', +} as const; + +export type PortfolioListTab = typeof PortfolioListTab[keyof typeof PortfolioListTab]; + import BuySellDialog from '../../../../components/buySell/BuySellDialog'; import { DEFAULT_FIAT_PAIR } from '../common/helpers/constants'; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx index 5601e79fd2..e798c56f71 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/ChartDetails/MarketPriceOverview.tsx @@ -27,21 +27,18 @@ export const TokenMarketPriceOverview = ({ chartData, detailInfo, tokenInfo, isD // Fetch data based on the selected interval const ptActivity = useCurrencyPairing().ptActivity; - const { changeValue, changePercent } = priceChange(ptActivity.open, ptActivity.close); + const { changeValue, changePercent } = priceChange(ptActivity.open, ptActivity?.close); const { tokenActivity: { data24h }, } = usePortfolioTokenActivity(); - const deltaPriceChange = - !isPrimaryToken && - !isEmpty(data24h) && - data24h[tokenInfo?.info?.id][1].price.close - data24h[tokenInfo?.info?.id][1].price.open; + const deltaPriceChange = !isPrimaryToken && !isEmpty(data24h) && data24h[tokenInfo?.info?.id][1].price?.change; const priceChangeProcent = isPrimaryToken ? detailInfo?.changePercent || changePercent : !isEmpty(data24h) && deltaPriceChange; const priceChangeValue = isPrimaryToken ? detailInfo?.changeValue || changeValue - : !isEmpty(data24h) && data24h[tokenInfo?.info?.id][1].price.close; + : !isEmpty(data24h) && data24h[tokenInfo?.info?.id][1].price?.close - data24h[tokenInfo?.info?.id][1].price?.open; return ( { - const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryTokenActivity && secondaryTokenActivity[1].price.close; + const tokenPrice = isPrimaryToken ? ptActivity.close : secondaryTokenActivity && secondaryTokenActivity[1].price?.close; - const sPrice = secondaryTokenActivity && secondaryTokenActivity[1].price.close; + const sPrice = secondaryTokenActivity && secondaryTokenActivity[1].price?.close; const ptPrice = isDragging ? detailInfo.value : ptActivity.close; const ptUnitPrice = sPrice * ptPrice; + if (!isPrimaryToken && isNaN(ptUnitPrice)) { + return -; + } + if (tokenPrice == null) return ; return ( @@ -102,6 +103,8 @@ const TokenPrice = ({ isPrimaryToken, unitOfAccount, secondaryTokenActivity, ptA const PriceChangeChip = ({ value }: { value: number }) => { const theme: any = useTheme(); + const valueToDisplay = value >= 0 ? formatNumber(value) : formatNumber(-1 * value); + return ( <> { ) : null} {/* @ts-ignore */} - {value >= 0 ? formatNumber(value) : formatNumber(-1 * value)}% + {valueToDisplay === 'NaN' ? '-' : valueToDisplay}% } /> @@ -129,7 +132,7 @@ const PriceValueChip = ({ value, unitOfAccount }: { value: number; unitOfAccount label={ {value > 0 && '+'} - {formatNumber(value)} {unitOfAccount} + {formatNumber(value) === 'NaN' ? '-' : formatNumber(value)} {unitOfAccount} } /> diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx index 6cc7e50a8c..236a2d6f48 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/HeaderDetails/Header.tsx @@ -35,10 +35,14 @@ const HeaderSection = ({ tokenInfo }: Props): JSX.Element => { const totaPriceCalc = React.useMemo(() => { if (!isPrimaryToken && !isEmpty(data24h)) { - const tokenPrice = data24h && data24h[tokenInfo.info.id][1]?.price.close; + const tokenPrice = data24h && data24h[tokenInfo.info.id][1]?.price?.close; const tokenQuantityAsBigInt = bigNumberToBigInt(new BigNumber(tokenInfo.quantity)); const tokenDecimals = !isPrimaryToken && tokenInfo.info.numberOfDecimals; + if (tokenPrice === undefined && !isPrimaryToken) { + return '-'; + } + const totaPrice = atomicBreakdown(tokenQuantityAsBigInt, tokenDecimals) .bn.times(tokenPrice ?? 1) .times(String(ptPrice)) diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx index e9d263aae4..aef4202a32 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/OverviewPerformanceDetails/Overview.tsx @@ -28,6 +28,10 @@ const Overview = ({ tokenInfo }: Props): JSX.Element => { }} component="img" src={tokenInfo.info.image || tokenPng} + onError={e => { + // @ts-ignore + e.target.src = tokenPng; + }} > diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx index b5da8d1ba5..28987f4a37 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokenDetails/TokenDetails.tsx @@ -1,10 +1,12 @@ import { Box, Divider, Stack } from '@mui/material'; import { styled, useTheme } from '@mui/material/styles'; -import React from 'react'; +import React, { useEffect } from 'react'; +import { ampli } from '../../../../../../ampli'; import { BackButton, Card } from '../../../../components'; import NavigationButton from '../../common/components/NavigationButton'; import { useNavigateTo } from '../../common/hooks/useNavigateTo'; import { useStrings } from '../../common/hooks/useStrings'; +import { PortfolioDetailsTab } from '../../module/PortfolioContextProvider'; import { TokenChartInterval } from './ChartDetails/TokenChartInterval'; import HeaderSection from './HeaderDetails/Header'; import OverviewPerformance from './OverviewPerformanceDetails/OverviewPerformance'; @@ -28,6 +30,10 @@ const TokenDetails = ({ tokenInfo }: Props): JSX.Element => { const strings = useStrings(); const isPrimaryToken: boolean = tokenInfo.id === '-'; + useEffect(() => { + ampli.portfolioTokenDetails({ token_details_tab: PortfolioDetailsTab.Overview }); + }, []); + return (
diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx index 95a653e237..e5e8e4dc26 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/TableColumnsChip.tsx @@ -179,7 +179,10 @@ export const TokenPriceTotal = ({ token, secondaryToken24Activity }) => { .toFormat(decimals); const totalTicker = isPrimary && showingAda ? accountPair?.to.name : accountPair?.from.name; - const totalTokenPrice = isPrimary && showingAda ? '' : `${totaPrice} ${totalTicker || DEFAULT_FIAT_PAIR}`; + const totalTokenPrice = + isPrimary && showingAda + ? '' + : `${isPrimary ? totaPrice : tokenPrice !== undefined ? totaPrice : '-'} ${totalTicker || DEFAULT_FIAT_PAIR}`; return ( diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx index d95563a97b..892d006d68 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/TokensTable/useProcentage.tsx @@ -36,7 +36,8 @@ export const useProcessedTokenData = ({ data, ptActivity, data24h, data7d, data3 const unitPrice = parseFloat((tokenPrice * ptActivity?.close || 1).toFixed(4)); const primaryTokenFiatTotalAmount = formatValue(primaryTokenInfo.quantity.multipliedBy(String(ptActivity?.close))); - return { totalValue: isPrimaryToken ? primaryTokenFiatTotalAmount : totalValue, unitPrice }; + const tokenValueDisplay = secondaryToken24Activity && secondaryToken24Activity[0] === 500 ? 0 : totalValue; + return { totalValue: isPrimaryToken ? primaryTokenFiatTotalAmount : tokenValueDisplay, unitPrice }; }; const getTokenActivityChange = (tokenId, activityData, isPrimaryToken) => { @@ -81,9 +82,15 @@ export const useProcessedTokenData = ({ data, ptActivity, data24h, data7d, data3 '24h': changePercent24, '1W': isPrimaryToken ? ptTokenDataInterval7d?.[167]?.changePercent : changePercent7d, '1M': isPrimaryToken ? ptTokenDataInterval1M?.[179]?.changePercent : changePercent30d, + isSpecialName: /^[^a-zA-Z]/.test(token.info.name), // Flag for names starting with numbers or weird characters }; }) - .sort((a, b) => b.percentage - a.percentage); + .sort((a, b) => { + // Move tokens with special names to the end + if (a.isSpecialName && !b.isSpecialName) return 1; + if (!a.isSpecialName && b.isSpecialName) return -1; + return b.percentage - a.percentage; + }); }, [data, ptActivity, data24h, data7d, data30d, primaryTokenInfo, ptTokenDataInterval7d, ptTokenDataInterval1M]); return processedData; diff --git a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx index eddb007961..e652cb8602 100644 --- a/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx +++ b/packages/yoroi-extension/app/UI/features/portfolio/useCases/Wallet/PortfolioWallet.tsx @@ -1,12 +1,18 @@ import { Stack, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import React, { useEffect, useState } from 'react'; +import { ampli } from '../../../../../../ampli/index'; import PortfolioHeader from '../../common/components/PortfolioHeader'; import WelcomeBanner from '../../common/components/WelcomeBanner'; import { useStrings } from '../../common/hooks/useStrings'; -import { usePortfolio } from '../../module/PortfolioContextProvider'; +import { PortfolioListTab, usePortfolio } from '../../module/PortfolioContextProvider'; import StatsTable from '../TokensTable/StatsTable'; +const tabs = { + [PortfolioListTab.Wallet]: 'Wallet Token', + [PortfolioListTab.Dapps]: 'Dapps Token', +} as const; + const PortfolioWallet = (): JSX.Element => { const theme = useTheme(); const strings = useStrings(); @@ -16,6 +22,10 @@ const PortfolioWallet = (): JSX.Element => { const [isLoading, _] = useState(false); const [tokenList, setTokenList] = useState(ftAssetList); + useEffect(() => { + ampli.portfolioTokensListPageViewed({ tokens_tab: tabs[PortfolioListTab.Wallet] }); + }, []); + useEffect(() => { if (!keyword || showWelcomeBanner) { setTokenList(ftAssetList); @@ -35,6 +45,18 @@ const PortfolioWallet = (): JSX.Element => { } else { setTokenList([]); } + + let timeout: ReturnType | undefined; + const sendMetrics = () => { + clearTimeout(timeout); + timeout = setTimeout(() => { + ampli.portfolioTokensListSearchActivated({ search_term: lowercaseKeyword }); + }, 500); // 0.5s requirement + }; + + if (lowercaseKeyword.length > 0) sendMetrics(); + + return () => clearTimeout(timeout); }, [keyword]); return ( diff --git a/packages/yoroi-extension/app/components/transfer/BaseTransferPage.js b/packages/yoroi-extension/app/components/transfer/BaseTransferPage.js index c3b8e00794..c87f7f6aa7 100644 --- a/packages/yoroi-extension/app/components/transfer/BaseTransferPage.js +++ b/packages/yoroi-extension/app/components/transfer/BaseTransferPage.js @@ -55,7 +55,6 @@ export default class BaseTransferPage extends Component { actions={actions} closeOnOverlayClick={false} onClose={onBack} - className={undefined} backButton={} > diff --git a/packages/yoroi-extension/app/components/transfer/cards/TransferTypeSelect.js b/packages/yoroi-extension/app/components/transfer/cards/TransferTypeSelect.js index 170048e229..7813c07f4d 100644 --- a/packages/yoroi-extension/app/components/transfer/cards/TransferTypeSelect.js +++ b/packages/yoroi-extension/app/components/transfer/cards/TransferTypeSelect.js @@ -23,6 +23,10 @@ const messages = defineMessages({ id: 'wallet.transfer.subInstruction', defaultMessage: '!!!Learn more about Byron and Shelley eras and how to claim ADA on our', }, + faqAbbreviation: { + id: 'settings.support.faq.abbreviation', + defaultMessage: '!!!FAQ', + } }); @observer @@ -39,7 +43,7 @@ export default class TransferTypeSelect extends Component { onClick={event => handleExternalLinkClick(event)} id="settings:support-faq-link" > - FAQ + {intl.formatMessage(messages.faqAbbreviation)} ); diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/CheckDialog.js b/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/CheckDialog.js index 00c102205a..6235ba4141 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/CheckDialog.js +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/CheckDialog.js @@ -16,14 +16,15 @@ import ProgressStepBlock from '../common/ProgressStepBlock'; import HelpLinkBlock from './HelpLinkBlock'; import HWErrorBlock from '../common/HWErrorBlock'; -import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; -import { ReactComponent as AboutPrerequisiteIconSVG } from '../../../../assets/images/hardware-wallet/check-prerequisite-header-icon.inline.svg'; -import { ReactComponent as AboutPrerequisiteTrezorSVG } from '../../../../assets/images/hardware-wallet/trezor/check.inline.svg'; -import { ReactComponent as AboutTrezorSvg } from '../../../../assets/images/hardware-wallet/trezor/check-modern.inline.svg'; +import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; +import { ReactComponent as AboutPrerequisiteIconSVG } from '../../../../assets/images/hardware-wallet/check-prerequisite-header-icon.inline.svg'; +import { ReactComponent as AboutPrerequisiteTrezorSVG } from '../../../../assets/images/hardware-wallet/trezor/check.inline.svg'; +import { ReactComponent as AboutTrezorSvg } from '../../../../assets/images/hardware-wallet/trezor/check-modern.inline.svg'; import { ProgressInfo } from '../../../../types/HWConnectStoreTypes'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; import styles from '../common/CheckDialog.scss'; +import { Link, Box, styled, Stack, Typography } from '@mui/material'; const messages = defineMessages({ aboutPrerequisite1Part1Text: { @@ -63,52 +64,56 @@ type Props = {| +classicTheme: boolean, |}; +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + @observer export default class CheckDialog extends Component { - - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { + intl: intlShape.isRequired, }; render(): Node { const { intl } = this.context; - const { - progressInfo, - isActionProcessing, - error, - onExternalLinkClick, - submit, - cancel, - classicTheme, - } = this.props; + const { progressInfo, isActionProcessing, error, onExternalLinkClick, submit, cancel, classicTheme } = this.props; const middleBlock = (
{!classicTheme && }
-
- - + + + + + {intl.formatMessage(globalMessages.hwConnectDialogAboutPrerequisiteHeader)} - -
- + + + + + + • {intl.formatMessage(messages.aboutPrerequisite1Part1Text) + ' '} + + onExternalLinkClick(event)}> + + + + + {intl.formatMessage(messages.aboutPrerequisite1Part2)} + + • {intl.formatMessage(messages.aboutPrerequisite2)} + • {intl.formatMessage(messages.aboutPrerequisite3)} + + • {intl.formatMessage(globalMessages.hwConnectDialogAboutPrerequisite4)} + + • {intl.formatMessage(messages.aboutPrerequisite5)} +
{classicTheme && ( @@ -116,14 +121,17 @@ export default class CheckDialog extends Component {
)} - ); + + ); - const dailogActions = [{ - label: intl.formatMessage(globalMessages.nextButtonLabel), - primary: true, - onClick: submit, - isSubmitting: isActionProcessing, - }]; + const dailogActions = [ + { + label: intl.formatMessage(globalMessages.nextButtonLabel), + primary: true, + onClick: submit, + isSubmitting: isActionProcessing, + }, + ]; return ( { > {middleBlock} - {error && - - } + {error && } - ); + + ); } } diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/ConnectDialog.js b/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/ConnectDialog.js index 3d396b6c95..66da73effb 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/ConnectDialog.js +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/ConnectDialog.js @@ -17,10 +17,10 @@ import HelpLinkBlock from './HelpLinkBlock'; import HWErrorBlock from '../common/HWErrorBlock'; import connectLoadImage from '../../../../assets/images/hardware-wallet/trezor/connect-load-modern.inline.gif'; -import { ReactComponent as ConnectErrorImage } from '../../../../assets/images/hardware-wallet/trezor/connect-error-modern.inline.svg'; +import { ReactComponent as ConnectErrorImage } from '../../../../assets/images/hardware-wallet/trezor/connect-error-modern.inline.svg'; import connectLoadGIF from '../../../../assets/images/hardware-wallet/trezor/connect-load.gif'; -import { ReactComponent as ConnectErrorSVG } from '../../../../assets/images/hardware-wallet/trezor/connect-error.inline.svg'; +import { ReactComponent as ConnectErrorSVG } from '../../../../assets/images/hardware-wallet/trezor/connect-error.inline.svg'; import { ProgressInfo } from '../../../../types/HWConnectStoreTypes'; import { StepState } from '../../../widgets/ProgressSteps'; @@ -30,6 +30,7 @@ import { Logger } from '../../../../utils/logging'; import styles from '../common/ConnectDialog.scss'; import headerMixin from '../../../mixins/HeaderBlock.scss'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; +import { Typography } from '@mui/material'; const connectStartGIF = connectLoadGIF; @@ -52,27 +53,18 @@ type Props = {| +goBack: void => void, +submit: void => PossiblyAsync, +cancel: void => void, - +classicTheme: boolean + +classicTheme: boolean, |}; @observer export default class ConnectDialog extends Component { - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { + intl: intlShape.isRequired, }; render(): Node { const { intl } = this.context; - const { - progressInfo, - isActionProcessing, - error, - onExternalLinkClick, - goBack, - submit, - cancel, - classicTheme - } = this.props; + const { progressInfo, isActionProcessing, error, onExternalLinkClick, goBack, submit, cancel, classicTheme } = this.props; const introBlock = classicTheme ? (
@@ -85,11 +77,11 @@ export default class ConnectDialog extends Component {
) : (
- + {intl.formatMessage(messages.connectIntroTextLine1) + ' '} {intl.formatMessage(messages.connectIntroTextLine2) + ' '} {intl.formatMessage(globalMessages.hwConnectDialogConnectIntroTextLine3)} - +
); @@ -98,40 +90,42 @@ export default class ConnectDialog extends Component { switch (progressInfo.stepState) { case StepState.LOAD: - backButton = (); + backButton = ; middleBlock = (
-
); + + ); break; case StepState.PROCESS: backButton = null; middleBlock = (
-
); + + ); break; case StepState.ERROR: - backButton = (); + backButton = ; middleBlock = (
- {classicTheme - ? - : - } -
); + {classicTheme ? : } + + ); break; default: Logger.error('trezorConnect::ConnectDialog::render: something unexpected happened'); break; } - const dailogActions = [{ - label: intl.formatMessage(globalMessages.connectLabel), - primary: true, - isSubmitting: isActionProcessing, - onClick: submit - }]; + const dailogActions = [ + { + label: intl.formatMessage(globalMessages.connectLabel), + primary: true, + isSubmitting: isActionProcessing, + onClick: submit, + }, + ]; return ( { {introBlock} {middleBlock} - {error && - - } + {error && } - ); + + ); } } diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/HelpLinkBlock.js b/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/HelpLinkBlock.js index bb17699a4b..807686978b 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/HelpLinkBlock.js +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/trezor/HelpLinkBlock.js @@ -4,9 +4,10 @@ import type { Node } from 'react'; import { observer } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; -import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; +import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; import styles from '../common/HelpLinkBlock.scss'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; +import { Link } from '@mui/material'; const messages = defineMessages({ helpLinkYoroiWithTrezor: { @@ -25,9 +26,8 @@ type Props = {| @observer export default class HelpLinkBlock extends Component { - - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { + intl: intlShape.isRequired, }; render(): Node { @@ -36,13 +36,11 @@ export default class HelpLinkBlock extends Component { return ( ); + + + ); } } diff --git a/packages/yoroi-extension/app/i18n/locales/en-US.json b/packages/yoroi-extension/app/i18n/locales/en-US.json index 501e9d078f..adfa645487 100644 --- a/packages/yoroi-extension/app/i18n/locales/en-US.json +++ b/packages/yoroi-extension/app/i18n/locales/en-US.json @@ -319,6 +319,7 @@ "settings.support.faq.faqLink": "FAQ on Yoroi website", "settings.support.faq.faqLinkURL": "https://yoroi-wallet.com/faq/", "settings.support.faq.title": "Frequently asked questions", + "settings.support.faq.abbreviation": "FAQ", "settings.support.logs.content": "If you want to inspect logs, you can {downloadLogsLink}. Logs do not contain sensitive information, and it would be helpful to attach them to problem reports to help the team investigate the issue you are experiencing.", "settings.support.logs.downloadLogsButtonLabel": "Download Logs", "settings.support.logs.downloadLogsLink": "download them here",