From 45e3b8d93fc6445dec6b76331b009ca9860d407c Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Thu, 16 Jun 2022 11:59:48 +0200 Subject: [PATCH 01/83] feat/LIVE-2453-receive-flow-navigation-setup new navigator added for the improved receive flow --- .../src/components/FabActions.tsx | 2 +- .../RootNavigator/BaseNavigator.tsx | 3 +- .../NewReceiveFundsNavigator.tsx | 56 +++++++++++++++++++ .../src/const/navigation.js | 1 + .../src/screens/SelectAccount.tsx | 5 +- .../src/screens/SelectCrypto.tsx | 25 +++++++++ 6 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx create mode 100644 apps/ledger-live-mobile/src/screens/SelectCrypto.tsx diff --git a/apps/ledger-live-mobile/src/components/FabActions.tsx b/apps/ledger-live-mobile/src/components/FabActions.tsx index c610cddc6090..df9018b4d756 100644 --- a/apps/ledger-live-mobile/src/components/FabActions.tsx +++ b/apps/ledger-live-mobile/src/components/FabActions.tsx @@ -376,7 +376,7 @@ const FabActions: React.FC = ({ navigationParams: [ NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveSelectAccount, + screen: ScreenName.ReceiveSelectCrypto, }, ], }; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx index d4277e1ef0d7..aca54a36659c 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx @@ -26,6 +26,7 @@ import { ErrorHeaderInfo } from "./BaseOnboardingNavigator"; import SettingsNavigator from "./SettingsNavigator"; import BuyDeviceNavigator from "./BuyDeviceNavigator"; import ReceiveFundsNavigator from "./ReceiveFundsNavigator"; +import NewReceiveFundsNavigator from "./NewReceiveFundsNavigator"; import SendFundsNavigator from "./SendFundsNavigator"; import SignMessageNavigator from "./SignMessageNavigator"; import SignTransactionNavigator from "./SignTransactionNavigator"; @@ -150,7 +151,7 @@ export default function BaseNavigator() { /> getStackNavigatorConfig(colors, true), + [colors], + ); + return ( + + {/* Select Crypto (see : apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.js) */} + + {/* Select Account */} + + {/* Select / Connect Device */} + + {/* Add account(s) automatically */} + {/* Receive Address */} + + {/* Receive Address Device Verification */} + + ); +} + +const Stack = createStackNavigator(); diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 3ef23b4f87c3..9d9090ead33d 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -103,6 +103,7 @@ export const ScreenName = { RateProviderSettings: "RateProviderSettings", ReceiveConfirmation: "ReceiveConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", + ReceiveSelectCrypto: "ReceiveSelectCrypto", ReceiveSelectAccount: "ReceiveSelectAccount", RegionSettings: "RegionSettings", RepairDevice: "RepairDevice", diff --git a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx index 450336400b59..f1e5dc055114 100644 --- a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx @@ -10,6 +10,7 @@ import { isAccountEmpty, getAccountSpendableBalance, } from "@ledgerhq/live-common/lib/account"; +import { ScreenName } from "../const"; import { NotEnoughBalance } from "@ledgerhq/errors"; import { accountsSelector } from "../reducers/accounts"; import { TrackScreen } from "../analytics"; @@ -80,14 +81,14 @@ export default function ReceiveFunds({ navigation, route }: Props) { if (!isNaN(minBalance) && balance.lte(minBalance)) { setError(new NotEnoughBalance()); } else { - navigation.navigate(next, { + navigation.navigate(ScreenName.ReceiveConnectDevice, { account, accountId: account.id, parentId: account.type !== "Account" ? account.parentId : undefined, }); } }, - [minBalance, navigation, next], + [minBalance, navigation], ); return ( diff --git a/apps/ledger-live-mobile/src/screens/SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/SelectCrypto.tsx new file mode 100644 index 000000000000..4926dbae3946 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/SelectCrypto.tsx @@ -0,0 +1,25 @@ +import React, { useCallback } from "react"; +import { Flex, Text, Button } from "@ledgerhq/native-ui"; +import { ScreenName } from "../const"; + +type Props = { + navigation: any; + route: { + params?: {}; + }; +}; + +export default function SelectCrypto({ navigation, route }: Props) { + const goToNext = useCallback(() => { + navigation.navigate(ScreenName.ReceiveSelectAccount, { + ...route.params, + }); + }, [navigation, route]); + + return ( + + Select Crypto + + + ); +} From ededb06796b20338f8bfd48a2cfc4650869ecb28 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Thu, 16 Jun 2022 16:28:20 +0200 Subject: [PATCH 02/83] feat/LIVE-2449-receive-flow-select-account-screen new select account done --- .../src/components/AccountCard.tsx | 17 ++- .../NewReceiveFundsNavigator.tsx | 19 ++- .../src/screens/SelectAccount.tsx | 116 ++++++++---------- 3 files changed, 83 insertions(+), 69 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/AccountCard.tsx b/apps/ledger-live-mobile/src/components/AccountCard.tsx index 1e78765efa61..b6b6462f44bd 100644 --- a/apps/ledger-live-mobile/src/components/AccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/AccountCard.tsx @@ -9,7 +9,7 @@ import { } from "@ledgerhq/live-common/lib/account/helpers"; import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex, Tag, Text } from "@ledgerhq/native-ui"; +import { Flex, Text } from "@ledgerhq/native-ui"; import { useTheme } from "styled-components/native"; import { TouchableOpacity } from "react-native-gesture-handler"; @@ -17,6 +17,14 @@ import Card, { Props as CardProps } from "./Card"; import CurrencyIcon from "./CurrencyIcon"; import CurrencyUnitValue from "./CurrencyUnitValue"; +const Tag = ({ children, ...props }: { children: string }) => ( + + + {children} + + +); + export type Props = CardProps & { account: Account; style?: any; @@ -54,7 +62,8 @@ const AccountCard = ({ > @@ -67,7 +76,7 @@ const AccountCard = ({ > {tag}} - + {/* Select Account */} {/* Select / Connect Device */} {/* Add account(s) automatically */} {/* Receive Address */} {/* Receive Address Device Verification */} diff --git a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx index f1e5dc055114..45b3bbb348f2 100644 --- a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx @@ -1,52 +1,35 @@ -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useMemo } from "react"; import { useSelector } from "react-redux"; +import { useTranslation } from "react-i18next"; +import { FlatList } from "react-native"; import { accountWithMandatoryTokens, flattenAccounts, } from "@ledgerhq/live-common/lib/account/helpers"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex } from "@ledgerhq/native-ui"; -import { - isAccountEmpty, - getAccountSpendableBalance, -} from "@ledgerhq/live-common/lib/account"; +import { Flex, Text } from "@ledgerhq/native-ui"; import { ScreenName } from "../const"; -import { NotEnoughBalance } from "@ledgerhq/errors"; import { accountsSelector } from "../reducers/accounts"; -import { TrackScreen } from "../analytics"; -import AccountSelector from "../components/AccountSelector"; -import GenericErrorBottomModal from "../components/GenericErrorBottomModal"; +import AccountCard from "../components/AccountCard"; +import type { Account, AccountLike } from "@ledgerhq/live-common/lib/types/account"; type Props = { navigation: any; route: { - params?: { - currency?: string; - selectedCurrency?: CryptoCurrency | TokenCurrency; - next: string; - category: string; - notEmptyAccounts?: boolean; - minBalance?: number; + params: { + selectedCurrency: CryptoCurrency | TokenCurrency; }; }; }; -export default function ReceiveFunds({ navigation, route }: Props) { - const { - selectedCurrency, - currency: initialCurrencySelected, - next, - category, - notEmptyAccounts, - minBalance, - } = route.params || {}; - - const [error, setError] = useState(); +export default function SelectAccount({ navigation, route }: Props) { + const { selectedCurrency } = route.params; - const accounts = useSelector(accountsSelector); - const enhancedAccounts = useMemo(() => { + const { t } = useTranslation(); + const allAccounts = useSelector(accountsSelector); + const currencyAccounts = useMemo(() => { if (selectedCurrency) { - const filteredAccounts = accounts.filter( + const filteredAccounts = allAccounts.filter( acc => acc.currency.id === (selectedCurrency.type === "TokenCurrency" @@ -68,45 +51,50 @@ export default function ReceiveFunds({ navigation, route }: Props) { } return flattenAccounts(filteredAccounts); } - return flattenAccounts(accounts); - }, [accounts, selectedCurrency]); - const allAccounts = notEmptyAccounts - ? enhancedAccounts.filter(account => !isAccountEmpty(account)) - : enhancedAccounts; + return flattenAccounts(allAccounts); + }, [allAccounts, selectedCurrency]); - const handleSelectAccount = useCallback( + const keyExtractor = (item: Account) => item.id; + + const onSelectAccount = useCallback( account => { - const balance = getAccountSpendableBalance(account); - - if (!isNaN(minBalance) && balance.lte(minBalance)) { - setError(new NotEnoughBalance()); - } else { - navigation.navigate(ScreenName.ReceiveConnectDevice, { - account, - accountId: account.id, - parentId: account.type !== "Account" ? account.parentId : undefined, - }); - } + navigation.navigate(ScreenName.ReceiveConnectDevice, { + account, + accountId: account.id, + parentId: account.type !== "Account" ? account.parentId : undefined, + }); }, - [minBalance, navigation], + [navigation], + ); + + const renderItem = ({ item }: { item: AccountLike }) => ( + onSelectAccount(item)} + /> ); return ( - - - - - - {error ? ( - setError(undefined)} - /> - ) : null} + + + {t("")}Select account + + + {t("")}Your {selectedCurrency.ticker} will be deposited into this account. + + ); } From 9d231e472a65de7d9fdea199954dfb7007ef2174 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Mon, 20 Jun 2022 10:15:29 +0200 Subject: [PATCH 03/83] feat/LIVE-2449-receive-flow-select-account-screen qr code style modified on receive screen --- .../NewReceiveFundsNavigator.tsx | 2 +- .../screens/ReceiveFunds/03-Confirmation.js | 53 +++++++++++++------ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index 1fc4724da841..eeea4be3a12e 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -45,7 +45,7 @@ export default function NewReceiveFundsNavigator() { headerTitle: "", }} initialParams={{ - selectedCurrency: findCryptoCurrencyById("bitcoin"), + selectedCurrency: findCryptoCurrencyById("dogecoin"), }} /> {/* Select / Connect Device */} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js index 0d79da821f17..8c40959a86b8 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js @@ -188,22 +188,45 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { {width < 350 ? ( - - + + + + ) : ( - - + + + + + + + )} @@ -359,7 +382,7 @@ const styles = StyleSheet.create({ borderWidth: 1, padding: 16, - borderRadius: 4, + borderRadius: 24, shadowOpacity: 0.03, shadowRadius: 8, shadowOffset: { From b8806718cb2a6fe079432729af2b2a8d0fd83e05 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 10:46:05 +0200 Subject: [PATCH 04/83] bugfix/LIVE-2690-reborn-tabbar-ledger-button-fixed screen and component added specifically for the new receive flow --- .../src/components/ReceiveAccountCard.tsx | 109 ++++ .../NewReceiveFundsNavigator.tsx | 2 +- .../src/screens/ReceiveSelectAccount.tsx | 100 +++ pnpm-lock.yaml | 582 +++++++++++++++++- 4 files changed, 759 insertions(+), 34 deletions(-) create mode 100644 apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx diff --git a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx new file mode 100644 index 000000000000..bd246efeea20 --- /dev/null +++ b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx @@ -0,0 +1,109 @@ +import React from "react"; +import { + getAccountName, + getAccountSpendableBalance, +} from "@ledgerhq/live-common/lib/account"; +import { + getAccountCurrency, + getAccountUnit, +} from "@ledgerhq/live-common/lib/account/helpers"; +import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; +import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; +import { Flex, Text } from "@ledgerhq/native-ui"; +import { useTheme } from "styled-components/native"; +import { TouchableOpacity } from "react-native-gesture-handler"; + +import Card, { Props as CardProps } from "./Card"; +import CurrencyIcon from "./CurrencyIcon"; +import CurrencyUnitValue from "./CurrencyUnitValue"; + +const Tag = ({ children, ...props }: { children: string }) => ( + + + {children} + + +); + +export type Props = CardProps & { + account: Account; + style?: any; + disabled?: boolean; + useFullBalance?: boolean; + AccountSubTitle?: React.ReactNode; +}; + +const AccountCard = ({ + onPress, + account, + style, + disabled, + useFullBalance, + AccountSubTitle, + ...props +}: Props) => { + const { colors } = useTheme(); + const currency = getAccountCurrency(account); + const unit = getAccountUnit(account); + const tag = + account.derivationMode !== undefined && + account.derivationMode !== null && + getTagDerivationMode(currency as CryptoCurrency, account.derivationMode); + + return ( + + + + + + + {getAccountName(account)} + + {AccountSubTitle} + + {tag && {tag}} + + + + + + + + + ); +}; + +export default AccountCard; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index eeea4be3a12e..ad26eaed36d9 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -8,7 +8,7 @@ import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; import ReceiveSelectCrypto from "../../screens/SelectCrypto"; -import ReceiveSelectAccount from "../../screens/SelectAccount"; +import ReceiveSelectAccount from "../../screens/ReceiveSelectAccount"; import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; import StepHeader from "../StepHeader"; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx new file mode 100644 index 000000000000..45b3bbb348f2 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx @@ -0,0 +1,100 @@ +import React, { useCallback, useMemo } from "react"; +import { useSelector } from "react-redux"; +import { useTranslation } from "react-i18next"; +import { FlatList } from "react-native"; +import { + accountWithMandatoryTokens, + flattenAccounts, +} from "@ledgerhq/live-common/lib/account/helpers"; +import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; +import { Flex, Text } from "@ledgerhq/native-ui"; +import { ScreenName } from "../const"; +import { accountsSelector } from "../reducers/accounts"; +import AccountCard from "../components/AccountCard"; +import type { Account, AccountLike } from "@ledgerhq/live-common/lib/types/account"; + +type Props = { + navigation: any; + route: { + params: { + selectedCurrency: CryptoCurrency | TokenCurrency; + }; + }; +}; + +export default function SelectAccount({ navigation, route }: Props) { + const { selectedCurrency } = route.params; + + const { t } = useTranslation(); + const allAccounts = useSelector(accountsSelector); + const currencyAccounts = useMemo(() => { + if (selectedCurrency) { + const filteredAccounts = allAccounts.filter( + acc => + acc.currency.id === + (selectedCurrency.type === "TokenCurrency" + ? selectedCurrency.parentCurrency.id + : selectedCurrency.id), + ); + if (selectedCurrency.type === "TokenCurrency") { + // add in the token subAccount if it does not exist + return flattenAccounts( + filteredAccounts.map(acc => + accountWithMandatoryTokens(acc, [selectedCurrency]), + ), + ).filter( + acc => + acc.type === "Account" || + (acc.type === "TokenAccount" && + acc.token.id === selectedCurrency.id), + ); + } + return flattenAccounts(filteredAccounts); + } + return flattenAccounts(allAccounts); + }, [allAccounts, selectedCurrency]); + + const keyExtractor = (item: Account) => item.id; + + const onSelectAccount = useCallback( + account => { + navigation.navigate(ScreenName.ReceiveConnectDevice, { + account, + accountId: account.id, + parentId: account.type !== "Account" ? account.parentId : undefined, + }); + }, + [navigation], + ); + + const renderItem = ({ item }: { item: AccountLike }) => ( + onSelectAccount(item)} + /> + ); + + return ( + + + {t("")}Select account + + + {t("")}Your {selectedCurrency.ticker} will be deposited into this account. + + + + ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 603a8d832dd0..2b6b486309a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3050,6 +3050,7 @@ packages: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.17.9 + dev: true /@babel/code-frame/7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} @@ -3060,7 +3061,8 @@ packages: /@babel/code-frame/7.8.3: resolution: {integrity: sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==} dependencies: - '@babel/highlight': 7.17.12 + '@babel/highlight': 7.17.9 + dev: false /@babel/compat-data/7.17.10: resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} @@ -3257,6 +3259,7 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.20.3 semver: 6.3.0 + dev: false /@babel/helper-compilation-targets/7.18.2_@babel+core@7.17.10: resolution: {integrity: sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==} @@ -3361,6 +3364,7 @@ packages: '@babel/helper-split-export-declaration': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-create-regexp-features-plugin/7.17.0_@babel+core@7.17.10: resolution: {integrity: sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==} @@ -3391,6 +3395,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-annotate-as-pure': 7.16.7 regexpu-core: 5.0.1 + dev: false /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.17.10: resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} @@ -3443,6 +3448,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-environment-visitor/7.16.7: resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} @@ -3674,6 +3680,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} @@ -3695,7 +3702,8 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.10: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} @@ -3735,6 +3743,7 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-class-properties/7.16.7: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} @@ -3771,6 +3780,7 @@ packages: '@babel/helper-plugin-utils': 7.17.12 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-class-properties/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==} @@ -3782,6 +3792,7 @@ packages: '@babel/helper-plugin-utils': 7.17.12 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.10: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} @@ -3808,6 +3819,7 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-decorators/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==} @@ -3836,6 +3848,7 @@ packages: '@babel/plugin-syntax-decorators': 7.17.0_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} @@ -3866,6 +3879,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-export-default-from/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} @@ -3905,7 +3919,8 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} @@ -3936,6 +3951,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} @@ -3955,7 +3971,8 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} @@ -3986,6 +4003,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-nullish-coalescing-operator/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==} @@ -3995,6 +4013,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} @@ -4025,6 +4044,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-numeric-separator/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==} @@ -4034,6 +4054,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} @@ -4084,6 +4105,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} @@ -4114,6 +4136,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} @@ -4147,6 +4170,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-optional-chaining/7.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==} @@ -4156,6 +4180,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.10: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} @@ -4180,6 +4205,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} @@ -4208,6 +4234,7 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} @@ -4238,6 +4265,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.10: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -4262,6 +4290,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -4296,6 +4325,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -4314,6 +4344,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-decorators/7.17.0_@babel+core@7.17.10: resolution: {integrity: sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==} @@ -4331,7 +4362,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -4356,6 +4388,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-export-default-from/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} @@ -4390,6 +4423,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-flow/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} @@ -4416,7 +4450,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-import-meta/7.10.4: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -4467,6 +4502,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} @@ -4512,6 +4548,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.10: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -4528,6 +4565,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -4552,6 +4590,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.10: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -4576,6 +4615,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -4609,6 +4649,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -4633,6 +4674,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -4657,6 +4699,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -4675,6 +4718,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -4702,6 +4746,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-typescript/7.17.10: resolution: {integrity: sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==} @@ -4738,6 +4783,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-typescript/7.17.12_@babel+core@7.18.5: resolution: {integrity: sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==} @@ -4775,6 +4821,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.10: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} @@ -4814,6 +4861,7 @@ packages: '@babel/helper-remap-async-to-generator': 7.16.8 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} @@ -4841,6 +4889,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} @@ -4868,6 +4917,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} @@ -4922,6 +4972,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} @@ -4949,6 +5000,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.10: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} @@ -4976,6 +5028,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} @@ -5006,6 +5059,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} @@ -5033,6 +5087,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} @@ -5063,6 +5118,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-flow-strip-types/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} @@ -5092,6 +5148,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} @@ -5119,6 +5176,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} @@ -5152,6 +5210,7 @@ packages: '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.9.0 '@babel/helper-function-name': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} @@ -5179,6 +5238,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} @@ -5206,6 +5266,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} @@ -5245,6 +5306,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-commonjs/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==} @@ -5287,6 +5349,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.10: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} @@ -5332,6 +5395,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} @@ -5368,6 +5432,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-named-capturing-groups-regex/7.17.10_@babel+core@7.17.10: resolution: {integrity: sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==} @@ -5395,6 +5460,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 + dev: false /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} @@ -5422,6 +5488,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-object-assign/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-R8mawvm3x0COTJtveuoqZIjNypn2FjfvXZr4pSQ8VhEFBuQGBz4XhHasZtHXjgXU4XptZ4HtGof3NoYc93ZH9Q==} @@ -5476,6 +5543,7 @@ packages: '@babel/helper-replace-supers': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} @@ -5513,6 +5581,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} @@ -5540,6 +5609,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-constant-elements/7.17.6_@babel+core@7.18.5: resolution: {integrity: sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==} @@ -5547,8 +5617,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.5 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/core': 7.9.0 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-display-name/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} @@ -5576,6 +5647,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-display-name/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==} @@ -5583,7 +5655,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} @@ -5612,6 +5685,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.9.0 + dev: false /@babel/plugin-transform-react-jsx-self/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA==} @@ -5638,7 +5712,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx-source/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==} @@ -5665,7 +5740,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.10: resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} @@ -5705,6 +5781,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.9.0 '@babel/types': 7.17.10 + dev: false /@babel/plugin-transform-react-pure-annotations/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} @@ -5726,6 +5803,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-regenerator/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==} @@ -5753,6 +5831,7 @@ packages: dependencies: '@babel/core': 7.9.0 regenerator-transform: 0.15.0 + dev: false /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} @@ -5780,6 +5859,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-runtime/7.17.10_@babel+core@7.17.10: resolution: {integrity: sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig==} @@ -5823,6 +5903,7 @@ packages: '@babel/helper-plugin-utils': 7.17.12 resolve: 1.22.1 semver: 5.7.1 + dev: false /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} @@ -5850,6 +5931,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} @@ -5880,6 +5962,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + dev: false /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} @@ -5907,6 +5990,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} @@ -5934,6 +6018,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} @@ -5961,6 +6046,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.17.10: resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} @@ -6000,6 +6086,7 @@ packages: '@babel/plugin-syntax-typescript': 7.17.10_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} @@ -6018,6 +6105,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} @@ -6048,6 +6136,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/polyfill/7.12.1: resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} @@ -6224,6 +6313,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /@babel/preset-env/7.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==} @@ -6293,6 +6383,7 @@ packages: semver: 5.7.1 transitivePeerDependencies: - supports-color + dev: false /@babel/preset-flow/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==} @@ -6340,6 +6431,7 @@ packages: '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.9.0 '@babel/types': 7.17.10 esutils: 2.0.3 + dev: false /@babel/preset-react/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==} @@ -6365,10 +6457,11 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.18.5 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.18.5 - '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.18.5 - '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.9.0 + '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/preset-react/7.9.1_@babel+core@7.9.0: resolution: {integrity: sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==} @@ -6382,6 +6475,7 @@ packages: '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.9.0 '@babel/plugin-transform-react-jsx-self': 7.16.7_@babel+core@7.9.0 '@babel/plugin-transform-react-jsx-source': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/preset-typescript/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} @@ -6406,6 +6500,7 @@ packages: '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/register/7.17.7_@babel+core@7.17.10: resolution: {integrity: sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==} @@ -7400,9 +7495,11 @@ packages: /@csstools/convert-colors/1.4.0: resolution: {integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==} engines: {node: '>=4.0.0'} + dev: false /@csstools/normalize.css/10.1.0: resolution: {integrity: sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==} + dev: false /@dabh/diagnostics/2.0.3: resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} @@ -7447,6 +7544,7 @@ packages: global-tunnel-ng: 2.7.1 transitivePeerDependencies: - supports-color + dev: true /@electron/remote/2.0.8_electron@15.5.7: resolution: {integrity: sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw==} @@ -7802,6 +7900,7 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true /@eslint/eslintrc/1.2.3: resolution: {integrity: sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==} @@ -9026,10 +9125,12 @@ packages: /@hapi/address/2.1.4: resolution: {integrity: sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==} deprecated: Moved to 'npm install @sideway/address' + dev: false /@hapi/bourne/1.3.2: resolution: {integrity: sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==} deprecated: This version has been deprecated and is no longer supported or maintained + dev: false /@hapi/bourne/2.1.0: resolution: {integrity: sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==} @@ -9038,6 +9139,7 @@ packages: /@hapi/hoek/8.5.1: resolution: {integrity: sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==} deprecated: This version has been deprecated and is no longer supported or maintained + dev: false /@hapi/hoek/9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -9050,12 +9152,14 @@ packages: '@hapi/bourne': 1.3.2 '@hapi/hoek': 8.5.1 '@hapi/topo': 3.1.6 + dev: false /@hapi/topo/3.1.6: resolution: {integrity: sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==} deprecated: This version has been deprecated and is no longer supported or maintained dependencies: '@hapi/hoek': 8.5.1 + dev: false /@hapi/topo/5.1.0: resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} @@ -9145,6 +9249,7 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true /@humanwhocodes/config-array/0.6.0: resolution: {integrity: sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==} @@ -9170,6 +9275,7 @@ packages: /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true /@hutson/parse-repository-url/3.0.2: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} @@ -9199,6 +9305,7 @@ packages: '@jest/source-map': 24.9.0 chalk: 2.4.2 slash: 2.0.0 + dev: false /@jest/console/26.6.2: resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} @@ -9285,6 +9392,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /@jest/core/26.6.3: resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} @@ -9512,6 +9620,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 + dev: true /@jest/create-cache-key-function/27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} @@ -9530,6 +9639,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /@jest/environment/26.6.2: resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} @@ -9616,6 +9726,7 @@ packages: jest-mock: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /@jest/fake-timers/26.6.2: resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} @@ -9737,6 +9848,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /@jest/reporters/26.6.2: resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} @@ -9942,6 +10054,7 @@ packages: callsites: 3.1.0 graceful-fs: 4.2.10 source-map: 0.6.1 + dev: false /@jest/source-map/26.6.2: resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} @@ -9977,6 +10090,7 @@ packages: '@jest/console': 24.9.0 '@jest/types': 24.9.0 '@types/istanbul-lib-coverage': 2.0.4 + dev: false /@jest/test-result/26.6.2: resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} @@ -10031,6 +10145,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /@jest/test-sequencer/26.6.3: resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} @@ -10123,6 +10238,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /@jest/transform/26.6.2: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} @@ -10275,6 +10391,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 1.1.2 '@types/yargs': 13.0.12 + dev: false /@jest/types/26.6.2: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} @@ -11721,6 +11838,7 @@ packages: serve-static: 1.15.0 transitivePeerDependencies: - supports-color + dev: true /@react-native-community/cli-debugger-ui/6.0.0: resolution: {integrity: sha512-onf6vtvqSzOr6bNEWhPzgcJP2UQhA0VY6c8tXwNczIONC/ahnN93LPBB/uXDbn9d/kLMvE7oUJiqRadZWHk6aA==} @@ -11747,6 +11865,7 @@ packages: ip: 1.1.8 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-hermes/6.3.0: resolution: {integrity: sha512-Uhbm9bubyZLZ12vFCIfWbE/Qi3SBTbYIN/TC08EudTLhv/KbPomCQnmFsnJ7AXQFuOZJs73mBxoEAYSbRbwyVA==} @@ -11774,6 +11893,7 @@ packages: xmldoc: 1.1.2 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-platform-android/6.3.0: resolution: {integrity: sha512-d5ufyYcvrZoHznYm5bjBXaiHIJv552t5gYtQpnUsxBhHSQ8QlaNmlLUyeSPRDfOw4ND9b0tPHqs4ufwx6vp/fQ==} @@ -11803,6 +11923,7 @@ packages: xcode: 2.1.0 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-platform-ios/6.2.0: resolution: {integrity: sha512-k15MhExxLiLDDZOeuPgvTxbp0CsoLQQpk2Du0HjZDePqqWcKJylQqMZru1o8HuQHPcEr+b71HIs5V+lKyFYpfg==} @@ -11877,6 +11998,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: true /@react-native-community/cli-server-api/6.4.3: resolution: {integrity: sha512-Ywy2x+PhIUZXgE74YiCYXylSVnuEBcq5cNfYLR3AwOvrILjh03smXfCca8s2V2LWUlzmWN6+L85FJGsT92MUJA==} @@ -11926,6 +12048,7 @@ packages: shell-quote: 1.6.1 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-tools/6.2.0: resolution: {integrity: sha512-08ssz4GMEnRxC/1FgTTN/Ud7mExQi5xMphItPjfHiTxpZPhrFn+IMx6mya0ncFEhhxQ207wYlJMRLPRRdBZ8oA==} @@ -11945,6 +12068,7 @@ packages: resolution: {integrity: sha512-BesXnuFFlU/d1F3+sHhvKt8fUxbQlAbZ3hhMEImp9A6sopl8TEtryUGJ1dbazGjRXcADutxvjwT/i3LJVTIQug==} dependencies: ora: 3.4.0 + dev: true /@react-native-community/cli-types/6.0.0: resolution: {integrity: sha512-K493Fk2DMJC0ZM8s8gnfseKxGasIhuDaCUDeLZcoCSFlrjKEuEs1BKKEJiev0CARhKEXKOyyp/uqYM9nWhisNw==} @@ -12005,6 +12129,7 @@ packages: - metro-transform-worker - supports-color - utf-8-validate + dev: true /@react-native-community/cli/6.4.0_fazqo4unimqmfwpywzaiilj7ba: resolution: {integrity: sha512-UNvYnWaALa4mJEaWdLY3fVK+csZzx/Ja/FGvXISPJ9W9lrKvGtyXkidViUCPbPtMsJUi7teA4uIShHn0mbGmnQ==} @@ -12220,12 +12345,14 @@ packages: /@react-native/normalize-color/1.0.0: resolution: {integrity: sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==} + dev: true /@react-native/normalize-color/2.0.0: resolution: {integrity: sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw==} /@react-native/polyfills/1.0.0: resolution: {integrity: sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==} + dev: true /@react-native/polyfills/2.0.0: resolution: {integrity: sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==} @@ -16253,6 +16380,7 @@ packages: /@svgr/babel-plugin-add-jsx-attribute/4.2.0: resolution: {integrity: sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-add-jsx-attribute/5.4.0: resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} @@ -16262,6 +16390,7 @@ packages: /@svgr/babel-plugin-remove-jsx-attribute/4.2.0: resolution: {integrity: sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-remove-jsx-attribute/5.4.0: resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} @@ -16271,6 +16400,7 @@ packages: /@svgr/babel-plugin-remove-jsx-empty-expression/4.2.0: resolution: {integrity: sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-remove-jsx-empty-expression/5.0.1: resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} @@ -16280,6 +16410,7 @@ packages: /@svgr/babel-plugin-replace-jsx-attribute-value/4.2.0: resolution: {integrity: sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-replace-jsx-attribute-value/5.0.1: resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} @@ -16289,6 +16420,7 @@ packages: /@svgr/babel-plugin-svg-dynamic-title/4.3.3: resolution: {integrity: sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-svg-dynamic-title/5.4.0: resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} @@ -16298,6 +16430,7 @@ packages: /@svgr/babel-plugin-svg-em-dimensions/4.2.0: resolution: {integrity: sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-svg-em-dimensions/5.4.0: resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} @@ -16307,6 +16440,7 @@ packages: /@svgr/babel-plugin-transform-react-native-svg/4.2.0: resolution: {integrity: sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-transform-react-native-svg/5.4.0: resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} @@ -16316,6 +16450,7 @@ packages: /@svgr/babel-plugin-transform-svg-component/4.2.0: resolution: {integrity: sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-transform-svg-component/5.5.0: resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} @@ -16334,6 +16469,7 @@ packages: '@svgr/babel-plugin-svg-em-dimensions': 4.2.0 '@svgr/babel-plugin-transform-react-native-svg': 4.2.0 '@svgr/babel-plugin-transform-svg-component': 4.2.0 + dev: false /@svgr/babel-preset/5.5.0: resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} @@ -16364,6 +16500,7 @@ packages: cosmiconfig: 5.2.1 transitivePeerDependencies: - supports-color + dev: false /@svgr/core/5.5.0: resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} @@ -16419,7 +16556,8 @@ packages: resolution: {integrity: sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==} engines: {node: '>=8'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.17.10 + dev: false /@svgr/hast-util-to-babel-ast/5.5.0: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} @@ -16438,6 +16576,7 @@ packages: svg-parser: 2.0.4 transitivePeerDependencies: - supports-color + dev: false /@svgr/plugin-jsx/5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} @@ -16458,6 +16597,7 @@ packages: cosmiconfig: 5.2.1 merge-deep: 3.0.3 svgo: 1.3.2 + dev: false /@svgr/plugin-svgo/5.5.0: resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} @@ -16494,6 +16634,7 @@ packages: loader-utils: 1.4.0 transitivePeerDependencies: - supports-color + dev: false /@szmarczak/http-timer/1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} @@ -16951,6 +17092,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-lib-report': 3.0.0 + dev: false /@types/istanbul-reports/3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} @@ -17084,6 +17226,7 @@ packages: /@types/node/14.18.17: resolution: {integrity: sha512-oajWz4kOajqpKJMPgnCvBajPq8QAvl2xIWoFjlAJPKGu6n7pjov5SxGE45a+0RxHDoo4ycOMoZw1SCOWtDERbw==} + dev: true /@types/node/16.11.12: resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==} @@ -17468,6 +17611,7 @@ packages: /@types/stack-utils/1.0.1: resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} + dev: false /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} @@ -17584,6 +17728,7 @@ packages: resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} dependencies: '@types/yargs-parser': 21.0.0 + dev: false /@types/yargs/15.0.14: resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} @@ -17628,6 +17773,7 @@ packages: tsutils: 3.21.0 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/eslint-plugin/3.10.1_3z7vojl37e4oxvwlh4ugr4qrou: resolution: {integrity: sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==} @@ -17799,6 +17945,7 @@ packages: transitivePeerDependencies: - supports-color - typescript + dev: false /@typescript-eslint/experimental-utils/3.10.1_e4zyhrvfnqudwdx5bevnvkluy4: resolution: {integrity: sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==} @@ -17888,6 +18035,7 @@ packages: eslint-visitor-keys: 1.3.0 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/parser/3.10.1_e4zyhrvfnqudwdx5bevnvkluy4: resolution: {integrity: sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==} @@ -18110,6 +18258,7 @@ packages: tsutils: 3.21.0 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/typescript-estree/3.10.1_typescript@4.6.4: resolution: {integrity: sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==} @@ -18498,6 +18647,7 @@ packages: '@webassemblyjs/helper-module-context': 1.8.5 '@webassemblyjs/helper-wasm-bytecode': 1.8.5 '@webassemblyjs/wast-parser': 1.8.5 + dev: false /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} @@ -18512,6 +18662,7 @@ packages: /@webassemblyjs/floating-point-hex-parser/1.8.5: resolution: {integrity: sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==} + dev: false /@webassemblyjs/floating-point-hex-parser/1.9.0: resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} @@ -18522,6 +18673,7 @@ packages: /@webassemblyjs/helper-api-error/1.8.5: resolution: {integrity: sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==} + dev: false /@webassemblyjs/helper-api-error/1.9.0: resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} @@ -18532,6 +18684,7 @@ packages: /@webassemblyjs/helper-buffer/1.8.5: resolution: {integrity: sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==} + dev: false /@webassemblyjs/helper-buffer/1.9.0: resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} @@ -18540,6 +18693,7 @@ packages: resolution: {integrity: sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==} dependencies: '@webassemblyjs/wast-printer': 1.8.5 + dev: false /@webassemblyjs/helper-code-frame/1.9.0: resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} @@ -18548,6 +18702,7 @@ packages: /@webassemblyjs/helper-fsm/1.8.5: resolution: {integrity: sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==} + dev: false /@webassemblyjs/helper-fsm/1.9.0: resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} @@ -18557,6 +18712,7 @@ packages: dependencies: '@webassemblyjs/ast': 1.8.5 mamacro: 0.0.3 + dev: false /@webassemblyjs/helper-module-context/1.9.0: resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} @@ -18577,6 +18733,7 @@ packages: /@webassemblyjs/helper-wasm-bytecode/1.8.5: resolution: {integrity: sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==} + dev: false /@webassemblyjs/helper-wasm-bytecode/1.9.0: resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} @@ -18597,6 +18754,7 @@ packages: '@webassemblyjs/helper-buffer': 1.8.5 '@webassemblyjs/helper-wasm-bytecode': 1.8.5 '@webassemblyjs/wasm-gen': 1.8.5 + dev: false /@webassemblyjs/helper-wasm-section/1.9.0: resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} @@ -18616,6 +18774,7 @@ packages: resolution: {integrity: sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: false /@webassemblyjs/ieee754/1.9.0: resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} @@ -18632,6 +18791,7 @@ packages: resolution: {integrity: sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==} dependencies: '@xtuc/long': 4.2.2 + dev: false /@webassemblyjs/leb128/1.9.0: resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} @@ -18644,6 +18804,7 @@ packages: /@webassemblyjs/utf8/1.8.5: resolution: {integrity: sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==} + dev: false /@webassemblyjs/utf8/1.9.0: resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} @@ -18672,6 +18833,7 @@ packages: '@webassemblyjs/wasm-opt': 1.8.5 '@webassemblyjs/wasm-parser': 1.8.5 '@webassemblyjs/wast-printer': 1.8.5 + dev: false /@webassemblyjs/wasm-edit/1.9.0: resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} @@ -18703,6 +18865,7 @@ packages: '@webassemblyjs/ieee754': 1.8.5 '@webassemblyjs/leb128': 1.8.5 '@webassemblyjs/utf8': 1.8.5 + dev: false /@webassemblyjs/wasm-gen/1.9.0: resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} @@ -18729,6 +18892,7 @@ packages: '@webassemblyjs/helper-buffer': 1.8.5 '@webassemblyjs/wasm-gen': 1.8.5 '@webassemblyjs/wasm-parser': 1.8.5 + dev: false /@webassemblyjs/wasm-opt/1.9.0: resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} @@ -18758,6 +18922,7 @@ packages: '@webassemblyjs/ieee754': 1.8.5 '@webassemblyjs/leb128': 1.8.5 '@webassemblyjs/utf8': 1.8.5 + dev: false /@webassemblyjs/wasm-parser/1.9.0: resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} @@ -18778,6 +18943,7 @@ packages: '@webassemblyjs/helper-code-frame': 1.8.5 '@webassemblyjs/helper-fsm': 1.8.5 '@xtuc/long': 4.2.2 + dev: false /@webassemblyjs/wast-parser/1.9.0: resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} @@ -18802,6 +18968,7 @@ packages: '@webassemblyjs/ast': 1.8.5 '@webassemblyjs/wast-parser': 1.8.5 '@xtuc/long': 4.2.2 + dev: false /@webassemblyjs/wast-printer/1.9.0: resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} @@ -18976,6 +19143,7 @@ packages: dependencies: acorn: 6.4.2 acorn-walk: 6.2.0 + dev: false /acorn-globals/6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} @@ -19018,6 +19186,7 @@ packages: /acorn-walk/6.2.0: resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} engines: {node: '>=0.4.0'} + dev: false /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -19033,6 +19202,7 @@ packages: resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} engines: {node: '>=0.4.0'} hasBin: true + dev: false /acorn/6.4.2: resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} @@ -19069,6 +19239,7 @@ packages: loader-utils: 1.2.3 object-path: 0.11.4 regex-parser: 2.2.10 + dev: false /aes-js/3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} @@ -19167,6 +19338,7 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true /algo-msgpack-with-bigint/2.1.1: resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} @@ -19225,6 +19397,7 @@ packages: /ansi-colors/4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} + dev: true /ansi-escape-sequences/5.1.2: resolution: {integrity: sha512-JcpoVp1W1bl1Qn4cVuiXEhD6+dyXKSOgCn2zlzE8inYgCJCBy1aPnUhlz6I4DFum8D4ovb9Qi/iAjUcGvG2lqw==} @@ -19524,6 +19697,7 @@ packages: dependencies: ast-types-flow: 0.0.7 commander: 2.20.3 + dev: false /aria-query/4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} @@ -19534,7 +19708,16 @@ packages: dev: true /arity-n/1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} + resolution: {integrity: sha1-2edrEXM+CFacCEeuezmyhgswt0U=} + dev: false + + /arr-diff/2.0.0: + resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + dev: true + optional: true /arr-diff/4.0.0: resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} @@ -19563,7 +19746,8 @@ packages: dev: false /array-equal/1.0.0: - resolution: {integrity: sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==} + resolution: {integrity: sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=} + dev: false /array-filter/0.0.1: resolution: {integrity: sha1-fajPLiZijtcygDWB/SH2fKzS7uw=} @@ -19701,6 +19885,7 @@ packages: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 + dev: false /assert-plus/1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} @@ -19710,6 +19895,7 @@ packages: resolution: {integrity: sha512-N+aAxov+CKVS3JuhDIQFr24XvZvwE96Wlhk9dytTg/GmwWoghdOvR8dspx8MVz71O+Y0pA3UPqHF68D6iy8UvQ==} dependencies: util: 0.10.3 + dev: false /assert/1.5.0: resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} @@ -19823,10 +20009,12 @@ packages: dev: false /aws-sign2/0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} + dev: false /aws4/1.11.0: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + dev: false /axe-core/4.4.1: resolution: {integrity: sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==} @@ -19937,6 +20125,7 @@ packages: resolve: 1.22.0 transitivePeerDependencies: - supports-color + dev: false /babel-eslint/10.1.0_eslint@7.32.0: resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} @@ -19979,6 +20168,7 @@ packages: engines: {node: '>=4'} dependencies: babylon: 6.18.0 + dev: false /babel-generator/6.26.1: resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} @@ -20028,6 +20218,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /babel-jest/26.6.3_@babel+core@7.17.10: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} @@ -20177,6 +20368,7 @@ packages: pify: 4.0.1 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /babel-loader/8.2.5_usdhdj5awexcm2e5jtwd44bofa: resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} @@ -20275,6 +20467,7 @@ packages: test-exclude: 5.2.3 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-istanbul/6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} @@ -20294,6 +20487,7 @@ packages: engines: {node: '>= 6'} dependencies: '@types/babel__traverse': 7.17.1 + dev: false /babel-plugin-jest-hoist/26.6.2: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} @@ -20375,6 +20569,7 @@ packages: '@babel/core': ^7.1.0 dependencies: '@babel/core': 7.9.0 + dev: false /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.17.10: resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} @@ -20399,6 +20594,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.10: resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} @@ -20433,6 +20629,7 @@ packages: core-js-compat: 3.22.5 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.17.10: resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} @@ -20453,6 +20650,7 @@ packages: '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-react-docgen/4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} @@ -20496,7 +20694,8 @@ packages: resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} /babel-plugin-syntax-object-rest-spread/6.13.0: - resolution: {integrity: sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==} + resolution: {integrity: sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=} + dev: false /babel-plugin-syntax-trailing-function-commas/7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} @@ -20506,9 +20705,11 @@ packages: dependencies: babel-plugin-syntax-object-rest-spread: 6.13.0 babel-runtime: 6.26.0 + dev: false /babel-plugin-transform-react-remove-prop-types/0.4.24: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + dev: false /babel-polyfill/6.26.0: resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} @@ -20655,6 +20856,7 @@ packages: '@babel/core': 7.9.0 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 babel-plugin-jest-hoist: 24.9.0 + dev: false /babel-preset-jest/26.6.2_@babel+core@7.17.10: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} @@ -20720,6 +20922,7 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: - supports-color + dev: false /babel-runtime/6.26.0: resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} @@ -20861,6 +21064,7 @@ packages: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 + dev: false /bech32/1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} @@ -21227,6 +21431,7 @@ packages: /boolean/3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + dev: true optional: true /borsh/0.7.0: @@ -21422,6 +21627,7 @@ packages: electron-to-chromium: 1.4.167 node-releases: 1.1.77 pkg-up: 3.1.0 + dev: false /browserslist/4.14.2: resolution: {integrity: sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==} @@ -21508,7 +21714,8 @@ packages: dev: false /buffer-crc32/0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: true /buffer-equal-constant-time/1.0.1: resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} @@ -21765,6 +21972,7 @@ packages: unique-filename: 1.1.1 transitivePeerDependencies: - bluebird + dev: false /cacache/15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} @@ -21931,6 +22139,7 @@ packages: /camelcase/5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} + dev: false /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} @@ -21980,6 +22189,7 @@ packages: /case-sensitive-paths-webpack-plugin/2.3.0: resolution: {integrity: sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==} engines: {node: '>=4'} + dev: false /case-sensitive-paths-webpack-plugin/2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -21987,7 +22197,8 @@ packages: dev: true /caseless/0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + dev: false /cashaddrjs/0.4.4: resolution: {integrity: sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==} @@ -22345,10 +22556,12 @@ packages: /cli-width/2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: false /cli-width/3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + dev: false /clipboardy/2.3.0: resolution: {integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==} @@ -22410,6 +22623,7 @@ packages: kind-of: 3.2.2 lazy-cache: 1.0.4 shallow-clone: 0.1.2 + dev: false /clone-deep/2.0.2: resolution: {integrity: sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==} @@ -22674,6 +22888,7 @@ packages: /common-tags/1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + dev: false /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -22704,6 +22919,7 @@ packages: resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} dependencies: arity-n: 1.0.4 + dev: false /compress-brotli/1.3.8: resolution: {integrity: sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==} @@ -22817,6 +23033,7 @@ packages: dependencies: ini: 1.3.8 proto-list: 1.2.4 + dev: true optional: true /configstore/5.0.1: @@ -22864,6 +23081,7 @@ packages: /contains-path/0.1.0: resolution: {integrity: sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==} engines: {node: '>=0.10.0'} + dev: false /content-disposition/0.5.2: resolution: {integrity: sha1-DPaLud318r55YcOoUXjLhdunjLQ=} @@ -23058,12 +23276,14 @@ packages: dev: true /convert-source-map/0.3.5: - resolution: {integrity: sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==} + resolution: {integrity: sha1-8dgClQr33SYxof6+BZZVDIarMZA=} + dev: false /convert-source-map/1.7.0: resolution: {integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==} dependencies: safe-buffer: 5.1.2 + dev: false /convert-source-map/1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} @@ -23367,6 +23587,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: false /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -23417,6 +23638,7 @@ packages: hasBin: true dependencies: postcss: 7.0.39 + dev: false /css-color-keywords/1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} @@ -23439,6 +23661,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /css-in-js-utils/2.0.1: resolution: {integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==} @@ -23466,6 +23689,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /css-loader/3.6.0_webpack@4.43.0: resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} @@ -23539,6 +23763,7 @@ packages: hasBin: true dependencies: postcss: 7.0.39 + dev: false /css-select-base-adapter/0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} @@ -23610,14 +23835,17 @@ packages: source-map: 0.6.1 source-map-resolve: 0.5.3 urix: 0.1.0 + dev: false /cssdb/4.4.0: resolution: {integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==} + dev: false /cssesc/2.0.0: resolution: {integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==} engines: {node: '>=4'} hasBin: true + dev: false /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -23707,6 +23935,7 @@ packages: resolution: {integrity: sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==} dependencies: cssom: 0.3.8 + dev: false /cssstyle/2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} @@ -23755,6 +23984,7 @@ packages: dependencies: es5-ext: 0.10.61 type: 1.2.0 + dev: false /d3-array/1.2.4: resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} @@ -23869,6 +24099,7 @@ packages: engines: {node: '>=0.10'} dependencies: assert-plus: 1.0.0 + dev: false /data-urls/1.1.0: resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} @@ -23876,6 +24107,7 @@ packages: abab: 2.0.6 whatwg-mimetype: 2.3.0 whatwg-url: 7.1.0 + dev: false /data-urls/2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} @@ -24352,6 +24584,7 @@ packages: /detect-newline/2.1.0: resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} engines: {node: '>=0.10.0'} + dev: false /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} @@ -24447,6 +24680,7 @@ packages: /diff-sequences/24.9.0: resolution: {integrity: sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==} engines: {node: '>= 6'} + dev: false /diff-sequences/26.6.2: resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} @@ -24502,6 +24736,7 @@ packages: dependencies: arrify: 1.0.1 path-type: 3.0.0 + dev: false /dir-glob/2.2.2: resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} @@ -24582,6 +24817,7 @@ packages: dependencies: esutils: 2.0.3 isarray: 1.0.0 + dev: false /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -24698,6 +24934,7 @@ packages: resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} dependencies: webidl-conversions: 4.0.2 + dev: false /domexception/2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} @@ -24770,6 +25007,7 @@ packages: /dotenv/8.2.0: resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} engines: {node: '>=8'} + dev: false /dotenv/8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} @@ -24835,6 +25073,7 @@ packages: dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 + dev: false /ecdsa-sig-formatter/1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -24978,6 +25217,7 @@ packages: extract-zip: 1.7.0 transitivePeerDependencies: - supports-color + dev: true /elegant-spinner/1.0.1: resolution: {integrity: sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=} @@ -25050,6 +25290,7 @@ packages: /emojis-list/2.1.0: resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} engines: {node: '>= 0.10'} + dev: false /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} @@ -25131,6 +25372,7 @@ packages: engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.1 + dev: true /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -25157,6 +25399,7 @@ packages: /env-paths/2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + dev: true /envinfo/7.8.1: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} @@ -25293,6 +25536,7 @@ packages: es6-iterator: 2.0.3 es6-symbol: 3.1.3 next-tick: 1.1.0 + dev: false /es5-shim/4.6.7: resolution: {integrity: sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==} @@ -25301,6 +25545,7 @@ packages: /es6-error/4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true /es6-iterator/2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -25308,6 +25553,7 @@ packages: d: 1.0.1 es5-ext: 0.10.61 es6-symbol: 3.1.3 + dev: false /es6-object-assign/1.1.0: resolution: {integrity: sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=} @@ -25332,6 +25578,7 @@ packages: dependencies: d: 1.0.1 ext: 1.6.0 + dev: false /es6-template-regex/0.1.1: resolution: {integrity: sha1-5Re54PdCvuuNMECDRUT9oORlFGc=} @@ -25756,6 +26003,7 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 + dev: false /escodegen/2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} @@ -25887,6 +26135,7 @@ packages: eslint-plugin-jsx-a11y: 6.2.3_eslint@6.8.0 eslint-plugin-react: 7.19.0_eslint@6.8.0 eslint-plugin-react-hooks: 1.7.0_eslint@6.8.0 + dev: false /eslint-config-standard/16.0.3_wnerebu6rbpsve3qx7qqwvcqtq: resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} @@ -25971,6 +26220,7 @@ packages: object-hash: 2.2.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /eslint-module-utils/2.7.3_cphntlaow2spielwlvsegonsm4: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} @@ -26073,6 +26323,7 @@ packages: find-up: 2.1.0 transitivePeerDependencies: - supports-color + dev: false /eslint-plugin-detox/1.0.0: resolution: {integrity: sha1-LZwBMOjrxM7Vbvtu6vDQ9cFjOY0=} @@ -26141,6 +26392,7 @@ packages: dependencies: eslint: 6.8.0 lodash: 4.17.21 + dev: false /eslint-plugin-flowtype/5.10.0_eslint@7.32.0: resolution: {integrity: sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==} @@ -26181,6 +26433,7 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false /eslint-plugin-import/2.26.0_eslint@7.32.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} @@ -26363,6 +26616,7 @@ packages: eslint: 6.8.0 has: 1.0.3 jsx-ast-utils: 2.4.1 + dev: false /eslint-plugin-jsx-a11y/6.5.1_eslint@7.32.0: resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} @@ -26542,6 +26796,7 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 dependencies: eslint: 6.8.0 + dev: false /eslint-plugin-react-hooks/4.5.0_eslint@7.32.0: resolution: {integrity: sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==} @@ -26617,6 +26872,7 @@ packages: semver: 6.3.0 string.prototype.matchall: 4.0.7 xregexp: 4.4.1 + dev: false /eslint-plugin-react/7.29.4_eslint@7.32.0: resolution: {integrity: sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==} @@ -26748,6 +27004,7 @@ packages: engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 + dev: false /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -26792,6 +27049,7 @@ packages: /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} + dev: true /eslint-visitor-keys/3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} @@ -26842,6 +27100,7 @@ packages: v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color + dev: false /eslint/7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} @@ -26890,6 +27149,7 @@ packages: v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color + dev: true /eslint/8.15.0: resolution: {integrity: sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==} @@ -26989,6 +27249,7 @@ packages: acorn: 7.4.1 acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 + dev: false /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} @@ -26997,6 +27258,7 @@ packages: acorn: 7.4.1 acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 + dev: true /espree/9.3.2: resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} @@ -27377,6 +27639,7 @@ packages: jest-regex-util: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /expect/26.6.2: resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} @@ -27955,6 +28218,7 @@ packages: resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} dependencies: type: 2.6.0 + dev: false /extend-shallow/2.0.1: resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} @@ -28024,6 +28288,7 @@ packages: yauzl: 2.10.0 transitivePeerDependencies: - supports-color + dev: true /extract-zip/2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -28042,6 +28307,7 @@ packages: /extsprintf/1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} + dev: false /extsprintf/1.4.1: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} @@ -28186,6 +28452,7 @@ packages: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 + dev: true /fecha/4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -28223,12 +28490,14 @@ packages: engines: {node: '>=4'} dependencies: flat-cache: 2.0.1 + dev: false /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 + dev: true /file-loader/4.3.0_webpack@4.42.0: resolution: {integrity: sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==} @@ -28239,6 +28508,7 @@ packages: loader-utils: 1.4.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /file-loader/6.0.0_webpack@4.43.0: resolution: {integrity: sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==} @@ -28307,6 +28577,7 @@ packages: /filesize/6.0.1: resolution: {integrity: sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==} engines: {node: '>= 0.4.0'} + dev: false /filesize/6.1.0: resolution: {integrity: sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==} @@ -28403,6 +28674,7 @@ packages: commondir: 1.0.1 mkdirp: 0.5.6 pkg-dir: 1.0.0 + dev: false /find-cache-dir/2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} @@ -28435,6 +28707,7 @@ packages: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 + dev: false /find-up/2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} @@ -28517,6 +28790,7 @@ packages: flatted: 2.0.2 rimraf: 2.6.3 write: 1.0.3 + dev: false /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} @@ -28524,6 +28798,7 @@ packages: dependencies: flatted: 3.2.5 rimraf: 3.0.2 + dev: true /flat/4.1.1: resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} @@ -28543,13 +28818,16 @@ packages: /flatted/2.0.2: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: false /flatted/3.2.5: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + dev: true /flatten/1.0.3: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + dev: false /flipper-plugin-rn-performance-android/0.1.0: resolution: {integrity: sha512-GfzhKeMfWxLDeXArkit91bXE2m+g4SyVoBCpwsxMO/s0zB1mcZbqx6oIOSKwjpGFlQ3b/BpNNQ1+Xms3OeV5fw==} @@ -28679,10 +28957,12 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.4 + dev: false /for-in/0.1.8: resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} engines: {node: '>=0.10.0'} + dev: false /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} @@ -28717,7 +28997,8 @@ packages: dev: true /forever-agent/0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + dev: false /fork-ts-checker-webpack-plugin/3.1.1_s4p5obgc5rn2wrc7rinrdszb4m: resolution: {integrity: sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==} @@ -28745,6 +29026,7 @@ packages: worker-rpc: 0.1.1 transitivePeerDependencies: - supports-color + dev: false /fork-ts-checker-webpack-plugin/4.1.6_7wnmsrtcnse6htziqnucw6w67m: resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} @@ -28961,6 +29243,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: false /form-data/2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} @@ -29175,6 +29458,7 @@ packages: os: [darwin] deprecated: '"Please update to latest v2.3 or v2.2"' requiresBuild: true + dev: false optional: true /fsevents/2.3.2: @@ -29387,6 +29671,7 @@ packages: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: assert-plus: 1.0.0 + dev: false /git-raw-commits/2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} @@ -29580,6 +29865,7 @@ packages: roarr: 2.15.4 semver: 7.3.7 serialize-error: 7.0.1 + dev: true optional: true /global-dirs/3.0.0: @@ -29611,6 +29897,7 @@ packages: lodash: 4.17.21 npm-conf: 1.1.3 tunnel: 0.0.6 + dev: true optional: true /global/4.4.0: @@ -29638,6 +29925,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true /globals/9.18.0: resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} @@ -29700,6 +29988,7 @@ packages: slash: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /globby/9.2.0: resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} @@ -29880,6 +30169,7 @@ packages: /har-schema/2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} + dev: false /har-validator/5.1.5: resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} @@ -29888,6 +30178,7 @@ packages: dependencies: ajv: 6.12.6 har-schema: 2.0.0 + dev: false /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} @@ -29896,6 +30187,7 @@ packages: /harmony-reflect/1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + dev: false /has-ansi/2.0.0: resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} @@ -30121,6 +30413,7 @@ packages: /hermes-engine/0.7.2: resolution: {integrity: sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==} + dev: true /hermes-engine/0.8.1: resolution: {integrity: sha512-as9Iccj/qrqqtDmfYUHbOIjt5xsQbUB6pjNIW3i1+RVr+pCAdz5S8/Jry778mz3rJWplYzHWdR1u1xQSYfBRYw==} @@ -30234,6 +30527,7 @@ packages: resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} dependencies: whatwg-encoding: 1.0.5 + dev: false /html-encoding-sniffer/2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} @@ -30334,6 +30628,7 @@ packages: tapable: 1.1.3 util.promisify: 1.0.0 webpack: 4.42.0 + dev: false /html-webpack-plugin/4.3.0_webpack@4.43.0: resolution: {integrity: sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==} @@ -30528,6 +30823,7 @@ packages: assert-plus: 1.0.0 jsprim: 1.4.2 sshpk: 1.17.0 + dev: false /http2-wrapper/1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} @@ -30621,6 +30917,7 @@ packages: engines: {node: '>=4'} dependencies: harmony-reflect: 1.6.2 + dev: false /idna-uts46-hx/2.3.1: resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} @@ -30647,6 +30944,7 @@ packages: /ignore/3.3.10: resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} + dev: false /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -30674,6 +30972,7 @@ packages: /immer/1.10.0: resolution: {integrity: sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==} + dev: false /immer/8.0.1: resolution: {integrity: sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==} @@ -30684,6 +30983,7 @@ packages: engines: {node: '>=4'} dependencies: import-from: 2.1.0 + dev: false /import-fresh/2.0.0: resolution: {integrity: sha1-2BNVwVYS04bGH53dOSLUMEgipUY=} @@ -30704,6 +31004,7 @@ packages: engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 + dev: false /import-lazy/2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} @@ -30822,6 +31123,7 @@ packages: string-width: 4.2.3 strip-ansi: 5.2.0 through: 2.3.8 + dev: false /inquirer/7.3.3: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} @@ -30840,6 +31142,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 + dev: false /int64-buffer/1.0.1: resolution: {integrity: sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==} @@ -30864,6 +31167,7 @@ packages: /interpret/1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + dev: true /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} @@ -31572,7 +31876,8 @@ packages: dev: false /isstream/0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} + dev: false /istanbul-instrumenter-loader/3.0.1_webpack@5.73.0: resolution: {integrity: sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==} @@ -31596,6 +31901,7 @@ packages: /istanbul-lib-coverage/2.0.5: resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} engines: {node: '>=6'} + dev: false /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} @@ -31636,6 +31942,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /istanbul-lib-instrument/4.0.3: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} @@ -31682,6 +31989,7 @@ packages: istanbul-lib-coverage: 2.0.5 make-dir: 2.1.0 supports-color: 6.1.0 + dev: false /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} @@ -31703,6 +32011,7 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: false /istanbul-lib-source-maps/4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} @@ -31720,6 +32029,7 @@ packages: engines: {node: '>=6'} dependencies: html-escaper: 2.0.2 + dev: false /istanbul-reports/3.1.4: resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} @@ -31802,6 +32112,7 @@ packages: '@jest/types': 24.9.0 execa: 1.0.0 throat: 4.1.0 + dev: false /jest-changed-files/26.6.2: resolution: {integrity: sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==} @@ -31964,6 +32275,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-cli/26.6.3: resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} @@ -32138,6 +32450,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-config/26.6.3: resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} @@ -32427,6 +32740,7 @@ packages: diff-sequences: 24.9.0 jest-get-type: 24.9.0 pretty-format: 24.9.0 + dev: false /jest-diff/26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} @@ -32471,6 +32785,7 @@ packages: engines: {node: '>= 6'} dependencies: detect-newline: 2.1.0 + dev: false /jest-docblock/26.0.0: resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} @@ -32511,6 +32826,7 @@ packages: pretty-format: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /jest-each/26.6.2: resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} @@ -32570,6 +32886,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-environment-jsdom/24.9.0: resolution: {integrity: sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==} @@ -32586,6 +32903,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-environment-jsdom/26.6.2: resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} @@ -32635,6 +32953,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /jest-environment-node/26.6.2: resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} @@ -32696,6 +33015,7 @@ packages: /jest-get-type/24.9.0: resolution: {integrity: sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==} engines: {node: '>= 6'} + dev: false /jest-get-type/26.3.0: resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} @@ -32730,6 +33050,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /jest-haste-map/26.6.2: resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} @@ -32887,6 +33208,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /jest-jasmine2/26.6.3: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} @@ -32977,6 +33299,7 @@ packages: dependencies: jest-get-type: 24.9.0 pretty-format: 24.9.0 + dev: false /jest-leak-detector/26.6.2: resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} @@ -33018,6 +33341,7 @@ packages: jest-diff: 24.9.0 jest-get-type: 24.9.0 pretty-format: 24.9.0 + dev: false /jest-matcher-utils/26.6.2: resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} @@ -33082,6 +33406,7 @@ packages: stack-utils: 1.0.5 transitivePeerDependencies: - supports-color + dev: false /jest-message-util/26.6.2: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} @@ -33147,6 +33472,7 @@ packages: engines: {node: '>= 6'} dependencies: '@jest/types': 24.9.0 + dev: false /jest-mock/26.6.2: resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} @@ -33190,6 +33516,7 @@ packages: optional: true dependencies: jest-resolve: 24.9.0 + dev: false /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} @@ -33242,6 +33569,7 @@ packages: /jest-regex-util/24.9.0: resolution: {integrity: sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==} engines: {node: '>= 6'} + dev: false /jest-regex-util/26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} @@ -33266,6 +33594,7 @@ packages: jest-snapshot: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /jest-resolve-dependencies/26.6.3: resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} @@ -33334,6 +33663,7 @@ packages: chalk: 2.4.2 jest-pnp-resolver: 1.2.2_jest-resolve@24.9.0 realpath-native: 1.1.0 + dev: false /jest-resolve/26.6.2: resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} @@ -33447,6 +33777,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-runner/26.6.3: resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} @@ -33640,6 +33971,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-runtime/26.6.3: resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} @@ -33809,6 +34141,7 @@ packages: /jest-serializer/24.9.0: resolution: {integrity: sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==} engines: {node: '>= 6'} + dev: false /jest-serializer/26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} @@ -33844,6 +34177,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /jest-snapshot/26.6.2: resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} @@ -34014,6 +34348,7 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: false /jest-util/26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} @@ -34072,6 +34407,7 @@ packages: jest-get-type: 24.9.0 leven: 3.1.0 pretty-format: 24.9.0 + dev: false /jest-validate/26.6.2: resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} @@ -34132,6 +34468,7 @@ packages: strip-ansi: 5.2.0 transitivePeerDependencies: - supports-color + dev: false /jest-watcher/24.9.0: resolution: {integrity: sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==} @@ -34146,6 +34483,7 @@ packages: string-length: 2.0.0 transitivePeerDependencies: - supports-color + dev: false /jest-watcher/26.6.2: resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} @@ -34212,6 +34550,7 @@ packages: dependencies: merge-stream: 2.0.0 supports-color: 6.1.0 + dev: false /jest-worker/25.5.0: resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} @@ -34224,6 +34563,7 @@ packages: dependencies: merge-stream: 2.0.0 supports-color: 7.2.0 + dev: false /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} @@ -34321,6 +34661,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest/26.6.3: resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} @@ -34531,10 +34872,12 @@ packages: argparse: 2.0.1 /jsbn/0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} + dev: false /jsc-android/245459.0.0: resolution: {integrity: sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==} + dev: true /jsc-android/250230.2.1: resolution: {integrity: sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q==} @@ -34596,6 +34939,7 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color + dev: true /jsdom/11.12.0: resolution: {integrity: sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==} @@ -34629,6 +34973,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /jsdom/14.1.0: resolution: {integrity: sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==} @@ -34663,6 +35008,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /jsdom/16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} @@ -34812,9 +35158,11 @@ packages: /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true /json-schema/0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} @@ -34823,6 +35171,7 @@ packages: resolution: {integrity: sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==} dependencies: jsonify: 0.0.0 + dev: false /json-stringify-safe/5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -34903,6 +35252,7 @@ packages: extsprintf: 1.3.0 json-schema: 0.4.0 verror: 1.10.0 + dev: false /jsqr/1.4.0: resolution: {integrity: sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==} @@ -34981,6 +35331,7 @@ packages: dependencies: array-includes: 3.1.5 object.assign: 4.1.2 + dev: false /jsx-ast-utils/3.3.0: resolution: {integrity: sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==} @@ -35096,6 +35447,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 + dev: false /kind-of/3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} @@ -35303,6 +35655,7 @@ packages: /lazy-cache/0.2.7: resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} engines: {node: '>=0.10.0'} + dev: false /lazy-cache/1.0.4: resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} @@ -35367,6 +35720,7 @@ packages: /left-pad/1.3.0: resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} deprecated: use String.prototype.padStart() + dev: false /level-blobs/0.1.7: resolution: {integrity: sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=} @@ -35447,6 +35801,7 @@ packages: engines: {node: '>= 6'} dependencies: leven: 3.1.0 + dev: false /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} @@ -35461,6 +35816,7 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true /libsodium-wrappers/0.7.10: resolution: {integrity: sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==} @@ -35645,6 +36001,7 @@ packages: dependencies: find-cache-dir: 0.1.1 mkdirp: 0.5.6 + dev: false /loader-runner/2.4.0: resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} @@ -35662,6 +36019,7 @@ packages: big.js: 5.2.2 emojis-list: 2.1.0 json5: 1.0.1 + dev: false /loader-utils/1.4.0: resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} @@ -35826,6 +36184,7 @@ packages: /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true /lodash.omit/4.5.0: resolution: {integrity: sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=} @@ -35872,6 +36231,7 @@ packages: /lodash.truncate/4.4.2: resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} + dev: true /lodash.unescape/4.0.1: resolution: {integrity: sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=} @@ -36230,6 +36590,7 @@ packages: /mamacro/0.0.3: resolution: {integrity: sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==} + dev: false /map-age-cleaner/0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} @@ -36281,6 +36642,7 @@ packages: engines: {node: '>=10'} dependencies: escape-string-regexp: 4.0.0 + dev: true optional: true /md5-file/3.2.3: @@ -36547,6 +36909,7 @@ packages: arr-union: 3.1.0 clone-deep: 0.2.4 kind-of: 3.2.2 + dev: false /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} @@ -36586,6 +36949,7 @@ packages: escape-string-regexp: 1.0.5 transitivePeerDependencies: - supports-color + dev: true /metro-babel-register/0.66.2: resolution: {integrity: sha512-3F+vsVubUPJYKfVMeol8/7pd8CC287Rw92QYzJD8LEmI980xcgwMUEVBZ0UIAUwlLgiJG/f4Mwhuji2EeBXrPg==} @@ -36838,6 +37202,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: true /metro-source-map/0.66.2: resolution: {integrity: sha512-038tFmB7vSh73VQcDWIbr5O1m+WXWyYafDaOy+1A/2K308YP0oj33gbEgDnZsLZDwcJ+xt1x6KUEBIzlX4YGeQ==} @@ -36880,6 +37245,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: true /metro-symbolicate/0.66.2: resolution: {integrity: sha512-u+DeQHyAFXVD7mVP+GST/894WHJ3i/U8oEJFnT7U3P52ZuLgX8n4tMNxhqZU12RcLR6etF8143aP0Ktx1gFLEQ==} @@ -37241,6 +37607,7 @@ packages: schema-utils: 1.0.0 webpack: 4.42.0 webpack-sources: 1.4.3 + dev: false /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -37353,6 +37720,7 @@ packages: dependencies: for-in: 0.1.8 is-extendable: 0.1.1 + dev: false /mixme/0.5.4: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} @@ -37575,6 +37943,7 @@ packages: /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: false /mv/2.1.1: resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} @@ -37684,6 +38053,7 @@ packages: /next-tick/1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -37875,6 +38245,7 @@ packages: semver: 5.7.1 shellwords: 0.1.1 which: 1.3.1 + dev: false /node-notifier/8.0.2: resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} @@ -38007,6 +38378,7 @@ packages: prepend-http: 1.0.4 query-string: 4.3.4 sort-keys: 1.1.2 + dev: false /normalize-url/2.0.1: resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} @@ -38042,6 +38414,7 @@ packages: dependencies: config-chain: 1.1.13 pify: 3.0.0 + dev: true optional: true /npm-package-arg/6.1.0: @@ -38178,9 +38551,11 @@ packages: /oauth-sign/0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: false /ob1/0.64.0: resolution: {integrity: sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==} + dev: true /ob1/0.66.2: resolution: {integrity: sha512-RFewnL/RjE0qQBOuM+2bbY96zmJPIge/aDtsiDbLSb+MOiK8CReAhBHDgL+zrA3F1hQk00lMWpUwYcep750plA==} @@ -38203,6 +38578,7 @@ packages: /object-hash/2.2.0: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} + dev: false /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} @@ -38230,6 +38606,7 @@ packages: /object-path/0.11.4: resolution: {integrity: sha512-ICbQN+aw/eAASDtaC7+SJXSAruz7fvvNjxMFfS3mTdvZaaiuuw81XXYu+9CSJeUVrS3YpRhTr862YGywMQUOWg==} engines: {node: '>=0.10.0'} + dev: false /object-visit/1.0.1: resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} @@ -38440,6 +38817,7 @@ packages: cssnano: 4.1.11 last-call-webpack-plugin: 3.0.0 webpack: 4.42.0 + dev: false /optimize-css-assets-webpack-plugin/5.0.8_webpack@4.43.0: resolution: {integrity: sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==} @@ -38472,6 +38850,7 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.3 + dev: true /options/0.0.6: resolution: {integrity: sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=} @@ -38620,6 +38999,7 @@ packages: engines: {node: '>=4'} dependencies: p-reduce: 1.0.0 + dev: false /p-each-series/2.2.0: resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} @@ -38715,6 +39095,7 @@ packages: /p-reduce/1.0.0: resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==} engines: {node: '>=4'} + dev: false /p-retry/3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} @@ -38914,9 +39295,11 @@ packages: /parse5/4.0.0: resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + dev: false /parse5/5.1.0: resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} + dev: false /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -38961,6 +39344,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: pinkie-promise: 2.0.1 + dev: false /path-exists/3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} @@ -39067,7 +39451,8 @@ packages: sha.js: 2.4.11 /pend/1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + dev: true /performance-now/0.2.0: resolution: {integrity: sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=} @@ -39075,6 +39460,7 @@ packages: /performance-now/2.1.0: resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + dev: false /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} @@ -39200,6 +39586,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: find-up: 1.1.2 + dev: false /pkg-dir/3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} @@ -39293,6 +39680,7 @@ packages: /pn/1.1.0: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + dev: false /pngjs/3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} @@ -39319,6 +39707,7 @@ packages: ts-pnp: 1.2.0 transitivePeerDependencies: - typescript + dev: false /pnp-webpack-plugin/1.6.4_typescript@4.6.4: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} @@ -39375,6 +39764,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 6.0.10 + dev: false /postcss-browser-comments/3.0.0_browserslist@4.21.0: resolution: {integrity: sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==} @@ -39384,6 +39774,7 @@ packages: dependencies: browserslist: 4.21.0 postcss: 7.0.39 + dev: false /postcss-calc/7.0.5: resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} @@ -39398,6 +39789,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-gray/5.0.0: resolution: {integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==} @@ -39406,6 +39798,7 @@ packages: '@csstools/convert-colors': 1.4.0 postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-hex-alpha/5.0.3: resolution: {integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==} @@ -39413,6 +39806,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-mod-function/3.0.3: resolution: {integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==} @@ -39421,6 +39815,7 @@ packages: '@csstools/convert-colors': 1.4.0 postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-rebeccapurple/4.0.1: resolution: {integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==} @@ -39428,6 +39823,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-colormin/4.0.3: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} @@ -39451,6 +39847,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-custom-properties/8.0.11: resolution: {integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==} @@ -39458,6 +39855,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-custom-selectors/5.1.2: resolution: {integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==} @@ -39465,6 +39863,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /postcss-dir-pseudo-class/5.0.0: resolution: {integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==} @@ -39472,6 +39871,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /postcss-discard-comments/4.0.2: resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} @@ -39503,6 +39903,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-env-function/2.0.2: resolution: {integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==} @@ -39510,11 +39911,13 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-flexbugs-fixes/4.1.0: resolution: {integrity: sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==} dependencies: postcss: 7.0.39 + dev: false /postcss-flexbugs-fixes/4.2.1: resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} @@ -39527,23 +39930,27 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-focus-within/3.0.0: resolution: {integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-font-variant/4.0.1: resolution: {integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==} dependencies: postcss: 7.0.39 + dev: false /postcss-gap-properties/2.0.0: resolution: {integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-image-set-function/3.0.1: resolution: {integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==} @@ -39551,11 +39958,13 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-initial/3.0.4: resolution: {integrity: sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==} dependencies: postcss: 7.0.39 + dev: false /postcss-lab-function/2.0.1: resolution: {integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==} @@ -39564,6 +39973,7 @@ packages: '@csstools/convert-colors': 1.4.0 postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-load-config/2.1.2: resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} @@ -39571,6 +39981,7 @@ packages: dependencies: cosmiconfig: 5.2.1 import-cwd: 2.1.0 + dev: false /postcss-loader/3.0.0: resolution: {integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==} @@ -39580,6 +39991,7 @@ packages: postcss: 7.0.39 postcss-load-config: 2.1.2 schema-utils: 1.0.0 + dev: false /postcss-loader/4.3.0_gzaxsinx64nntyd3vmdqwl7coe: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} @@ -39602,12 +40014,14 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-media-minmax/4.0.0: resolution: {integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-merge-longhand/4.0.11: resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} @@ -39698,6 +40112,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-normalize-charset/4.0.1: resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} @@ -39780,6 +40195,7 @@ packages: postcss: 7.0.39 postcss-browser-comments: 3.0.0_browserslist@4.21.0 sanitize.css: 10.0.0 + dev: false /postcss-ordered-values/4.1.2: resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} @@ -39794,11 +40210,13 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-page-break/2.0.0: resolution: {integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==} dependencies: postcss: 7.0.39 + dev: false /postcss-place/4.0.1: resolution: {integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==} @@ -39806,6 +40224,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-preset-env/6.7.0: resolution: {integrity: sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==} @@ -39848,6 +40267,7 @@ packages: postcss-replace-overflow-wrap: 3.0.0 postcss-selector-matches: 4.0.0 postcss-selector-not: 4.0.1 + dev: false /postcss-pseudo-class-any-link/6.0.0: resolution: {integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==} @@ -39855,6 +40275,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /postcss-reduce-initial/4.0.3: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} @@ -39878,12 +40299,14 @@ packages: resolution: {integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==} dependencies: postcss: 7.0.39 + dev: false /postcss-safe-parser/4.0.1: resolution: {integrity: sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-safe-parser/4.0.2: resolution: {integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==} @@ -39897,12 +40320,14 @@ packages: dependencies: balanced-match: 1.0.2 postcss: 7.0.39 + dev: false /postcss-selector-not/4.0.1: resolution: {integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==} dependencies: balanced-match: 1.0.2 postcss: 7.0.39 + dev: false /postcss-selector-parser/3.1.2: resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} @@ -39919,6 +40344,7 @@ packages: cssesc: 2.0.0 indexes-of: 1.0.1 uniq: 1.0.1 + dev: false /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -39956,6 +40382,7 @@ packages: flatten: 1.0.3 indexes-of: 1.0.1 uniq: 1.0.1 + dev: false /postcss/7.0.21: resolution: {integrity: sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==} @@ -39964,6 +40391,7 @@ packages: chalk: 2.4.2 source-map: 0.6.1 supports-color: 6.1.0 + dev: false /postcss/7.0.39: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} @@ -40047,10 +40475,12 @@ packages: /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + dev: true /prepend-http/1.0.4: resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} engines: {node: '>=0.10.0'} + dev: false /prepend-http/2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} @@ -40117,6 +40547,7 @@ packages: ansi-regex: 4.1.1 ansi-styles: 3.2.1 react-is: 16.13.1 + dev: false /pretty-format/26.6.2: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} @@ -40366,7 +40797,8 @@ packages: dev: true /proto-list/1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} + dev: true optional: true /protobufjs/6.10.1: @@ -40569,6 +41001,7 @@ packages: /qs/6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + dev: false /qs/6.7.0: resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==} @@ -40586,6 +41019,7 @@ packages: dependencies: object-assign: 4.1.1 strict-uri-encode: 1.1.0 + dev: false /query-string/5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} @@ -40677,6 +41111,7 @@ packages: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: performance-now: 2.1.0 + dev: false /ramda/0.21.0: resolution: {integrity: sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=} @@ -40781,6 +41216,7 @@ packages: raf: 3.4.1 regenerator-runtime: 0.13.9 whatwg-fetch: 3.6.2 + dev: false /react-app-rewired/2.2.1_react-scripts@3.4.3: resolution: {integrity: sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==} @@ -40856,6 +41292,7 @@ packages: - typescript - vue-template-compiler - webpack + dev: false /react-dev-utils/11.0.4_mccwujuzvffchnbo4vkvqqqe2q: resolution: {integrity: sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==} @@ -40911,6 +41348,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true /react-docgen-typescript/2.2.2_typescript@4.6.4: resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} @@ -41178,6 +41616,7 @@ packages: transitivePeerDependencies: - '@babel/preset-env' - supports-color + dev: true /react-native-codegen/0.0.7: resolution: {integrity: sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng==} @@ -41773,6 +42212,7 @@ packages: - metro-transform-worker - supports-color - utf-8-validate + dev: true /react-native/0.65.1_react@17.0.2: resolution: {integrity: sha512-0UOVSnlssweQZjuaUtzViCifE/4tXm8oRbxwakopc8GavPu9vLulde145GOw6QVYiOy4iL50f+2XXRdX9NmMeQ==} @@ -42103,6 +42543,7 @@ packages: - vue-template-compiler - webpack-cli - webpack-command + dev: false /react-select/3.2.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==} @@ -42522,6 +42963,7 @@ packages: engines: {node: '>=4'} dependencies: util.promisify: 1.1.1 + dev: false /recast/0.20.5: resolution: {integrity: sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==} @@ -42537,6 +42979,7 @@ packages: engines: {node: '>= 0.10'} dependencies: resolve: 1.22.0 + dev: true /rechoir/0.7.1: resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} @@ -42661,6 +43104,7 @@ packages: /regex-parser/2.2.10: resolution: {integrity: sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==} + dev: false /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} @@ -42673,6 +43117,7 @@ packages: /regexpp/2.0.1: resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} engines: {node: '>=6.5.0'} + dev: false /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} @@ -42947,6 +43392,7 @@ packages: dependencies: lodash: 4.17.21 request: 2.88.2 + dev: false /request-promise-native/1.0.9_request@2.88.2: resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} @@ -42959,6 +43405,7 @@ packages: request-promise-core: 1.1.4_request@2.88.2 stealthy-require: 1.1.1 tough-cookie: 2.5.0 + dev: false /request/2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} @@ -42985,6 +43432,7 @@ packages: tough-cookie: 2.5.0 tunnel-agent: 0.6.0 uuid: 3.4.0 + dev: false /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -43087,6 +43535,7 @@ packages: rework: 1.0.1 rework-visit: 1.0.0 source-map: 0.6.1 + dev: false /resolve-url/0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} @@ -43104,6 +43553,7 @@ packages: resolution: {integrity: sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==} dependencies: path-parse: 1.0.7 + dev: false /resolve/1.22.0: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} @@ -43172,13 +43622,15 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} /rework-visit/1.0.0: - resolution: {integrity: sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==} + resolution: {integrity: sha1-mUWygD8hni96ygCtuLyfZA+ELJo=} + dev: false /rework/1.0.1: resolution: {integrity: sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==} dependencies: convert-source-map: 0.3.5 css: 2.2.4 + dev: false /rfc4648/1.5.1: resolution: {integrity: sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==} @@ -43297,6 +43749,7 @@ packages: json-stringify-safe: 5.0.1 semver-compare: 1.0.0 sprintf-js: 1.1.2 + dev: true optional: true /router-ips/1.0.0: @@ -43323,6 +43776,7 @@ packages: /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + dev: false /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -43415,6 +43869,7 @@ packages: /sanitize.css/10.0.0: resolution: {integrity: sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==} + dev: false /sass-loader/8.0.2_webpack@4.42.0: resolution: {integrity: sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==} @@ -43438,6 +43893,7 @@ packages: schema-utils: 2.7.1 semver: 6.3.0 webpack: 4.42.0 + dev: false /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -43447,6 +43903,7 @@ packages: engines: {node: '>=8'} dependencies: xmlchars: 2.2.0 + dev: false /saxes/5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} @@ -43558,6 +44015,7 @@ packages: /semver-compare/1.0.0: resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=} + dev: true /semver-diff/3.1.1: resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} @@ -43676,6 +44134,7 @@ packages: engines: {node: '>=10'} dependencies: type-fest: 0.13.1 + dev: true optional: true /serialize-error/8.1.0: @@ -43869,6 +44328,7 @@ packages: kind-of: 2.0.1 lazy-cache: 0.2.7 mixin-object: 2.0.1 + dev: false /shallow-clone/1.0.0: resolution: {integrity: sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==} @@ -43944,6 +44404,7 @@ packages: glob: 7.2.0 interpret: 1.4.0 rechoir: 0.6.2 + dev: true /shellwords/0.1.1: resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} @@ -44059,6 +44520,7 @@ packages: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + dev: true /sliced/1.0.1: resolution: {integrity: sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=} @@ -44229,6 +44691,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-plain-obj: 1.1.0 + dev: false /sort-keys/2.0.0: resolution: {integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=} @@ -44414,6 +44877,7 @@ packages: /sprintf-js/1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + dev: true optional: true /sshpk/1.17.0: @@ -44430,6 +44894,7 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 tweetnacl: 0.14.5 + dev: false /ssri/6.0.2: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} @@ -44442,6 +44907,7 @@ packages: dependencies: figgy-pudding: 3.5.2 minipass: 3.1.6 + dev: false /ssri/8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} @@ -44462,6 +44928,7 @@ packages: engines: {node: '>=8'} dependencies: escape-string-regexp: 2.0.0 + dev: false /stack-utils/2.0.5: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} @@ -44555,6 +45022,7 @@ packages: /stealthy-require/1.1.1: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} + dev: false /stellar-base/8.0.0: resolution: {integrity: sha512-MH0V94Hn/Ekq/yZxd+EQijkvfU+21zuqJAyEP8X+fhRR0IQYwGNByY003oLqIkgwqXotyofEQ76W5MoNFZmlpw==} @@ -44728,6 +45196,7 @@ packages: dependencies: astral-regex: 1.0.0 strip-ansi: 4.0.0 + dev: false /string-length/3.1.0: resolution: {integrity: sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==} @@ -44735,6 +45204,7 @@ packages: dependencies: astral-regex: 1.0.0 strip-ansi: 5.2.0 + dev: false /string-length/4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -44908,6 +45378,7 @@ packages: dependencies: babel-extract-comments: 1.0.0 babel-plugin-transform-object-rest-spread: 6.26.0 + dev: false /strip-eof/1.0.0: resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} @@ -44956,6 +45427,7 @@ packages: dependencies: loader-utils: 1.4.0 schema-utils: 1.0.0 + dev: false /style-loader/1.2.1_webpack@4.43.0: resolution: {integrity: sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==} @@ -45164,6 +45636,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true /superagent/6.1.0: resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} @@ -45381,6 +45854,7 @@ packages: slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true /tail/2.2.4: resolution: {integrity: sha512-PX8klSxW1u3SdgDrDeewh5GNE+hkJ4h02JvHfV6YrHqWOVJ88nUdSQqtsUf/gWhgZlPAws3fiZ+F1f8euspcuQ==} @@ -45582,6 +46056,7 @@ packages: webpack: 4.42.0 webpack-sources: 1.4.3 worker-farm: 1.7.0 + dev: false /terser-webpack-plugin/1.4.5_webpack@4.42.1: resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} @@ -45656,6 +46131,7 @@ packages: transitivePeerDependencies: - bluebird - metro + dev: false /terser-webpack-plugin/3.1.0_3vxwytkl4ej33mzbpow4f24y7e: resolution: {integrity: sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA==} @@ -45802,6 +46278,7 @@ packages: minimatch: 3.1.2 read-pkg-up: 4.0.0 require-main-filename: 2.0.0 + dev: false /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -45844,7 +46321,8 @@ packages: any-promise: 1.3.0 /throat/4.1.0: - resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} + resolution: {integrity: sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=} + dev: false /throat/5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -46084,6 +46562,7 @@ packages: dependencies: psl: 1.8.0 punycode: 2.1.1 + dev: false /tough-cookie/4.0.0: resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} @@ -46403,6 +46882,7 @@ packages: peerDependenciesMeta: typescript: optional: true + dev: false /ts-pnp/1.2.0: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} @@ -46452,6 +46932,7 @@ packages: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 + dev: false /tsutils/3.21.0_typescript@4.6.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -46627,7 +47108,8 @@ packages: dev: false /tweetnacl/0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} + dev: false /tweetnacl/1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -46644,6 +47126,7 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -46662,6 +47145,7 @@ packages: /type-fest/0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} + dev: true /type-fest/0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} @@ -46707,9 +47191,11 @@ packages: /type/1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false /type/2.6.0: resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==} + dev: false /typedarray-to-buffer/3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -47220,6 +47706,7 @@ packages: mime: 2.6.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /url-loader/4.1.1_f26uezmxiklaqqap5voqnq7ioy: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} @@ -47448,7 +47935,8 @@ packages: define-properties: 1.1.4 for-each: 0.3.3 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.4 + object.getownpropertydescriptors: 2.1.3 + dev: false /util/0.10.3: resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} @@ -47608,7 +48096,8 @@ packages: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 - extsprintf: 1.4.1 + extsprintf: 1.3.0 + dev: false /verror/1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} @@ -48152,6 +48641,7 @@ packages: domexception: 1.0.1 webidl-conversions: 4.0.2 xml-name-validator: 3.0.0 + dev: false /w3c-xmlserializer/2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} @@ -48578,6 +49068,7 @@ packages: range-parser: 1.2.1 webpack: 4.42.0 webpack-log: 2.0.0 + dev: false /webpack-dev-middleware/3.7.3_webpack@4.43.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} @@ -48669,6 +49160,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /webpack-dev-server/3.11.0_webpack@4.43.0: resolution: {integrity: sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==} @@ -48756,6 +49248,7 @@ packages: object.entries: 1.1.5 tapable: 1.1.3 webpack: 4.42.0 + dev: false /webpack-manifest-plugin/2.2.0_webpack@4.43.0: resolution: {integrity: sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==} @@ -48843,6 +49336,7 @@ packages: webpack-sources: 1.4.3 transitivePeerDependencies: - supports-color + dev: false /webpack/4.42.1: resolution: {integrity: sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==} @@ -49182,6 +49676,7 @@ packages: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 + dev: false /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -49352,11 +49847,13 @@ packages: resolution: {integrity: sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-broadcast-update/4.3.1: resolution: {integrity: sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-build/4.3.1: resolution: {integrity: sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==} @@ -49385,19 +49882,23 @@ packages: workbox-streams: 4.3.1 workbox-sw: 4.3.1 workbox-window: 4.3.1 + dev: false /workbox-cacheable-response/4.3.1: resolution: {integrity: sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-core/4.3.1: resolution: {integrity: sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==} + dev: false /workbox-expiration/4.3.1: resolution: {integrity: sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-google-analytics/4.3.1: resolution: {integrity: sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==} @@ -49406,39 +49907,47 @@ packages: workbox-core: 4.3.1 workbox-routing: 4.3.1 workbox-strategies: 4.3.1 + dev: false /workbox-navigation-preload/4.3.1: resolution: {integrity: sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-precaching/4.3.1: resolution: {integrity: sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-range-requests/4.3.1: resolution: {integrity: sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-routing/4.3.1: resolution: {integrity: sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-strategies/4.3.1: resolution: {integrity: sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-streams/4.3.1: resolution: {integrity: sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-sw/4.3.1: resolution: {integrity: sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==} + dev: false /workbox-webpack-plugin/4.3.1_webpack@4.42.0: resolution: {integrity: sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==} @@ -49450,11 +49959,13 @@ packages: json-stable-stringify: 1.0.1 webpack: 4.42.0 workbox-build: 4.3.1 + dev: false /workbox-window/4.3.1: resolution: {integrity: sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==} dependencies: workbox-core: 4.3.1 + dev: false /worker-farm/1.7.0: resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} @@ -49535,6 +50046,7 @@ packages: graceful-fs: 4.2.10 imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: false /write-file-atomic/2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} @@ -49564,6 +50076,7 @@ packages: engines: {node: '>=4'} dependencies: mkdirp: 0.5.6 + dev: false /ws/1.1.5: resolution: {integrity: sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==} @@ -49606,6 +50119,7 @@ packages: optional: true dependencies: async-limiter: 1.0.1 + dev: false /ws/6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} @@ -49865,6 +50379,7 @@ packages: resolution: {integrity: sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==} dependencies: '@babel/runtime-corejs3': 7.17.9 + dev: false /xstate/4.32.0: resolution: {integrity: sha512-62gETqwnw4pBRe+tVWMt8hLgWEU8lq2qO8VN5PWmTELceRVt3I1bu1cwdraVRHUn4Bb2lnhNzn1A73oShuC+8g==} @@ -50114,6 +50629,7 @@ packages: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + dev: true /yazl/2.5.1: resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} From 08543054ac56971751c7bfb259535a99cea2429f Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 11:14:12 +0200 Subject: [PATCH 05/83] feat/LIVE-2449-receive-flow-select-account-screen SelectAccount screen and AccountCard component changes reverted --- .../src/components/AccountCard.tsx | 17 +-- .../src/screens/SelectAccount.tsx | 116 ++++++++++-------- 2 files changed, 68 insertions(+), 65 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/AccountCard.tsx b/apps/ledger-live-mobile/src/components/AccountCard.tsx index b6b6462f44bd..1e78765efa61 100644 --- a/apps/ledger-live-mobile/src/components/AccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/AccountCard.tsx @@ -9,7 +9,7 @@ import { } from "@ledgerhq/live-common/lib/account/helpers"; import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex, Text } from "@ledgerhq/native-ui"; +import { Flex, Tag, Text } from "@ledgerhq/native-ui"; import { useTheme } from "styled-components/native"; import { TouchableOpacity } from "react-native-gesture-handler"; @@ -17,14 +17,6 @@ import Card, { Props as CardProps } from "./Card"; import CurrencyIcon from "./CurrencyIcon"; import CurrencyUnitValue from "./CurrencyUnitValue"; -const Tag = ({ children, ...props }: { children: string }) => ( - - - {children} - - -); - export type Props = CardProps & { account: Account; style?: any; @@ -62,8 +54,7 @@ const AccountCard = ({ > @@ -76,7 +67,7 @@ const AccountCard = ({ > {tag}} - + (); - const { t } = useTranslation(); - const allAccounts = useSelector(accountsSelector); - const currencyAccounts = useMemo(() => { + const accounts = useSelector(accountsSelector); + const enhancedAccounts = useMemo(() => { if (selectedCurrency) { - const filteredAccounts = allAccounts.filter( + const filteredAccounts = accounts.filter( acc => acc.currency.id === (selectedCurrency.type === "TokenCurrency" @@ -51,50 +68,45 @@ export default function SelectAccount({ navigation, route }: Props) { } return flattenAccounts(filteredAccounts); } - return flattenAccounts(allAccounts); - }, [allAccounts, selectedCurrency]); + return flattenAccounts(accounts); + }, [accounts, selectedCurrency]); + const allAccounts = notEmptyAccounts + ? enhancedAccounts.filter(account => !isAccountEmpty(account)) + : enhancedAccounts; - const keyExtractor = (item: Account) => item.id; - - const onSelectAccount = useCallback( + const handleSelectAccount = useCallback( account => { - navigation.navigate(ScreenName.ReceiveConnectDevice, { - account, - accountId: account.id, - parentId: account.type !== "Account" ? account.parentId : undefined, - }); - }, - [navigation], - ); + const balance = getAccountSpendableBalance(account); - const renderItem = ({ item }: { item: AccountLike }) => ( - onSelectAccount(item)} - /> + if (!isNaN(minBalance) && balance.lte(minBalance)) { + setError(new NotEnoughBalance()); + } else { + navigation.navigate(ScreenName.ReceiveConnectDevice, { + account, + accountId: account.id, + parentId: account.type !== "Account" ? account.parentId : undefined, + }); + } + }, + [minBalance, navigation], ); return ( - - - {t("")}Select account - - - {t("")}Your {selectedCurrency.ticker} will be deposited into this account. - - + + + + + + {error ? ( + setError(undefined)} + /> + ) : null} ); } From 0d40a639b398627499fd3edd5748198492f9a36a Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 11:25:28 +0200 Subject: [PATCH 06/83] feat/LIVE-2449-receive-flow-select-account-screen useless code removed and texts added to en locale --- apps/ledger-live-desktop/static/i18n/en/app.json | 4 ++++ .../src/components/ReceiveAccountCard.tsx | 8 ++++---- .../components/RootNavigator/NewReceiveFundsNavigator.tsx | 6 +----- .../src/screens/ReceiveSelectAccount.tsx | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json index c2c1d28c6dc3..7eba355a1735 100644 --- a/apps/ledger-live-desktop/static/i18n/en/app.json +++ b/apps/ledger-live-desktop/static/i18n/en/app.json @@ -1839,6 +1839,10 @@ "receive": { "title": "Receive", "successTitle": "Address shared securely", + "selectAccount": { + "title": "Select account", + "subtitle": "Your {{currencyTicker}} will be deposited into this account." + }, "steps": { "chooseAccount": { "title": "Account", diff --git a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx index bd246efeea20..d64959062121 100644 --- a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx @@ -45,10 +45,10 @@ const AccountCard = ({ const { colors } = useTheme(); const currency = getAccountCurrency(account); const unit = getAccountUnit(account); - const tag = - account.derivationMode !== undefined && - account.derivationMode !== null && - getTagDerivationMode(currency as CryptoCurrency, account.derivationMode); + const tag = getTagDerivationMode( + currency as CryptoCurrency, + account.derivationMode, + ); return ( diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index ad26eaed36d9..d41148b783cc 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -2,20 +2,16 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; -import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; +import { findCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; import ReceiveSelectCrypto from "../../screens/SelectCrypto"; import ReceiveSelectAccount from "../../screens/ReceiveSelectAccount"; import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; -import StepHeader from "../StepHeader"; - -import { findCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; export default function NewReceiveFundsNavigator() { - const { t } = useTranslation(); const { colors } = useTheme(); const stackNavigationConfig = useMemo( () => getStackNavigatorConfig(colors, true), diff --git a/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx index 45b3bbb348f2..27fc10ad023f 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx @@ -10,7 +10,7 @@ import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; import { Flex, Text } from "@ledgerhq/native-ui"; import { ScreenName } from "../const"; import { accountsSelector } from "../reducers/accounts"; -import AccountCard from "../components/AccountCard"; +import ReceiveAccountCard from "../components/ReceiveAccountCard"; import type { Account, AccountLike } from "@ledgerhq/live-common/lib/types/account"; type Props = { @@ -68,7 +68,7 @@ export default function SelectAccount({ navigation, route }: Props) { ); const renderItem = ({ item }: { item: AccountLike }) => ( - onSelectAccount(item)} /> @@ -77,7 +77,7 @@ export default function SelectAccount({ navigation, route }: Props) { return ( - {t("")}Select account + {t("receive.selectAccount.title")} - {t("")}Your {selectedCurrency.ticker} will be deposited into this account. + {t("receive.selectAccount.subtitle", { currencyTicker: selectedCurrency.ticker})} Date: Tue, 21 Jun 2022 11:26:40 +0200 Subject: [PATCH 07/83] feat/LIVE-2449-receive-flow-select-account-screen useless code removed and texts added to en locale --- apps/ledger-live-desktop/static/i18n/en/app.json | 4 ---- apps/ledger-live-mobile/src/locales/en/common.json | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json index 7eba355a1735..c2c1d28c6dc3 100644 --- a/apps/ledger-live-desktop/static/i18n/en/app.json +++ b/apps/ledger-live-desktop/static/i18n/en/app.json @@ -1839,10 +1839,6 @@ "receive": { "title": "Receive", "successTitle": "Address shared securely", - "selectAccount": { - "title": "Select account", - "subtitle": "Your {{currencyTicker}} will be deposited into this account." - }, "steps": { "chooseAccount": { "title": "Account", diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index e63cbbe1bd14..3df21bd9bd09 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2161,6 +2161,10 @@ "shareAddress": "Share address", "addressCopied": "Address copied!", "taprootWarning": "Make sure the sender supports taproot", + "selectAccount": { + "title": "Select account", + "subtitle": "Your {{currencyTicker}} will be deposited into this account." + }, "notSynced": { "text": "Synchronizing", "desc": "This may take a moment if you have many transactions or if you have a slow internet connection." From c828ec1b2160375168141185a59ca48dfd869859 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 13:40:18 +0200 Subject: [PATCH 08/83] feat/LIVE-2451-receive-flow-receive-screen typescript confirmation screen added --- .../screens/ReceiveFunds/03-Confirmation.tsx | 466 ++++++++++++++++++ .../src/screens/ReceiveSelectAccount.tsx | 4 +- 2 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx new file mode 100644 index 000000000000..8e46910190dd --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -0,0 +1,466 @@ +// @flow + +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { of } from "rxjs"; +import { delay } from "rxjs/operators"; +import { View, StyleSheet, Platform } from "react-native"; +import { useSelector } from "react-redux"; +import QRCode from "react-native-qrcode-svg"; +import { Trans } from "react-i18next"; +import ReactNativeModal from "react-native-modal"; +import type { + Account, + TokenAccount, + AccountLike, +} from "@ledgerhq/live-common/lib/types"; +import { + getMainAccount, + getAccountCurrency, + getAccountName, +} from "@ledgerhq/live-common/lib/account"; +import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; +import type { DeviceModelId } from "@ledgerhq/devices"; +import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; +import { useTheme } from "@react-navigation/native"; +import getWindowDimensions from "../../logic/getWindowDimensions"; +import { accountScreenSelector } from "../../reducers/accounts"; +import { TrackScreen } from "../../analytics"; +import PreventNativeBack from "../../components/PreventNativeBack"; +import LText from "../../components/LText/index"; +import DisplayAddress from "../../components/DisplayAddress"; +import Alert from "../../components/Alert"; +import BottomModal from "../../components/BottomModal"; +import QRcodeZoom from "../../icons/QRcodeZoom"; +import Touchable from "../../components/Touchable"; +import Button from "../../components/Button"; +import CurrencyIcon from "../../components/CurrencyIcon"; +import CopyLink from "../../components/CopyLink"; +import ShareLink from "../../components/ShareLink"; +import NavigationScrollView from "../../components/NavigationScrollView"; +import { urls } from "../../config/urls"; +import { readOnlyModeEnabledSelector } from "../../reducers/settings"; +import SkipLock from "../../components/behaviour/SkipLock"; +import logger from "../../logger"; +import { rejectionOp } from "../../logic/debugReject"; +import GenericErrorView from "../../components/GenericErrorView"; + +type Props = { + account?: (TokenAccount | Account), + parentAccount?: Account, + navigation: any, + route: { params: RouteParams }, + readOnlyModeEnabled: boolean, +}; + +type RouteParams = { + account?: AccountLike, + accountId: string, + modelId: DeviceModelId, + wired: boolean, + device?: Device, + onSuccess?: (address?: string) => void, + onError?: () => void, +}; + +export default function ReceiveConfirmation({ navigation, route }: Props) { + const { colors, dark } = useTheme(); + const { account, parentAccount } = useSelector(accountScreenSelector(route)); + const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector); + + const [verified, setVerified] = useState(false); + const [isModalOpened, setIsModalOpened] = useState(false); + const onModalHide = useRef(() => {}); + const [error, setError] = useState(null); + const [zoom, setZoom] = useState(false); + const [allowNavigation, setAllowNavigation] = useState(true); + const sub = useRef(); + + const { onSuccess, onError } = route.params; + + const verifyOnDevice = useCallback( + async (device: Device): Promise => { + if (!account) return; + const mainAccount = getMainAccount(account, parentAccount); + + sub.current = (mainAccount.id.startsWith("mock") + ? of({}).pipe(delay(1000), rejectionOp()) + : getAccountBridge(mainAccount).receive(mainAccount, { + deviceId: device.deviceId, + verify: true, + }) + ).subscribe({ + complete: () => { + setVerified(true); + setAllowNavigation(true); + onSuccess && onSuccess(mainAccount.freshAddress); + }, + error: error => { + if (error && error.name !== "UserRefusedAddress") { + logger.critical(error); + } + setError(error); + setIsModalOpened(true); + setAllowNavigation(true); + onError && onError(); + }, + }); + }, + [account, onError, onSuccess, parentAccount], + ); + + function onRetry(): void { + if (isModalOpened) { + setIsModalOpened(false); + onModalHide.current = navigation.goBack; + } else { + navigation.goBack(); + } + } + + function onModalClose(): void { + setIsModalOpened(false); + onModalHide.current = onDone; + } + + function onZoom(): void { + setZoom(!zoom); + } + + function onDone(): void { + const n = navigation.getParent(); + if (n) { + n.pop(); + } + } + + useEffect(() => { + if (!allowNavigation) { + navigation.setOptions({ + headerLeft: null, + headerRight: () => null, + gestureEnabled: false, + }); + } + }, [allowNavigation, colors, navigation]); + + useEffect(() => { + const device = route.params.device; + + if (device && !verified) { + verifyOnDevice(device); + } + setAllowNavigation(true); + }, [route.params, verified, verifyOnDevice]); + + if (!account) return null; + const { width } = getWindowDimensions(); + const unsafe = !route.params.device?.deviceId; + const QRSize = Math.round(width / 1.8 - 16); + const mainAccount = getMainAccount(account, parentAccount); + const currency = getAccountCurrency(account); + + return ( + + + {allowNavigation ? null : ( + <> + + + + )} + + + + {width < 350 ? ( + + + + + + ) : ( + + + + + + + + + )} + + + + + + + + + + {getAccountName(account)} + + + + + + {mainAccount.derivationMode === "taproot" ? ( + + + + + + ) : null} + + + } + > + + + + + + + + + + + {unsafe ? ( + + + + ) : verified ? ( + + + + ) : ( + + + + )} + + + {verified && ( + + + {isToastDisplayed ? ( + - + + +); + +export default AdditionalInfoModal; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx new file mode 100644 index 000000000000..8b74166bdc65 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx @@ -0,0 +1,94 @@ +import React, { useCallback, useState } from "react"; +import { TouchableOpacity } from "react-native"; +import { Trans } from "react-i18next"; +import styled from "styled-components/native"; +import { Flex, Text, Button, Checkbox } from "@ledgerhq/native-ui"; + +type Props = { + closeModal: Function; + setStep: Function; + setShouldNotRemindUserAgain: Function; +}; + +const ConfirmUnverified = ({ + closeModal, + setStep, + setShouldNotRemindUserAgain, +}: Props) => { + const [doNotRemindUserAgain, setDoNotRemindUserAgain] = useState(false); + const toggleDoNotRemindUserAgain = useCallback(() => { + setDoNotRemindUserAgain(!doNotRemindUserAgain); + }, [doNotRemindUserAgain]); + + const onGoBack = useCallback(() => { + setStep("initMessage"); + }, [setStep]); + const onCloseModal = useCallback(() => { + closeModal(); + if (doNotRemindUserAgain) { + setShouldNotRemindUserAgain(); + } + }, [closeModal, doNotRemindUserAgain, setShouldNotRemindUserAgain]); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default ConfirmUnverified; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx new file mode 100644 index 000000000000..9b37aa42b05a --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx @@ -0,0 +1,64 @@ +import React, { useCallback } from "react"; +import { TouchableOpacity } from "react-native"; +import { Trans } from "react-i18next"; +import styled from "styled-components/native"; +import { Flex, Text, Button } from "@ledgerhq/native-ui"; + +const NotNowButton = styled(TouchableOpacity)` + align-items: center; + justify-content: center; + margin-top: 32px; +`; + +type Props = { + setStep: Function; + onVerifyAddress: Function; +}; + +const InitMessage = ({ setStep, onVerifyAddress }: Props) => { + const onDontVerify = useCallback(() => { + setStep("confirmUnverified"); + }, [setStep]); + + return ( + + + + + + + + + + + + + + + + + + + + ); +}; + +export default InitMessage; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx new file mode 100644 index 000000000000..141fb042ad2e --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx @@ -0,0 +1,101 @@ +import React, { useCallback, useEffect, useState, useMemo } from "react"; +import { BottomDrawer } from "@ledgerhq/native-ui"; +import Animated, { + useSharedValue, + useAnimatedStyle, + withTiming, +} from "react-native-reanimated"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import InitMessage from "./InitMessage"; +import ConfirmUnverified from "./ConfirmUnverified"; + +const shouldNotRemindUserAgainToVerifyAddressOnReceive = + "shouldNotRemindUserAgainToVerifyAddressOnReceive"; + +const ReceiveSecurityModal = ({ + onVerifyAddress, +}: { + onVerifyAddress: Function; +}) => { + const [isModalOpen, setIsModalOpen] = useState(false); + + async function getShouldNotRemindUserAgain() { + const shouldNotRemindUserAgain = await AsyncStorage.getItem( + shouldNotRemindUserAgainToVerifyAddressOnReceive, + ); + return shouldNotRemindUserAgain + ? JSON.parse(shouldNotRemindUserAgain) + : false; + } + + async function setShouldNotRemindUserAgain() { + await AsyncStorage.setItem( + shouldNotRemindUserAgainToVerifyAddressOnReceive, + JSON.stringify(true), + ); + } + + useEffect(() => { + getShouldNotRemindUserAgain().then(shouldNotRemindUserAgain => { + if (!shouldNotRemindUserAgain || true) { + setTimeout(() => { + setIsModalOpen(true); + }, 800); + } + }); + }, []); + + const [step, setStep] = useState("initMessage"); + const sharedHeight = useSharedValue(0); + const onLayout = useCallback(({ nativeEvent: { layout } }) => { + sharedHeight.value = withTiming(layout.height, { duration: 200 }); + }, []); + + const animatedStyle = useAnimatedStyle( + () => ({ + height: sharedHeight.value, + }), + [], + ); + + const closeModal = useCallback(() => { + setIsModalOpen(false); + setStep("initMessage"); + sharedHeight.value = 0; + }, [setIsModalOpen, sharedHeight]); + + const onVerify = useCallback(() => { + closeModal(); + onVerifyAddress(); + }, [closeModal, onVerifyAddress]); + + const component = useMemo(() => { + const components = { + initMessage: , + confirmUnverified: ( + + ), + }; + + return components[step]; + }, [closeModal, onVerify, step]); + + return ( + + + {component} + + + ); +}; + +export default ReceiveSecurityModal; From 7fdf34f23449c8fd17c451a2c0ac069c645e9faf Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Thu, 23 Jun 2022 17:17:59 +0200 Subject: [PATCH 10/83] feat/LIVE-2451-receive-flow-receive-screen some text added to the toast on the receive screen --- apps/ledger-live-mobile/src/locales/en/common.json | 3 ++- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 7 +++++-- .../src/screens/ReceiveFunds/AdditionalInfoModal.tsx | 2 +- .../screens/ReceiveFunds/ReceiveSecurityModal/index.tsx | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index 2508f2a1234a..0ddb59e9a23e 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2187,7 +2187,8 @@ "yes": "Yes" }, "toastMessages": { - "accountImported": "We've imported a {{currencyTicker}} account for you." + "accountImported": "We've imported a {{currencyTicker}} account for you. ", + "why": "Tell me why." }, "additionalInfoModal": { "title": "Why we imported an account?", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index d8366c057940..4963e317c4d4 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -257,14 +257,14 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { - {isToastDisplayed ? ( {t("transfer.receive.toastMessages.accountImported", { currencyTicker: currency.ticker })} + + {t("transfer.receive.toastMessages.why")} + diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx index 4ef4099bf8e5..eb12c4001ed7 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx @@ -32,7 +32,7 @@ const AdditionalInfoModal = ({ values={{ currencyTicker }} /> - + diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx index 141fb042ad2e..85db6f9b3a6e 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx @@ -37,7 +37,7 @@ const ReceiveSecurityModal = ({ useEffect(() => { getShouldNotRemindUserAgain().then(shouldNotRemindUserAgain => { - if (!shouldNotRemindUserAgain || true) { + if (!shouldNotRemindUserAgain) { setTimeout(() => { setIsModalOpen(true); }, 800); From b7b60f0192806b5855c6a2eea38b45aff32f9ca3 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Sat, 25 Jun 2022 16:45:42 +0200 Subject: [PATCH 11/83] LLM - New receive flow functional draft --- .../src/components/CurrencyRow.js | 88 ---- .../src/components/CurrencyRow.tsx | 74 +++ .../NewReceiveFundsNavigator.tsx | 30 +- .../src/components/TabBar/TransferButton.tsx | 4 +- .../src/components/TabBar/TransferDrawer.tsx | 4 +- .../src/const/navigation.js | 4 + .../src/locales/en/common.json | 11 +- .../screens/ReceiveFunds/01-SelectAccount.tsx | 93 ---- .../screens/ReceiveFunds/01-SelectCrypto.tsx | 145 ++++++ .../screens/ReceiveFunds/02-AddAccount.tsx | 289 +++++++++++ .../02-AddAccountSelectDevice.tsx | 121 +++++ .../screens/ReceiveFunds/02-SelectAccount.tsx | 89 ++++ .../screens/ReceiveFunds/03-Confirmation.js | 476 ------------------ .../screens/ReceiveFunds/03-Confirmation.tsx | 56 ++- .../src/screens/ReceiveSelectAccount.tsx | 100 ---- .../src/screens/SelectCrypto.tsx | 25 - pnpm-lock.yaml | 95 ++-- 17 files changed, 855 insertions(+), 849 deletions(-) delete mode 100644 apps/ledger-live-mobile/src/components/CurrencyRow.js create mode 100644 apps/ledger-live-mobile/src/components/CurrencyRow.tsx delete mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx delete mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js delete mode 100644 apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx delete mode 100644 apps/ledger-live-mobile/src/screens/SelectCrypto.tsx diff --git a/apps/ledger-live-mobile/src/components/CurrencyRow.js b/apps/ledger-live-mobile/src/components/CurrencyRow.js deleted file mode 100644 index c90643fb23af..000000000000 --- a/apps/ledger-live-mobile/src/components/CurrencyRow.js +++ /dev/null @@ -1,88 +0,0 @@ -// @flow - -import { StyleSheet } from "react-native"; -import React, { PureComponent } from "react"; -import { RectButton } from "react-native-gesture-handler"; -import type { - CryptoCurrency, - TokenCurrency, -} from "@ledgerhq/live-common/lib/types"; - -import LText from "./LText"; -import CircleCurrencyIcon from "./CircleCurrencyIcon"; -import { withTheme } from "../colors"; - -type Props = { - currency: CryptoCurrency | TokenCurrency, - onPress: (CryptoCurrency | TokenCurrency) => void, - isOK?: boolean, - style?: *, - colors: *, - iconSize?: number, -}; - -class CurrencyRow extends PureComponent { - onPress = () => { - this.props.onPress(this.props.currency); - }; - - render() { - const { currency, style, isOK = true, colors, iconSize = 26 } = this.props; - - return ( - - - - {`${currency.name} (${currency.ticker})`} - - {currency.type === "TokenCurrency" && currency.parentCurrency ? ( - - {currency.parentCurrency.name} - - ) : null} - - ); - } -} - -const styles = StyleSheet.create({ - root: { - flexDirection: "row", - alignItems: "center", - padding: 16, - }, - name: { - flexGrow: 1, - flexShrink: 1, - marginLeft: 10, - fontSize: 14, - }, - currencyLabel: { - flexGrow: 0, - flexShrink: 0, - flexBasis: "auto", - textAlign: "right", - borderRadius: 4, - borderWidth: 1, - paddingHorizontal: 6, - fontSize: 10, - height: 24, - lineHeight: 24, - marginLeft: 12, - }, -}); - -export default withTheme(CurrencyRow); diff --git a/apps/ledger-live-mobile/src/components/CurrencyRow.tsx b/apps/ledger-live-mobile/src/components/CurrencyRow.tsx new file mode 100644 index 000000000000..961e4081de71 --- /dev/null +++ b/apps/ledger-live-mobile/src/components/CurrencyRow.tsx @@ -0,0 +1,74 @@ +// @flow +import React, { PureComponent } from "react"; +import { RectButton } from "react-native-gesture-handler"; +import type { + CryptoCurrency, + TokenCurrency, +} from "@ledgerhq/live-common/lib/types"; + +import LText from "./LText"; +import CircleCurrencyIcon from "./CircleCurrencyIcon"; +import styled from "styled-components/native"; +import {Flex, Tag} from "@ledgerhq/native-ui"; + +const StyledRectButton = styled(RectButton)` + flex-direction: row; + align-items: center; + padding: 16px; +` + +type Props = { + currency: CryptoCurrency | TokenCurrency, + onPress: (currency: CryptoCurrency | TokenCurrency) => void, + isOK?: boolean, + style?: any, + colors: any, + iconSize?: number, +}; + +class CurrencyRow extends PureComponent { + onPress = () => { + this.props.onPress(this.props.currency); + }; + + render() { + const { currency, style, isOK = true, colors, iconSize = 32 } = this.props; + + return ( + + + + + {currency.name} + + + {currency.ticker} + + + {currency.type === "TokenCurrency" && currency.parentCurrency ? ( + + {currency.parentCurrency.name} + + ) : null} + + ); + } +} + +export default CurrencyRow; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index d41148b783cc..a455c6bfb372 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -3,12 +3,15 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; import { useTheme } from "styled-components/native"; -import { findCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; -import ReceiveSelectCrypto from "../../screens/SelectCrypto"; -import ReceiveSelectAccount from "../../screens/ReceiveSelectAccount"; +import ReceiveSelectCrypto from "../../screens/ReceiveFunds/01-SelectCrypto"; + +import ReceiveAddAccountSelectDevice from "../../screens/ReceiveFunds/02-AddAccountSelectDevice"; +import ReceiveSelectAccount from "../../screens/ReceiveFunds/02-SelectAccount"; +import ReceiveAddAccount from "../../screens/ReceiveFunds/02-AddAccount"; + import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; export default function NewReceiveFundsNavigator() { @@ -33,6 +36,7 @@ export default function NewReceiveFundsNavigator() { headerTitle: "", }} /> + {/* Select Account */} + + {/* Select Account */} + + + {/* Select Account */} + + {/* Select / Connect Device */} diff --git a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx index a14617ab2148..af3ab4ba2b95 100644 --- a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx +++ b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx @@ -56,9 +56,7 @@ export default function TransferDrawer({ onClose }: ModalProps) { ); const onReceiveFunds = useCallback( () => - onNavigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveSelectAccount, - }), + onNavigate(NavigatorName.ReceiveFunds), [onNavigate], ); const onSwap = useCallback( diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 9d9090ead33d..566b0273ebb9 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -101,10 +101,14 @@ export const ScreenName = { PortfolioOperationHistory: "PortfolioOperationHistory", PurchaseDevice: "PurchaseDevice", RateProviderSettings: "RateProviderSettings", + ReceiveConfirmation: "ReceiveConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", ReceiveSelectCrypto: "ReceiveSelectCrypto", ReceiveSelectAccount: "ReceiveSelectAccount", + ReceiveAddAccountSelectDevice: "ReceiveAddAccountSelectDevice", + ReceiveAddAccount: "ReceiveAddAccount", + RegionSettings: "RegionSettings", RepairDevice: "RepairDevice", Resources: "Resources", diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index 0ddb59e9a23e..05d5b1117bc3 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2161,10 +2161,19 @@ "shareAddress": "Share address", "addressCopied": "Copied", "taprootWarning": "Make sure the sender supports taproot", + "selectCrypto": { + "title": "Select a crypto" + }, "selectAccount": { - "title": "Select account", + "title": "Select an account", "subtitle": "Your {{currencyTicker}} will be deposited into this account." }, + "addAccount": { + "title": "Blockchain synchronization", + "subtitle": "We are verifying if you already have an {{currencyTicker}} account on blockchain.", + "foundAccounts": "{{count}} accounts found", + "stopSynchronization": "Stop synchronization" + }, "receiveConfirmation": { "title": "Receive {{currencyTicker}}", "addressVerified": "Address verified", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx deleted file mode 100644 index 3d589bd10533..000000000000 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useCallback, useMemo } from "react"; -import SafeAreaView from "react-native-safe-area-view"; -import { useSelector } from "react-redux"; -import { useTheme } from "styled-components/native"; -import { - accountWithMandatoryTokens, - flattenAccounts, -} from "@ledgerhq/live-common/lib/account/helpers"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex } from "@ledgerhq/native-ui"; - -import { accountsSelector } from "../../reducers/accounts"; -import { ScreenName } from "../../const"; -import { TrackScreen } from "../../analytics"; -import KeyboardView from "../../components/KeyboardView"; -import AccountSelector from "../../components/AccountSelector"; - -const forceInset = { bottom: "always" }; - -type Props = { - navigation: any; - route: { - params?: { - currency?: string; - selectedCurrency?: CryptoCurrency | TokenCurrency; - }; - }; -}; - -export default function ReceiveFunds({ navigation, route }: Props) { - const { colors } = useTheme(); - const { selectedCurrency, currency: initialCurrencySelected } = - route.params || {}; - - const accounts = useSelector(accountsSelector); - const enhancedAccounts = useMemo(() => { - if (selectedCurrency) { - const filteredAccounts = accounts.filter( - acc => - acc.currency.id === - (selectedCurrency.type === "TokenCurrency" - ? selectedCurrency.parentCurrency.id - : selectedCurrency.id), - ); - if (selectedCurrency.type === "TokenCurrency") { - // add in the token subAccount if it does not exist - return flattenAccounts( - filteredAccounts.map(acc => - accountWithMandatoryTokens(acc, [selectedCurrency]), - ), - ).filter( - acc => - acc.type === "Account" || - (acc.type === "TokenAccount" && - acc.token.id === selectedCurrency.id), - ); - } - return flattenAccounts(filteredAccounts); - } - return flattenAccounts(accounts); - }, [accounts, selectedCurrency]); - const allAccounts = enhancedAccounts; - - const handleSelectAccount = useCallback( - account => { - navigation.navigate(ScreenName.ReceiveConnectDevice, { - account, - accountId: account.id, - parentId: account.type !== "Account" ? account.parentId : undefined, - }); - }, - [navigation], - ); - - return ( - - - - - - - - - ); -} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx new file mode 100644 index 000000000000..8e16085cd674 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -0,0 +1,145 @@ +// @flow +import React, { useCallback, useMemo } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { StyleSheet, FlatList } from "react-native"; +import type { + CryptoCurrency, + TokenCurrency, +} from "@ledgerhq/live-common/lib/types"; +import { + isCurrencySupported, + listTokens, + useCurrenciesByMarketcap, + listSupportedCurrencies, +} from "@ledgerhq/live-common/lib/currencies"; + +import {Flex } from "@ledgerhq/native-ui"; +import { useSelector } from "react-redux"; +import { Account, TokenAccount } from "@ledgerhq/live-common/src/types"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import FilteredSearchBar from "../../components/FilteredSearchBar"; +import CurrencyRow from "../../components/CurrencyRow"; +import LText from "../../components/LText"; +import { flattenAccountsSelector } from "../../reducers/accounts"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; + +const SEARCH_KEYS = ["name", "ticker"]; + +type Props = { + devMode: boolean, + navigation: any, + route: { params: { filterCurrencyIds?: string[] } }, +}; + +const keyExtractor = (currency: CryptoCurrency | TokenCurrency) => currency.id; + +const renderEmptyList = () => ( + + + + + +); + +const listSupportedTokens = () => + listTokens().filter(t => isCurrencySupported(t.parentCurrency)); + +const findAccountByCurrency = (accounts: (TokenAccount | Account)[], currency: CryptoCurrency | TokenCurrency) => accounts.filter((acc: TokenAccount | Account) => + (acc.type === "Account" ? acc.currency?.id : acc.token.id) === currency.id + ) + +export default function AddAccountsSelectCrypto({ navigation, route }: Props) { + const {t } = useTranslation(); + const { filterCurrencyIds = [] } = route.params || {}; + const cryptoCurrencies = useMemo( + () => + listSupportedCurrencies() + .concat(listSupportedTokens()) + .filter( + ({ id }) => + filterCurrencyIds.length <= 0 || filterCurrencyIds.includes(id), + ), + [filterCurrencyIds], + ); + + const accounts = useSelector(flattenAccountsSelector); + + const sortedCryptoCurrencies = useCurrenciesByMarketcap(cryptoCurrencies); + + const onPressItem = useCallback((currency: CryptoCurrency | TokenCurrency) => { + + const accs = findAccountByCurrency(accounts, currency); + if(accs.length > 1) { + navigation.navigate(ScreenName.ReceiveSelectAccount, { + currency + }); + } else if(accs.length === 1) { + navigation.navigate(ScreenName.ReceiveConfirmation, { + accountId: accs[0].id, + parentId: accs[0]?.parentId, + }); + } else if (currency.type === "TokenCurrency") { + const parentAccounts = findAccountByCurrency(accounts, currency.parentCurrency); + if (parentAccounts.length > 1) { + navigation.navigate(ScreenName.ReceiveSelectAccount, { + currency, + createTokenAccount: true + }); + } else if (parentAccounts.length === 1) { + navigation.navigate(ScreenName.ReceiveConfirmation, { + accountId: parentAccounts[0].id, + currency, + createTokenAccount: true + }); + } else { + navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { + currency: currency.parentCurrency, + createTokenAccount: true + }); + } + } else { + navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { + currency, + }); + } + + }, [accounts, navigation]); + + const renderList = useCallback((items: any) => ( + ( + + )} + keyExtractor={keyExtractor} + showsVerticalScrollIndicator={false} + keyboardDismissMode="on-drag" + /> + ), [onPressItem]); + + return ( + <> + + {t("transfer.receive.selectCrypto.title")} + + + ); +} + +const styles = StyleSheet.create({ + list: { + paddingBottom: 32, + }, + filteredSearchInputWrapperStyle: { + marginHorizontal: 16, + marginBottom: 16 + }, +}); diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx new file mode 100644 index 000000000000..deead71204ae --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -0,0 +1,289 @@ +import React, { + PureComponent, + useEffect, + useCallback, + useState, + useRef, + memo, + useMemo, +} from "react"; +import { StyleSheet, SafeAreaView, FlatList } from "react-native"; +import { concat, from } from "rxjs"; +import { ignoreElements } from "rxjs/operators"; +import { connect, useDispatch } from "react-redux"; +import { compose } from "redux"; +import { + isAccountEmpty, + groupAddAccounts, +} from "@ledgerhq/live-common/lib/account"; +import type { AddAccountSupportLink } from "@ledgerhq/live-common/lib/account/addAccounts"; +import { createStructuredSelector } from "reselect"; +import uniq from "lodash/uniq"; +import { Trans, useTranslation } from "react-i18next"; +import type { CryptoCurrency, Account, Currency, AccountLike } from "@ledgerhq/live-common/lib/types"; +import { getCurrencyBridge } from "@ledgerhq/live-common/lib/bridge"; +import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; + +import type { DerivationMode } from "@ledgerhq/live-common/lib/derivation"; + +import { useTheme } from "@react-navigation/native"; +import { Flex, InfiniteLoader } from "@ledgerhq/native-ui"; +import { replaceAccounts } from "../../actions/accounts"; +import { accountsSelector } from "../../reducers/accounts"; +import logger from "../../logger"; +import { withTheme } from "../../colors"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import Button from "../../components/Button"; +import PreventNativeBack from "../../components/PreventNativeBack"; +import SelectableAccountsList from "../../components/SelectableAccountsList"; +import LiveLogo from "../../icons/LiveLogoIcon"; +import IconPause from "../../icons/Pause"; +import ExternalLink from "../../icons/ExternalLink"; +import Chevron from "../../icons/Chevron"; +import Info from "../../icons/Info"; +import Spinning from "../../components/Spinning"; +import LText from "../../components/LText"; +import RetryButton from "../../components/RetryButton"; +import CancelButton from "../../components/CancelButton"; +import GenericErrorBottomModal from "../../components/GenericErrorBottomModal"; +import NavigationScrollView from "../../components/NavigationScrollView"; +import { prepareCurrency } from "../../bridge/cache"; +import { blacklistedTokenIdsSelector } from "../../reducers/settings"; +import BottomModal from "../../components/BottomModal"; +import { urls } from "../../config/urls"; +import AccountCard from "../../components/AccountCard"; + +type RouteParams = { + currency: CryptoCurrency, + device: Device, + onSuccess?: (params?: any) => void, +}; + +type OwnProps = {}; + +type Props = { + navigation: any; + route: { params: RouteParams }; + blacklistedTokenIds?: string[]; + colors: any; +}; + + + +function AddAccountsAccounts({ + navigation, + route, +}: Props) { + const { colors } = useTheme(); + const dispatch = useDispatch(); + + const [scanning, setScanning] = useState(true); + const [error, setError] = useState(null); + const [latestScannedAccount, setLatestScannedAccount] = useState(null); + const [scannedAccounts, setScannedAccounts] = useState([]); + const [cancelled, setCancelled] = useState(false); + + const scanSubscription = useRef(); + + const { + currency, + device: { deviceId }, + device + } = route.params || {}; + + useEffect(() => { + startSubscription(); + return () => stopSubscription(false); + }, []); + + const startSubscription = useCallback(() => { + const bridge = getCurrencyBridge(currency); + const syncConfig = { + paginationConfig: { + operation: 0, + }, + blacklistedTokenIds: [], + }; + // will be set to false if an existing account is found + + scanSubscription.current = concat( + from(prepareCurrency(currency)).pipe(ignoreElements()), + bridge.scanAccounts({ + currency, + deviceId, + syncConfig, + }), + ).subscribe({ + next: ({ account }) => { + setScannedAccounts((accs) => [...accs, account]) + }, + complete: () => setScanning(false), + error: error => { + logger.critical(error); + setError(error); + }, + }); + }, [currency, deviceId]); + + const restartSubscription = useCallback(() => { + setScanning(true); + setScannedAccounts([]); + setError(null); + setCancelled(false); + startSubscription(); + }, []); + + const stopSubscription = useCallback((syncUI?: boolean = true) => { + if (scanSubscription.current) { + scanSubscription.current.unsubscribe(); + scanSubscription.current = null; + if (syncUI) { + setScanning(false); + } + } + }, []); + + const onCancel = useCallback(() => { + setError(null); + setCancelled(true); + }, []); + + const onModalHide = useCallback(() => { + if (cancelled) { + navigation.getParent().pop(); + } + }, [cancelled, navigation]); + + const selectAccount = useCallback( + (account: Account) => { + dispatch(replaceAccounts({ scannedAccounts, selectedIds: [account.id], renamings: {}})); + navigation.navigate(ScreenName.ReceiveConfirmation, {...route.params, accountId: account.id }); + }, + [dispatch, navigation, route.params, scannedAccounts], + ); + + const renderItem = useCallback( + ({ item: account }: { item: Account }) => ( + + selectAccount(account)} /> + + ), + [selectAccount], + ); + + const keyExtractor = useCallback(item => item?.id, []); + + return ( + + + + {scanning ? : ( + + )} + + + + + } + /> + + ); +} + +function ScanLoading({ currency, scannedAccounts, stopSubscription }: {currency: Currency, scannedAccounts: Account[], stopSubscription: () => void}) { + const { t } = useTranslation(); + return ( + + + {t("transfer.receive.addAccount.title")} + {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} + { + scannedAccounts?.length > 0 ? <> + {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} + + : null } + + ); + } + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + paddingHorizontal: { + paddingHorizontal: 16, + }, + inner: { + paddingTop: 24, + }, + innerContent: { + paddingBottom: 24, + }, + descText: { + paddingHorizontal: 16, + marginBottom: 16, + textAlign: "center", + }, + scanLoadingRoot: { + flexDirection: "row", + marginHorizontal: 16, + marginBottom: 16, + alignItems: "center", + justifyContent: "center", + height: 40, + borderWidth: 1, + borderStyle: "dashed", + borderRadius: 4, + }, + scanLoadingText: { + fontSize: 14, + marginLeft: 8, + }, + footer: { + borderTopWidth: 1, + padding: 16, + }, + addAccountsError: { + marginHorizontal: 16, + marginBottom: 16, + }, + button: { + flex: 1, + marginHorizontal: 8, + }, + buttonRight: { + marginLeft: 8, + }, + smallMarginBottom: { marginBottom: 8 }, + moreAddressTypesContainer: { paddingHorizontal: 16, marginBottom: 32 }, + subtitle: { fontSize: 14 }, + title: { fontSize: 16 }, + modalTitle: { fontSize: 20 }, + modal: { paddingHorizontal: 24 }, + modalContainer: { + marginTop: 24, + marginBottom: 16, + alignItems: "center", + justifyContent: "center", + }, + modalRow: { marginVertical: 16 }, +}); + +export default AddAccountsAccounts; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx new file mode 100644 index 000000000000..abe82d72baca --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx @@ -0,0 +1,121 @@ +// @flow + +import React, { useCallback, useEffect, useState } from "react"; +import { StyleSheet, SafeAreaView } from "react-native"; +import { useDispatch } from "react-redux"; +import type { CryptoCurrency } from "@ledgerhq/live-common/lib/types"; +import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; +import { createAction } from "@ledgerhq/live-common/lib/hw/actions/app"; +import connectApp from "@ledgerhq/live-common/lib/hw/connectApp"; +import { useTheme } from "@react-navigation/native"; +import { prepareCurrency } from "../../bridge/cache"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import SelectDevice from "../../components/SelectDevice"; +import NavigationScrollView from "../../components/NavigationScrollView"; +import DeviceActionModal from "../../components/DeviceActionModal"; +import SkipSelectDevice from "../SkipSelectDevice"; +import { setLastConnectedDevice } from "../../actions/settings"; + +type Props = { + navigation: any, + route: { params: RouteParams }, +}; + +type RouteParams = { + currency: CryptoCurrency, + inline?: boolean, + analyticsPropertyFlow?: string, +}; + +const action = createAction(connectApp); + +export default function AddAccountsSelectDevice({ navigation, route }: Props) { + const { colors } = useTheme(); + const [device, setDevice] = useState(); + const dispatch = useDispatch(); + + const onSetDevice = useCallback( + device => { + dispatch(setLastConnectedDevice(device)); + setDevice(device); + }, + [dispatch], + ); + + const onClose = useCallback(() => { + setDevice(); + }, []); + + const onResult = useCallback( + meta => { + setDevice(); + const { inline } = route.params; + const arg = { ...route.params, ...meta }; + if (inline) { + navigation.replace(ScreenName.ReceiveAddAccount, arg); + } else { + navigation.navigate(ScreenName.ReceiveAddAccount, arg); + } + }, + [navigation, route], + ); + + useEffect(() => { + // load ahead of time + prepareCurrency(route.params.currency); + }, [route.params.currency]); + + const currency = route.params.currency; + const analyticsPropertyFlow = route.params?.analyticsPropertyFlow; + return ( + + + + + + + setDevice()} + analyticsPropertyFlow={analyticsPropertyFlow || "add account"} + /> + + ); +} + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + scroll: { + flex: 1, + backgroundColor: "transparent", + }, + scrollContainer: { + padding: 16, + }, +}); diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx new file mode 100644 index 000000000000..002dd87ef905 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -0,0 +1,89 @@ +import React, { useCallback, useEffect } from "react"; +import { FlatList } from "react-native"; +import SafeAreaView from "react-native-safe-area-view"; +import { useSelector } from "react-redux"; + +import { Flex } from "@ledgerhq/native-ui"; +import styled from "styled-components/native"; +import { useTranslation } from "react-i18next"; +import { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; +import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import AccountCard from "../../components/AccountCard"; +import LText from "../../components/LText"; + +const forceInset = { bottom: "always" }; + +const StyledSaferAreaView = styled(SafeAreaView)` + flex: 1; + background-color: ${p => p.theme.colors.background.main}; +`; + +type Props = { + navigation: any; + route: { params?: { currency?: Currency } }; +}; + +function ReceiveSelectAccount({ navigation, route }: Props) { + const currency = route.params?.currency; + const { t } = useTranslation(); + + const accounts = useSelector( + flattenAccountsByCryptoCurrencyScreenSelector(currency), + ); + + const selectAccount = useCallback( + (account: AccountLike) => { + navigation.navigate(ScreenName.ReceiveConfirmation, { + ...route.params, + accountId: account.id, + }); + }, + [navigation, route.params], + ); + + useEffect(() => { + if (accounts.length === 1) { + selectAccount(accounts[0]); + } else if (accounts.length <= 0) { + navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { + ...route.params, + currency, + }); + } + }, [accounts, currency, navigation, route.params, selectAccount]); + + const renderItem = useCallback( + ({ item: account }: { item: SearchResult }) => ( + + selectAccount(account)} /> + + ), + [selectAccount], + ); + + const keyExtractor = useCallback(item => item?.id, []); + + return accounts.length > 1 ? ( + + + + {t("transfer.receive.selectAccount.title")} + + + {t("transfer.receive.selectAccount.subtitle", { + currencyTicker: currency?.ticker, + })} + + + + ) : null; +} + +export default ReceiveSelectAccount; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js deleted file mode 100644 index 8c40959a86b8..000000000000 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js +++ /dev/null @@ -1,476 +0,0 @@ -// @flow - -import React, { useCallback, useEffect, useRef, useState } from "react"; -import { of } from "rxjs"; -import { delay } from "rxjs/operators"; -import { View, StyleSheet, Platform } from "react-native"; -import { useSelector } from "react-redux"; -import QRCode from "react-native-qrcode-svg"; -import { Trans } from "react-i18next"; -import ReactNativeModal from "react-native-modal"; -import type { - Account, - TokenAccount, - AccountLike, -} from "@ledgerhq/live-common/lib/types"; -import { - getMainAccount, - getAccountCurrency, - getAccountName, -} from "@ledgerhq/live-common/lib/account"; -import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; -import type { DeviceModelId } from "@ledgerhq/devices"; -import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; -import { useTheme } from "@react-navigation/native"; -import getWindowDimensions from "../../logic/getWindowDimensions"; -import { accountScreenSelector } from "../../reducers/accounts"; -import { TrackScreen } from "../../analytics"; -import PreventNativeBack from "../../components/PreventNativeBack"; -import LText from "../../components/LText/index"; -import DisplayAddress from "../../components/DisplayAddress"; -import Alert from "../../components/Alert"; -import BottomModal from "../../components/BottomModal"; -import QRcodeZoom from "../../icons/QRcodeZoom"; -import Touchable from "../../components/Touchable"; -import Button from "../../components/Button"; -import CurrencyIcon from "../../components/CurrencyIcon"; -import CopyLink from "../../components/CopyLink"; -import ShareLink from "../../components/ShareLink"; -import NavigationScrollView from "../../components/NavigationScrollView"; -import { urls } from "../../config/urls"; -import { readOnlyModeEnabledSelector } from "../../reducers/settings"; -import SkipLock from "../../components/behaviour/SkipLock"; -import logger from "../../logger"; -import { rejectionOp } from "../../logic/debugReject"; -import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; -import GenericErrorView from "../../components/GenericErrorView"; - -type Props = { - account: ?(TokenAccount | Account), - parentAccount: ?Account, - navigation: any, - route: { params: RouteParams }, - readOnlyModeEnabled: boolean, -}; - -type RouteParams = { - account?: AccountLike, - accountId: string, - modelId: DeviceModelId, - wired: boolean, - device?: Device, - onSuccess?: (address?: string) => void, - onError?: () => void, -}; - -export default function ReceiveConfirmation({ navigation, route }: Props) { - const { colors, dark } = useTheme(); - const { account, parentAccount } = useSelector(accountScreenSelector(route)); - const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector); - - const [verified, setVerified] = useState(false); - const [isModalOpened, setIsModalOpened] = useState(false); - const onModalHide = useRef(() => {}); - const [error, setError] = useState(null); - const [zoom, setZoom] = useState(false); - const [allowNavigation, setAllowNavigation] = useState(true); - const sub = useRef(); - - const { onSuccess, onError } = route.params; - - const verifyOnDevice = useCallback( - async (device: Device): Promise => { - if (!account) return; - const mainAccount = getMainAccount(account, parentAccount); - - sub.current = (mainAccount.id.startsWith("mock") - ? // $FlowFixMe - of({}).pipe(delay(1000), rejectionOp()) - : getAccountBridge(mainAccount).receive(mainAccount, { - deviceId: device.deviceId, - verify: true, - }) - ).subscribe({ - complete: () => { - setVerified(true); - setAllowNavigation(true); - onSuccess && onSuccess(mainAccount.freshAddress); - }, - error: error => { - if (error && error.name !== "UserRefusedAddress") { - logger.critical(error); - } - setError(error); - setIsModalOpened(true); - setAllowNavigation(true); - onError && onError(); - }, - }); - }, - [account, onError, onSuccess, parentAccount], - ); - - function onRetry(): void { - if (isModalOpened) { - setIsModalOpened(false); - onModalHide.current = navigation.goBack; - } else { - navigation.goBack(); - } - } - - function onModalClose(): void { - setIsModalOpened(false); - onModalHide.current = onDone; - } - - function onZoom(): void { - setZoom(!zoom); - } - - function onDone(): void { - const n = navigation.getParent(); - if (n) { - n.pop(); - } - } - - useEffect(() => { - if (!allowNavigation) { - navigation.setOptions({ - headerLeft: null, - headerRight: () => null, - gestureEnabled: false, - }); - return; - } - - const { headerRight } = getStackNavigatorConfig(colors, true); - navigation.setOptions({ - headerLeft: null, - headerRight, - gestureEnabled: Platform.OS === "ios", - }); - }, [allowNavigation, colors, navigation]); - - useEffect(() => { - const device = route.params.device; - - if (device && !verified) { - verifyOnDevice(device); - } - setAllowNavigation(true); - }, [route.params, verified, verifyOnDevice]); - - if (!account) return null; - const { width } = getWindowDimensions(); - const unsafe = !route.params.device?.deviceId; - const QRSize = Math.round(width / 1.8 - 16); - const mainAccount = getMainAccount(account, parentAccount); - const currency = getAccountCurrency(account); - - return ( - - - {allowNavigation ? null : ( - <> - - - - )} - - - - {width < 350 ? ( - - - - - - ) : ( - - - - - - - - - )} - - - - - - - - - - {getAccountName(account)} - - - - - - {mainAccount.derivationMode === "taproot" ? ( - - - - - - ) : null} - - - } - > - - - - - - - - - - - {unsafe ? ( - - - - ) : verified ? ( - - - - ) : ( - - - - )} - - - {verified && ( - - - - ); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b6b486309a1..ab119f75d34e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3296,6 +3296,7 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.21.0 semver: 6.3.0 + dev: false /@babel/helper-create-class-features-plugin/7.17.9: resolution: {integrity: sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==} @@ -3448,7 +3449,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false /@babel/helper-environment-visitor/7.16.7: resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} @@ -3702,7 +3702,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.18.5 dev: false /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.10: @@ -3730,6 +3730,7 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.9.0: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} @@ -3780,7 +3781,6 @@ packages: '@babel/helper-plugin-utils': 7.17.12 transitivePeerDependencies: - supports-color - dev: false /@babel/plugin-proposal-class-properties/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==} @@ -3869,6 +3869,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.5 + dev: false /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} @@ -3919,7 +3920,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.9.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.5 dev: false /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.10: @@ -3941,6 +3942,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.5 + dev: false /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} @@ -3971,7 +3973,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.9.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.5 dev: false /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.10: @@ -4034,6 +4036,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.5 + dev: false /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} @@ -4255,6 +4258,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} @@ -4325,7 +4329,6 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - dev: false /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -4362,7 +4365,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.17.10: @@ -4450,7 +4453,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-syntax-import-meta/7.10.4: @@ -4565,7 +4568,6 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - dev: false /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -5049,6 +5051,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} @@ -5078,6 +5081,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} @@ -5293,6 +5297,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} @@ -5380,6 +5385,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.9.0: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} @@ -5420,6 +5426,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} @@ -5451,6 +5458,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.18.5 + dev: false /@babel/plugin-transform-named-capturing-groups-regex/7.17.10_@babel+core@7.9.0: resolution: {integrity: sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==} @@ -5479,6 +5487,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} @@ -5617,7 +5626,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.9.0 + '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 dev: false @@ -5676,6 +5685,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.18.5 + dev: false /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} @@ -5712,7 +5722,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-transform-react-jsx-source/7.16.7_@babel+core@7.17.10: @@ -5740,7 +5750,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.10: @@ -5850,6 +5860,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} @@ -6037,6 +6048,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} @@ -6419,6 +6431,7 @@ packages: '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.18.5 '@babel/types': 7.17.10 esutils: 2.0.3 + dev: false /@babel/preset-modules/0.1.5_@babel+core@7.9.0: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} @@ -6457,10 +6470,10 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.9.0 - '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.18.5 + '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.18.5 dev: false /@babel/preset-react/7.9.1_@babel+core@7.9.0: @@ -19711,14 +19724,6 @@ packages: resolution: {integrity: sha1-2edrEXM+CFacCEeuezmyhgswt0U=} dev: false - /arr-diff/2.0.0: - resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - dev: true - optional: true - /arr-diff/4.0.0: resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} engines: {node: '>=0.10.0'} @@ -20031,14 +20036,14 @@ packages: /axios/0.21.1: resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} dependencies: - follow-redirects: 1.15.0_debug@4.3.4 + follow-redirects: 1.15.0 transitivePeerDependencies: - debug /axios/0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.0_debug@4.3.4 + follow-redirects: 1.15.0 transitivePeerDependencies: - debug dev: false @@ -20054,7 +20059,7 @@ packages: /axios/0.25.0: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} dependencies: - follow-redirects: 1.15.0_debug@4.3.4 + follow-redirects: 1.15.0 transitivePeerDependencies: - debug @@ -20069,14 +20074,14 @@ packages: /axios/0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} dependencies: - follow-redirects: 1.15.0_debug@4.3.4 + follow-redirects: 1.15.0 transitivePeerDependencies: - debug /axios/0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.0_debug@4.3.4 + follow-redirects: 1.15.0 form-data: 4.0.0 transitivePeerDependencies: - debug @@ -20200,6 +20205,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /babel-jest/24.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} @@ -20594,7 +20600,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.10: resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} @@ -20629,7 +20634,6 @@ packages: core-js-compat: 3.22.5 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.17.10: resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} @@ -20650,7 +20654,6 @@ packages: '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-react-docgen/4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} @@ -20846,6 +20849,7 @@ packages: '@babel/core': 7.18.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.5 babel-plugin-jest-hoist: 24.9.0 + dev: false /babel-preset-jest/24.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} @@ -21966,7 +21970,7 @@ packages: mkdirp: 0.5.6 move-concurrently: 1.0.1 p-map: 3.0.0 - promise-inflight: 1.0.1_bluebird@3.7.2 + promise-inflight: 1.0.1 rimraf: 2.7.1 ssri: 7.1.1 unique-filename: 1.1.1 @@ -23392,7 +23396,7 @@ packages: dev: false /core-util-is/1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -26027,7 +26031,7 @@ packages: dependencies: confusing-browser-globals: 1.0.11 eslint: 7.32.0 - eslint-plugin-import: 2.26.0_eslint@7.32.0 + eslint-plugin-import: 2.26.0_ffi3uiz42rv3jyhs6cr7p7qqry object.assign: 4.1.2 object.entries: 1.1.5 dev: true @@ -26044,7 +26048,7 @@ packages: dependencies: eslint: 7.32.0 eslint-config-airbnb-base: 14.2.1_hpmu7kn6tcn2vnxpfzvv33bxmy - eslint-plugin-import: 2.26.0_eslint@7.32.0 + eslint-plugin-import: 2.26.0_ffi3uiz42rv3jyhs6cr7p7qqry eslint-plugin-jsx-a11y: 6.5.1_eslint@7.32.0 eslint-plugin-react: 7.29.4_eslint@7.32.0 eslint-plugin-react-hooks: 4.5.0_eslint@7.32.0 @@ -28313,6 +28317,8 @@ packages: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} requiresBuild: true + dev: true + optional: true /eyes/0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} @@ -28927,6 +28933,15 @@ packages: tabbable: 5.3.2 dev: false + /follow-redirects/1.15.0: + resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + /follow-redirects/1.15.0_debug@4.3.2: resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==} engines: {node: '>=4.0'} @@ -28949,6 +28964,7 @@ packages: optional: true dependencies: debug: 4.3.4_supports-color@6.1.0 + dev: false /fontfaceobserver/2.1.0: resolution: {integrity: sha512-ReOsO2F66jUa0jmv2nlM/s1MiutJx/srhAe2+TE8dJCMi02ZZOcCTxTCQFr3Yet+uODUtnr4Mewg+tNQ+4V1Ng==} @@ -28973,6 +28989,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: for-in: 1.0.2 + dev: false /for-own/1.0.0: resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} @@ -30811,7 +30828,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.0_debug@4.3.4 + follow-redirects: 1.15.0 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -40696,7 +40713,6 @@ packages: peerDependenciesMeta: bluebird: optional: true - dev: true /promise-inflight/1.0.1_bluebird@3.7.2: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} @@ -44479,6 +44495,7 @@ packages: /slash/1.0.0: resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} engines: {node: '>=0.10.0'} + dev: false /slash/2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} @@ -50363,7 +50380,7 @@ packages: optional: true /xmlbuilder/9.0.7: - resolution: {integrity: sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=} + resolution: {integrity: sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==} engines: {node: '>=4.0'} requiresBuild: true From abb2cc2e09225e5c35e627fb22cd479157ef48c9 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Sun, 26 Jun 2022 16:25:25 +0200 Subject: [PATCH 12/83] LLM - New Receive Flow - full flow complete --- .changeset/warm-months-attend.md | 5 + .../NewReceiveFundsNavigator.tsx | 34 +++- apps/ledger-live-mobile/src/config/urls.tsx | 2 + .../src/const/navigation.js | 1 + .../src/images/illustration/Dark/_080.png | Bin 0 -> 11610 bytes .../src/images/illustration/Light/_080.png | Bin 0 -> 17945 bytes .../src/locales/en/common.json | 16 +- .../screens/ReceiveFunds/01-SelectCrypto.tsx | 2 + .../screens/ReceiveFunds/02-AddAccount.tsx | 29 ++- .../screens/ReceiveFunds/02-SelectAccount.tsx | 90 +++++---- .../screens/ReceiveFunds/03-Confirmation.tsx | 189 ++++------------- ...ConnectDevice.js => 03a-ConnectDevice.tsx} | 24 +-- .../ReceiveFunds/03b-VerifyAddress.tsx | 191 ++++++++++++++++++ .../components/message/Notification/index.tsx | 71 +++++-- .../Notification/Notification.stories.tsx | 12 +- 15 files changed, 429 insertions(+), 237 deletions(-) create mode 100644 .changeset/warm-months-attend.md create mode 100644 apps/ledger-live-mobile/src/images/illustration/Dark/_080.png create mode 100644 apps/ledger-live-mobile/src/images/illustration/Light/_080.png rename apps/ledger-live-mobile/src/screens/ReceiveFunds/{02-ConnectDevice.js => 03a-ConnectDevice.tsx} (89%) create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx diff --git a/.changeset/warm-months-attend.md b/.changeset/warm-months-attend.md new file mode 100644 index 000000000000..76b2f53fd2c9 --- /dev/null +++ b/.changeset/warm-months-attend.md @@ -0,0 +1,5 @@ +--- +"@ledgerhq/native-ui": patch +--- + +UI - native - notifications component styles extended diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index a455c6bfb372..a71792877772 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -3,9 +3,11 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; import { useTheme } from "styled-components/native"; +import { useTranslation } from "react-i18next"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; -import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; +import ReceiveConnectDevice from "../../screens/ReceiveFunds/03a-ConnectDevice"; +import ReceiveVerifyAddress from "../../screens/ReceiveFunds/03b-VerifyAddress"; import ReceiveSelectCrypto from "../../screens/ReceiveFunds/01-SelectCrypto"; import ReceiveAddAccountSelectDevice from "../../screens/ReceiveFunds/02-AddAccountSelectDevice"; @@ -13,9 +15,11 @@ import ReceiveSelectAccount from "../../screens/ReceiveFunds/02-SelectAccount"; import ReceiveAddAccount from "../../screens/ReceiveFunds/02-AddAccount"; import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; +import StepHeader from "../StepHeader"; export default function NewReceiveFundsNavigator() { const { colors } = useTheme(); + const { t } = useTranslation(); const stackNavigationConfig = useMemo( () => getStackNavigatorConfig(colors, true), [colors], @@ -51,7 +55,15 @@ export default function NewReceiveFundsNavigator() { name={ScreenName.ReceiveAddAccountSelectDevice} component={ReceiveAddAccountSelectDevice} options={{ - headerTitle: "", + headerTitle: () => ( + + ), }} /> @@ -68,8 +80,26 @@ export default function NewReceiveFundsNavigator() { ( + + ), + }} + /> + {/* Select / Connect Device */} + {/* Add account(s) automatically */} diff --git a/apps/ledger-live-mobile/src/config/urls.tsx b/apps/ledger-live-mobile/src/config/urls.tsx index 0514bc449b26..83a04a957d63 100644 --- a/apps/ledger-live-mobile/src/config/urls.tsx +++ b/apps/ledger-live-mobile/src/config/urls.tsx @@ -133,6 +133,8 @@ export const urls = { "https://support.ledgerwallet.com/hc/en-us?utm_source=ledger_live_mobile&utm_medium=self_referral", maxSpendable: "https://support.ledger.com/hc/en-us/articles/360012960679?utm_source=ledger_live_mobile&utm_medium=self_referral", + receiveVerifyAddress: + "https://support.ledger.com/hc/en-us/categories/4404369571601-Support?support=true&utm_source=ledger_live_mobile&utm_medium=self_referral", elrond: { website: "https://elrond.com", }, diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 566b0273ebb9..8e40907748a8 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -104,6 +104,7 @@ export const ScreenName = { ReceiveConfirmation: "ReceiveConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", + ReceiveVerifyAddress: "ReceiveVerifyAddress", ReceiveSelectCrypto: "ReceiveSelectCrypto", ReceiveSelectAccount: "ReceiveSelectAccount", ReceiveAddAccountSelectDevice: "ReceiveAddAccountSelectDevice", diff --git a/apps/ledger-live-mobile/src/images/illustration/Dark/_080.png b/apps/ledger-live-mobile/src/images/illustration/Dark/_080.png new file mode 100644 index 0000000000000000000000000000000000000000..f5eb4c02d37ce7bb91ecadfbec2cbc3bdcc0e78d GIT binary patch literal 11610 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 literal 0 HcmV?d00001 diff --git a/apps/ledger-live-mobile/src/images/illustration/Light/_080.png b/apps/ledger-live-mobile/src/images/illustration/Light/_080.png new file mode 100644 index 0000000000000000000000000000000000000000..771796096f6d2715e62a66b5bc8880f2cfed1d5f GIT binary patch literal 17945 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%0AMJ~6vPL+_0(V(Oh&uY278S9 zgA&*RPHKvoBwW(gA~Jxvxof7eNh=KHplvl>YAg@@MGyg+hXUZfgr^>H=_E+wHRKFx z3u&}`xZ*8$?!Y`z-n&UK&?b)g8xuU2V2_M7HYpDI6hx{Jm85_~kC znP zzf5uk6hX%E<@@-7Z%iZVuVBeFJ>axnCl)JiS&|9LwW((+``}#%*k1Z*5^)1JNh+Br zS%dqEJ3Zt)beNl{zu?=BwDZhZHdUGV@OioUc&z$@g9p(!63t@A!3kFZ@pOR+Jn{eJ j12CQa|MHnNkjkml1X?_Y74X2Dbdav5kw&GOcontact us as soon as possible." + } + }, "receiveConfirmation": { "title": "Receive {{currencyTicker}}", "addressVerified": "Address verified", @@ -2197,7 +2210,8 @@ }, "toastMessages": { "accountImported": "We've imported a {{currencyTicker}} account for you. ", - "why": "Tell me why." + "why": "Tell me why.", + "addressVerified": "Your address is now verified" }, "additionalInfoModal": { "title": "Why we imported an account?", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index 8e16085cd674..0b332d3d2aff 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -81,7 +81,9 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { }); } else if (currency.type === "TokenCurrency") { const parentAccounts = findAccountByCurrency(accounts, currency.parentCurrency); + if (parentAccounts.length > 1) { + navigation.navigate(ScreenName.ReceiveSelectAccount, { currency, createTokenAccount: true diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index deead71204ae..a946776f44d0 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -77,10 +77,10 @@ function AddAccountsAccounts({ }: Props) { const { colors } = useTheme(); const dispatch = useDispatch(); + const {t} = useTranslation(); const [scanning, setScanning] = useState(true); const [error, setError] = useState(null); - const [latestScannedAccount, setLatestScannedAccount] = useState(null); const [scannedAccounts, setScannedAccounts] = useState([]); const [cancelled, setCancelled] = useState(false); @@ -172,6 +172,13 @@ function AddAccountsAccounts({ [selectAccount], ); + const renderHeader = useCallback(() => + + {t("transfer.receive.selectAccount.title")} + {t("transfer.receive.selectAccount.subtitle", {currencyTicker: currency.ticker})} + + , [currency.ticker, t]) + const keyExtractor = useCallback(item => item?.id, []); return ( @@ -186,6 +193,7 @@ function AddAccountsAccounts({ @@ -210,16 +218,21 @@ function AddAccountsAccounts({ function ScanLoading({ currency, scannedAccounts, stopSubscription }: {currency: Currency, scannedAccounts: Account[], stopSubscription: () => void}) { const { t } = useTranslation(); return ( - - - {t("transfer.receive.addAccount.title")} - {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} + <> + + + {t("transfer.receive.addAccount.title")} + {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} + + { scannedAccounts?.length > 0 ? <> - {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} + {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} - : null } - + : null + } + + ); } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 002dd87ef905..68ef547e87e8 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -1,25 +1,17 @@ -import React, { useCallback, useEffect } from "react"; +import React, { useCallback, useMemo } from "react"; import { FlatList } from "react-native"; -import SafeAreaView from "react-native-safe-area-view"; import { useSelector } from "react-redux"; import { Flex } from "@ledgerhq/native-ui"; -import styled from "styled-components/native"; import { useTranslation } from "react-i18next"; -import { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; +import type { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/lib/account"; import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; import { TrackScreen } from "../../analytics"; import AccountCard from "../../components/AccountCard"; import LText from "../../components/LText"; -const forceInset = { bottom: "always" }; - -const StyledSaferAreaView = styled(SafeAreaView)` - flex: 1; - background-color: ${p => p.theme.colors.background.main}; -`; - type Props = { navigation: any; route: { params?: { currency?: Currency } }; @@ -32,32 +24,56 @@ function ReceiveSelectAccount({ navigation, route }: Props) { const accounts = useSelector( flattenAccountsByCryptoCurrencyScreenSelector(currency), ); + const parentAccounts = useSelector( + flattenAccountsByCryptoCurrencyScreenSelector(currency?.parentCurrency), + ); + + const aggregatedAccounts = useMemo( + () => + currency.type === "TokenCurrency" + ? parentAccounts.reduce((accs, pa) => { + const tokenAccounts = pa.subAccounts.filter( + acc => acc.token.id === currency.id, + ); + + if (tokenAccounts.length > 0) { + accs.push(...tokenAccounts); + } else { + const tokenAcc = makeEmptyTokenAccount(pa, currency); + tokenAcc.parentAccount = pa; + tokenAcc.triggerCreateAccount = true; + accs.push(tokenAcc); + } + + return accs; + }, []) + : accounts, + [accounts, currency, parentAccounts], + ); const selectAccount = useCallback( (account: AccountLike) => { navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, - accountId: account.id, + accountId: account?.parentId || account.id, + createTokenAccount: account?.triggerCreateAccount, }); }, [navigation, route.params], ); - useEffect(() => { - if (accounts.length === 1) { - selectAccount(accounts[0]); - } else if (accounts.length <= 0) { - navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { - ...route.params, - currency, - }); - } - }, [accounts, currency, navigation, route.params, selectAccount]); - const renderItem = useCallback( ({ item: account }: { item: SearchResult }) => ( - selectAccount(account)} /> + {account.parentAccount.name} + ) : null + } + onPress={() => selectAccount(account)} + /> ), [selectAccount], @@ -65,24 +81,26 @@ function ReceiveSelectAccount({ navigation, route }: Props) { const keyExtractor = useCallback(item => item?.id, []); - return accounts.length > 1 ? ( - + return aggregatedAccounts.length > 1 ? ( + <> - - {t("transfer.receive.selectAccount.title")} - - - {t("transfer.receive.selectAccount.subtitle", { - currencyTicker: currency?.ticker, - })} - + + + {t("transfer.receive.selectAccount.title")} + + + {t("transfer.receive.selectAccount.subtitle", { + currencyTicker: currency.ticker, + })} + + - + ) : null; } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 866290b4525f..5d26e096d97d 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -1,8 +1,6 @@ // @flow import React, { useCallback, useEffect, useRef, useState } from "react"; -import { of } from "rxjs"; -import { delay } from "rxjs/operators"; import { TouchableOpacity, TouchableWithoutFeedback, Share } from "react-native"; import { useDispatch, useSelector } from "react-redux"; import QRCode from "react-native-qrcode-svg"; @@ -17,22 +15,13 @@ import { getAccountCurrency, getAccountName, } from "@ledgerhq/live-common/lib/account"; -import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; -import type { DeviceModelId } from "@ledgerhq/devices"; -import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import { useTheme } from "styled-components/native"; -import { Flex, Text, Icons, Button } from "@ledgerhq/native-ui"; +import { Flex, Text, Icons, Button, Notification } from "@ledgerhq/native-ui"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; -import PreventNativeBack from "../../components/PreventNativeBack"; -import BottomModal from "../../components/BottomModal"; import CurrencyIcon from "../../components/CurrencyIcon"; import CopyLink from "../../components/CopyLink"; import NavigationScrollView from "../../components/NavigationScrollView"; -import SkipLock from "../../components/behaviour/SkipLock"; -import logger from "../../logger"; -import { rejectionOp } from "../../logic/debugReject"; -import GenericErrorView from "../../components/GenericErrorView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; @@ -65,20 +54,21 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { const { colors } = useTheme(); const { account, parentAccount } = useSelector(accountScreenSelector(route)); const { t } = useTranslation(); - const [verified, setVerified] = useState(false); + const verified = route.params?.verified; const [isModalOpened, setIsModalOpened] = useState(false); const [hasAddedTokenAccount, setHasAddedTokenAccount] = useState(); const [isToastDisplayed, setIsToastDisplayed] = useState(false); + const [isVerifiedToastDisplayed, setIsVerifiedToastDisplayed] = useState(verified); const onModalHide = useRef(() => {}); - const [error, setError] = useState(null); - const [allowNavigation, setAllowNavigation] = useState(true); const [isAddionalInfoModalOpen, setIsAddionalInfoModalOpen] = useState(false); - const sub = useRef(); const dispatch = useDispatch(); const hideToast = useCallback(() => { setIsToastDisplayed(false); }, []); + const hideVerifiedToast = useCallback(() => { + setIsVerifiedToastDisplayed(false); + }, []); const openAdditionalInfoModal = useCallback(() => { setIsAddionalInfoModalOpen(true); @@ -89,39 +79,6 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { setIsAddionalInfoModalOpen(false); }, [setIsAddionalInfoModalOpen]); - const { onSuccess, onError } = route.params; - - const verifyOnDevice = useCallback( - async (device: Device): Promise => { - if (!account) return; - const mainAccount = getMainAccount(account, parentAccount); - - sub.current = (mainAccount.id.startsWith("mock") - ? of({}).pipe(delay(1000), rejectionOp()) - : getAccountBridge(mainAccount).receive(mainAccount, { - deviceId: device.deviceId, - verify: true, - }) - ).subscribe({ - complete: () => { - setVerified(true); - setAllowNavigation(true); - onSuccess && onSuccess(mainAccount.freshAddress); - }, - error: error => { - if (error && error.name !== "UserRefusedAddress") { - logger.critical(error); - } - setError(error); - setIsModalOpened(true); - setAllowNavigation(true); - onError && onError(); - }, - }); - }, - [account, onError, onSuccess, parentAccount], - ); - const onRetry = useCallback(() => { if (isModalOpened) { setIsModalOpened(false); @@ -131,26 +88,11 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { } }, [isModalOpened, navigation, route.params]) - const onDone = useCallback(() => { - const n = navigation.getParent(); - if (n) { - n.pop(); - } - }, [navigation]) - - const onModalClose = useCallback(() => { - setIsModalOpened(false); - onModalHide.current = onDone; - }, [onDone]) - - - const { width } = getWindowDimensions(); const QRSize = Math.round(width / 1.8 - 16); const mainAccount = account && getMainAccount(account, parentAccount); const currency = route.params?.currency || (account && getAccountCurrency(account)); - useEffect(() => { if(route.params?.createTokenAccount && !hasAddedTokenAccount) { const newMainAccount = mainAccount; @@ -164,28 +106,14 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, [currency, route.params?.createTokenAccount, mainAccount, dispatch, hasAddedTokenAccount]) useEffect(() => { - if (!allowNavigation) { - navigation.setOptions({ - headerLeft: null, - headerTitle: getAccountName(account), - headerRight: () => null, - gestureEnabled: false, - }); - } else { - navigation.setOptions({ - headerTitle: getAccountName(account), - }); - } - }, [allowNavigation, colors, navigation, account]); + navigation.setOptions({ + headerTitle: getAccountName(account), + }); + }, [colors, navigation, account]); useEffect(() => { - const device = route.params.device; - - if (device && !verified) { - verifyOnDevice(device); - } - setAllowNavigation(true); - }, [route.params, verified, verifyOnDevice]); + setIsVerifiedToastDisplayed(verified) + }, [verified]) const onShare = useCallback(() => { if (mainAccount?.freshAddress) { @@ -197,12 +125,6 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { return ( - {allowNavigation ? null : ( - <> - - - - )} @@ -250,11 +172,10 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { - + {isToastDisplayed ? ( - - - - - - - - - {t("transfer.receive.toastMessages.accountImported", { currencyTicker: currency.ticker })} - - {t("transfer.receive.toastMessages.why")} - - - - - - - - - - - - ) : null} - + + ) : isVerifiedToastDisplayed ? : } + + {verified ? null : } + - - {error ? ( - - - - + + + : + {t("transfer.receive.verifyAddress.title")} + {t("transfer.receive.verifyAddress.subtitle")} + + + {mainAccount.freshAddress} + + + + + + } + + ); +} diff --git a/libs/ui/packages/native/src/components/message/Notification/index.tsx b/libs/ui/packages/native/src/components/message/Notification/index.tsx index 6f33338fc001..bd3f207ccdb6 100644 --- a/libs/ui/packages/native/src/components/message/Notification/index.tsx +++ b/libs/ui/packages/native/src/components/message/Notification/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import styled, { useTheme } from "styled-components/native"; -import FlexBox from "../../Layout/Flex"; +import FlexBox, { FlexBoxProps } from "../../Layout/Flex"; import { TextProps, TouchableOpacity, TouchableOpacityProps } from "react-native"; import Text from "../../Text"; import CloseMedium from "@ledgerhq/icons-ui/native/CloseMedium"; @@ -8,10 +8,12 @@ import { Flex } from "../../Layout"; import { space } from "styled-system"; import { ExternalLinkMedium } from "@ledgerhq/icons-ui/native"; +type NotificationVariant = "primary" | "secondary" | "success" | "warning" | "error" | string; + type Props = { Icon?: React.ComponentType<{ size: number; color?: string }>; iconColor?: string; - variant?: "primary" | "secondary"; + variant?: NotificationVariant; title: string; subtitle?: string; numberOfLines?: TextProps["numberOfLines"]; @@ -20,20 +22,50 @@ type Props = { onLinkPress?: TouchableOpacityProps["onPress"]; }; -const NotificationContainer = styled.View>` - display: flex; - width: 100%; - flex-direction: row; - align-items: center; - ${(p) => - p.variant === "primary" && - ` - padding: 16px; - `} - background-color: ${(p) => - p.variant === "primary" ? p.theme.colors.primary.c90 : "transparent"}; - border-radius: ${(p) => `${p.theme.radii[1]}px`}; -`; +const variantProps: Record> = { + primary: { + bg: "primary.c90", + color: "neutral.c00", + padding: 6, + }, + success: { + bg: "success.c100", + color: "neutral.c00", + padding: 6, + }, + warning: { + bg: "warning.c100", + color: "neutral.c00", + padding: 6, + }, + error: { + bg: "error.c100", + color: "neutral.c00", + padding: 6, + }, + neutral: { + bg: "neutral.c30", + color: "neutral.c100", + linkColor: "primary.c80", + padding: 6, + }, + secondary: { + bg: "transparent", + color: "neutral.c100", + padding: 0, + }, +}; + +const NotificationContainer = styled(FlexBox).attrs( + (p: FlexBoxProps & { variant: NotificationVariant }) => ({ + width: "100%", + flexDirection: "row", + alignItems: "center", + bg: variantProps[p.variant]?.bg ?? variantProps.primary.bg, + p: variantProps[p.variant]?.padding, + borderRadius: 1, + }), +)``; const ClosePressableExtendedBounds = styled.TouchableOpacity.attrs({ p: 5, @@ -54,7 +86,8 @@ export default function Notification({ onLinkPress, }: Props): React.ReactElement { const { colors } = useTheme(); - const textColor = variant === "primary" ? colors.neutral.c00 : colors.neutral.c100; + const textColor = variantProps[variant]?.color ?? variantProps.primary.color; + const linkColor = variantProps[variant]?.linkColor || textColor; return ( @@ -86,10 +119,10 @@ export default function Notification({ - + {linkText} - + diff --git a/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx b/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx index cecce528c6e7..af09b52cff89 100644 --- a/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx +++ b/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx @@ -10,7 +10,11 @@ const NotificationSample = () => ( ( Date: Sun, 26 Jun 2022 16:28:24 +0200 Subject: [PATCH 13/83] fix lint --- apps/ledger-live-mobile/src/reducers/settings.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/reducers/settings.js b/apps/ledger-live-mobile/src/reducers/settings.js index 270e77fd6ddc..5506cf51a60f 100755 --- a/apps/ledger-live-mobile/src/reducers/settings.js +++ b/apps/ledger-live-mobile/src/reducers/settings.js @@ -17,7 +17,6 @@ import type { } from "@ledgerhq/live-common/lib/types"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import { getAccountCurrency } from "@ledgerhq/live-common/lib/account/helpers"; -import Config from "react-native-config"; import type { PortfolioRange } from "@ledgerhq/live-common/lib/portfolio/v2/types"; import type { DeviceModelInfo } from "@ledgerhq/live-common/lib/types/manager"; import { MarketListRequestParams } from "@ledgerhq/live-common/lib/market/types"; From 217582822536aa99b19d1a264b3ca6a59c965c9a Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Mon, 27 Jun 2022 10:54:44 +0200 Subject: [PATCH 14/83] LLM - Receive Flow - fixes in navigation and tokens --- .../src/components/TabBar/TransferDrawer.tsx | 5 ++--- .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 2 +- .../src/screens/ReceiveFunds/02-AddAccount.tsx | 9 ++++++--- .../{NotSyncedWarning.js => NotSyncedWarning.tsx} | 0 4 files changed, 9 insertions(+), 7 deletions(-) rename apps/ledger-live-mobile/src/screens/ReceiveFunds/{NotSyncedWarning.js => NotSyncedWarning.tsx} (100%) diff --git a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx index af3ab4ba2b95..346cd1ca52a2 100644 --- a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx +++ b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx @@ -55,8 +55,7 @@ export default function TransferDrawer({ onClose }: ModalProps) { [onNavigate], ); const onReceiveFunds = useCallback( - () => - onNavigate(NavigatorName.ReceiveFunds), + () => onNavigate(NavigatorName.ReceiveFunds), [onNavigate], ); const onSwap = useCallback( @@ -119,7 +118,7 @@ export default function TransferDrawer({ onClose }: ModalProps) { }} title={t("transfer.receive.title")} description={t("transfer.receive.description")} - onPress={accountsCount > 0 ? onReceiveFunds : null} + onPress={onReceiveFunds} Icon={Icons.ArrowBottomMedium} disabled={readOnlyModeEnabled} /> diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index 0b332d3d2aff..c3685bdd6ec6 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -96,7 +96,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { }); } else { navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { - currency: currency.parentCurrency, + currency, createTokenAccount: true }); } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index a946776f44d0..f85f96d78858 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -98,7 +98,10 @@ function AddAccountsAccounts({ }, []); const startSubscription = useCallback(() => { - const bridge = getCurrencyBridge(currency); + const c = currency.type === "TokenCurrency" + ? currency.parentCurrency + : currency; + const bridge = getCurrencyBridge(c); const syncConfig = { paginationConfig: { operation: 0, @@ -108,9 +111,9 @@ function AddAccountsAccounts({ // will be set to false if an existing account is found scanSubscription.current = concat( - from(prepareCurrency(currency)).pipe(ignoreElements()), + from(prepareCurrency(c)).pipe(ignoreElements()), bridge.scanAccounts({ - currency, + currency: c, deviceId, syncConfig, }), diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.js b/apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.tsx similarity index 100% rename from apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.js rename to apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.tsx From 0895dbcde3d22454fc575ed9b78e40e735da5b15 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Mon, 27 Jun 2022 14:00:51 +0200 Subject: [PATCH 15/83] LLM - Receive Flow - add accounts step fix some ts and lint issues --- .../src/components/LText/index.tsx | 11 +- .../screens/ReceiveFunds/02-AddAccount.tsx | 278 +++++++----------- 2 files changed, 122 insertions(+), 167 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/LText/index.tsx b/apps/ledger-live-mobile/src/components/LText/index.tsx index 727d8e0d797a..34b5a2810c37 100644 --- a/apps/ledger-live-mobile/src/components/LText/index.tsx +++ b/apps/ledger-live-mobile/src/components/LText/index.tsx @@ -1,18 +1,22 @@ import React, { useMemo, memo } from "react"; import { Text } from "@ledgerhq/native-ui"; +import { BaseTextProps } from "@ledgerhq/native-ui/components/Text"; import { FontWeightTypes } from "@ledgerhq/native-ui/components/Text/getTextStyle"; import getFontStyle from "./getFontStyle"; export { getFontStyle }; -export type Opts = { +export type Opts = BaseTextProps & { bold?: boolean; semiBold?: boolean; secondary?: boolean; monospace?: boolean; color?: string; bg?: string; + fontSize?: string; children?: React.ReactNode; + variant?: string; + fontFamily?: string; }; export type Res = { @@ -31,7 +35,10 @@ export type Res = { | "900"; }; -const inferFontWeight = ({ semiBold, bold }: Opts): FontWeightTypes => { +const inferFontWeight = ({ + semiBold, + bold, +}: Partial): FontWeightTypes => { if (bold) { return "bold"; } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index f85f96d78858..f1dd57465223 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -1,67 +1,39 @@ -import React, { - PureComponent, - useEffect, - useCallback, - useState, - useRef, - memo, - useMemo, -} from "react"; -import { StyleSheet, SafeAreaView, FlatList } from "react-native"; +import React, { useEffect, useCallback, useState, useRef, memo } from "react"; +import { FlatList } from "react-native"; import { concat, from } from "rxjs"; import { ignoreElements } from "rxjs/operators"; -import { connect, useDispatch } from "react-redux"; -import { compose } from "redux"; +import { useDispatch } from "react-redux"; +import { useTranslation } from "react-i18next"; import { - isAccountEmpty, - groupAddAccounts, -} from "@ledgerhq/live-common/lib/account"; -import type { AddAccountSupportLink } from "@ledgerhq/live-common/lib/account/addAccounts"; -import { createStructuredSelector } from "reselect"; -import uniq from "lodash/uniq"; -import { Trans, useTranslation } from "react-i18next"; -import type { CryptoCurrency, Account, Currency, AccountLike } from "@ledgerhq/live-common/lib/types"; + CryptoCurrency, + Account, + Currency, + AccountLike, + TokenCurrency, +} from "@ledgerhq/live-common/lib/types"; import { getCurrencyBridge } from "@ledgerhq/live-common/lib/bridge"; -import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; +import { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; -import type { DerivationMode } from "@ledgerhq/live-common/lib/derivation"; - -import { useTheme } from "@react-navigation/native"; import { Flex, InfiniteLoader } from "@ledgerhq/native-ui"; import { replaceAccounts } from "../../actions/accounts"; -import { accountsSelector } from "../../reducers/accounts"; import logger from "../../logger"; -import { withTheme } from "../../colors"; import { ScreenName } from "../../const"; import { TrackScreen } from "../../analytics"; import Button from "../../components/Button"; import PreventNativeBack from "../../components/PreventNativeBack"; -import SelectableAccountsList from "../../components/SelectableAccountsList"; -import LiveLogo from "../../icons/LiveLogoIcon"; -import IconPause from "../../icons/Pause"; -import ExternalLink from "../../icons/ExternalLink"; -import Chevron from "../../icons/Chevron"; -import Info from "../../icons/Info"; -import Spinning from "../../components/Spinning"; import LText from "../../components/LText"; import RetryButton from "../../components/RetryButton"; import CancelButton from "../../components/CancelButton"; import GenericErrorBottomModal from "../../components/GenericErrorBottomModal"; -import NavigationScrollView from "../../components/NavigationScrollView"; import { prepareCurrency } from "../../bridge/cache"; -import { blacklistedTokenIdsSelector } from "../../reducers/settings"; -import BottomModal from "../../components/BottomModal"; -import { urls } from "../../config/urls"; import AccountCard from "../../components/AccountCard"; type RouteParams = { - currency: CryptoCurrency, - device: Device, - onSuccess?: (params?: any) => void, + currency: CryptoCurrency | TokenCurrency; + device: Device; + onSuccess?: (params?: any) => void; }; -type OwnProps = {}; - type Props = { navigation: any; route: { params: RouteParams }; @@ -69,27 +41,20 @@ type Props = { colors: any; }; - - -function AddAccountsAccounts({ - navigation, - route, -}: Props) { - const { colors } = useTheme(); +function AddAccountsAccounts({ navigation, route }: Props) { const dispatch = useDispatch(); - const {t} = useTranslation(); + const { t } = useTranslation(); const [scanning, setScanning] = useState(true); const [error, setError] = useState(null); - const [scannedAccounts, setScannedAccounts] = useState([]); + const [scannedAccounts, setScannedAccounts] = useState([]); const [cancelled, setCancelled] = useState(false); - const scanSubscription = useRef(); + const scanSubscription = useRef(); const { currency, device: { deviceId }, - device } = route.params || {}; useEffect(() => { @@ -98,9 +63,8 @@ function AddAccountsAccounts({ }, []); const startSubscription = useCallback(() => { - const c = currency.type === "TokenCurrency" - ? currency.parentCurrency - : currency; + const c = + currency.type === "TokenCurrency" ? currency.parentCurrency : currency; const bridge = getCurrencyBridge(c); const syncConfig = { paginationConfig: { @@ -119,7 +83,7 @@ function AddAccountsAccounts({ }), ).subscribe({ next: ({ account }) => { - setScannedAccounts((accs) => [...accs, account]) + setScannedAccounts((accs: Account[]) => [...accs, account]); }, complete: () => setScanning(false), error: error => { @@ -137,7 +101,7 @@ function AddAccountsAccounts({ startSubscription(); }, []); - const stopSubscription = useCallback((syncUI?: boolean = true) => { + const stopSubscription = useCallback((syncUI: boolean = true) => { if (scanSubscription.current) { scanSubscription.current.unsubscribe(); scanSubscription.current = null; @@ -160,8 +124,17 @@ function AddAccountsAccounts({ const selectAccount = useCallback( (account: Account) => { - dispatch(replaceAccounts({ scannedAccounts, selectedIds: [account.id], renamings: {}})); - navigation.navigate(ScreenName.ReceiveConfirmation, {...route.params, accountId: account.id }); + dispatch( + replaceAccounts({ + scannedAccounts, + selectedIds: [account.id], + renamings: {}, + }), + ); + navigation.navigate(ScreenName.ReceiveConfirmation, { + ...route.params, + accountId: account.id, + }); }, [dispatch, navigation, route.params, scannedAccounts], ); @@ -175,131 +148,106 @@ function AddAccountsAccounts({ [selectAccount], ); - const renderHeader = useCallback(() => - - {t("transfer.receive.selectAccount.title")} - {t("transfer.receive.selectAccount.subtitle", {currencyTicker: currency.ticker})} - - , [currency.ticker, t]) + const renderHeader = useCallback( + () => ( + + + {t("transfer.receive.selectAccount.title")} + + + {t("transfer.receive.selectAccount.subtitle", { + currencyTicker: currency.ticker, + })} + + + ), + [currency.ticker, t], + ); const keyExtractor = useCallback(item => item?.id, []); return ( - + <> - {scanning ? : ( - - )} + {scanning ? ( + + ) : ( + + )} - - + + } /> - + ); } -function ScanLoading({ currency, scannedAccounts, stopSubscription }: {currency: Currency, scannedAccounts: Account[], stopSubscription: () => void}) { +function ScanLoading({ + currency, + scannedAccounts, + stopSubscription, +}: { + currency: Currency; + scannedAccounts: Account[]; + stopSubscription: () => void; +}) { const { t } = useTranslation(); - return ( - <> - - - {t("transfer.receive.addAccount.title")} - {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} - - - { - scannedAccounts?.length > 0 ? <> - {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} - - : null - } - - - ); - } - -const styles = StyleSheet.create({ - root: { - flex: 1, - }, - paddingHorizontal: { - paddingHorizontal: 16, - }, - inner: { - paddingTop: 24, - }, - innerContent: { - paddingBottom: 24, - }, - descText: { - paddingHorizontal: 16, - marginBottom: 16, - textAlign: "center", - }, - scanLoadingRoot: { - flexDirection: "row", - marginHorizontal: 16, - marginBottom: 16, - alignItems: "center", - justifyContent: "center", - height: 40, - borderWidth: 1, - borderStyle: "dashed", - borderRadius: 4, - }, - scanLoadingText: { - fontSize: 14, - marginLeft: 8, - }, - footer: { - borderTopWidth: 1, - padding: 16, - }, - addAccountsError: { - marginHorizontal: 16, - marginBottom: 16, - }, - button: { - flex: 1, - marginHorizontal: 8, - }, - buttonRight: { - marginLeft: 8, - }, - smallMarginBottom: { marginBottom: 8 }, - moreAddressTypesContainer: { paddingHorizontal: 16, marginBottom: 32 }, - subtitle: { fontSize: 14 }, - title: { fontSize: 16 }, - modalTitle: { fontSize: 20 }, - modal: { paddingHorizontal: 24 }, - modalContainer: { - marginTop: 24, - marginBottom: 16, - alignItems: "center", - justifyContent: "center", - }, - modalRow: { marginVertical: 16 }, -}); + return ( + <> + + + + {t("transfer.receive.addAccount.title")} + + + {t("transfer.receive.addAccount.subtitle", { + currencyTicker: currency?.ticker, + })} + + + + {scannedAccounts?.length > 0 ? ( + <> + + {t("transfer.receive.addAccount.foundAccounts", { + count: scannedAccounts?.length, + })} + + + + ) : null} + + + ); +} -export default AddAccountsAccounts; +export default memo(AddAccountsAccounts); From 5d7508920485121eff5532893edbfe3504a0ffc6 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Fri, 1 Jul 2022 09:57:31 +0200 Subject: [PATCH 16/83] replace receive flow navigator --- .../RootNavigator/BaseNavigator.tsx | 3 +- .../NewReceiveFundsNavigator.tsx | 119 ------------------ .../RootNavigator/ReceiveFundsNavigator.tsx | 94 +++++++++----- 3 files changed, 64 insertions(+), 152 deletions(-) delete mode 100644 apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx index aca54a36659c..d4277e1ef0d7 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx @@ -26,7 +26,6 @@ import { ErrorHeaderInfo } from "./BaseOnboardingNavigator"; import SettingsNavigator from "./SettingsNavigator"; import BuyDeviceNavigator from "./BuyDeviceNavigator"; import ReceiveFundsNavigator from "./ReceiveFundsNavigator"; -import NewReceiveFundsNavigator from "./NewReceiveFundsNavigator"; import SendFundsNavigator from "./SendFundsNavigator"; import SignMessageNavigator from "./SignMessageNavigator"; import SignTransactionNavigator from "./SignTransactionNavigator"; @@ -151,7 +150,7 @@ export default function BaseNavigator() { /> getStackNavigatorConfig(colors, true), - [colors], - ); - return ( - - {/* Select Crypto (see : apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.js) */} - - - {/* Select Account */} - - - {/* Select Account */} - ( - - ), - }} - /> - - {/* Select Account */} - - - {/* Select / Connect Device */} - ( - - ), - }} - /> - {/* Select / Connect Device */} - - {/* Add account(s) automatically */} - {/* Receive Address */} - - {/* Receive Address Device Verification */} - - ); -} - -const Stack = createStackNavigator(); diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 63ab0a32433c..b22211709a4c 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -2,27 +2,28 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; -import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; +import { useTranslation } from "react-i18next"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; -import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; -import ReceiveSelectAccount from "../../screens/SelectAccount"; +import ReceiveConnectDevice from "../../screens/ReceiveFunds/03a-ConnectDevice"; +import ReceiveVerifyAddress from "../../screens/ReceiveFunds/03b-VerifyAddress"; +import ReceiveSelectCrypto from "../../screens/ReceiveFunds/01-SelectCrypto"; + +import ReceiveAddAccountSelectDevice from "../../screens/ReceiveFunds/02-AddAccountSelectDevice"; +import ReceiveSelectAccount from "../../screens/ReceiveFunds/02-SelectAccount"; +import ReceiveAddAccount from "../../screens/ReceiveFunds/02-AddAccount"; + import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; import StepHeader from "../StepHeader"; -import { useNoNanoBuyNanoWallScreenOptions } from "../../context/NoNanoBuyNanoWall"; - -const totalSteps = "3"; export default function ReceiveFundsNavigator() { - const { t } = useTranslation(); const { colors } = useTheme(); + const { t } = useTranslation(); const stackNavigationConfig = useMemo( () => getStackNavigatorConfig(colors, true), [colors], ); - const noNanoBuyNanoWallScreenOptions = useNoNanoBuyNanoWallScreenOptions(); - return ( + {/* Select Crypto (see : apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.js) */} + + + {/* Select Account */} + + {/* Select Account */} + ( ), }} - initialParams={{ - next: ScreenName.ReceiveConnectDevice, - category: "ReceiveFunds", + /> + + {/* Select Account */} + + + {/* Select / Connect Device */} ({ + options={{ headerTitle: () => ( ), - })} + }} /> + {/* Select / Connect Device */} + + {/* Add account(s) automatically */} + {/* Receive Address */} ( - - ), + headerTitle: "", }} /> + {/* Receive Address Device Verification */} ); } From f4a4ff48917f92e7b223d5b5c8acd50ad0899134 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Fri, 1 Jul 2022 10:54:13 +0200 Subject: [PATCH 17/83] LIVE-2795-Hide "continue without my device" --- .../src/screens/ReceiveFunds/03a-ConnectDevice.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx index ab2b981f8629..58025f9e777c 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx @@ -128,8 +128,6 @@ export default function ConnectDevice({ navigation, route }: Props) { Date: Thu, 16 Jun 2022 11:59:48 +0200 Subject: [PATCH 18/83] feat/LIVE-2453-receive-flow-navigation-setup new navigator added for the improved receive flow --- .../src/components/FabActions.tsx | 2 +- .../RootNavigator/BaseNavigator.tsx | 3 +- .../NewReceiveFundsNavigator.tsx | 56 +++++++++++++++++++ .../src/const/navigation.js | 1 + .../src/screens/SelectAccount.tsx | 5 +- .../src/screens/SelectCrypto.tsx | 25 +++++++++ 6 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx create mode 100644 apps/ledger-live-mobile/src/screens/SelectCrypto.tsx diff --git a/apps/ledger-live-mobile/src/components/FabActions.tsx b/apps/ledger-live-mobile/src/components/FabActions.tsx index 41a0f787fe07..6952ad4d4b2e 100644 --- a/apps/ledger-live-mobile/src/components/FabActions.tsx +++ b/apps/ledger-live-mobile/src/components/FabActions.tsx @@ -375,7 +375,7 @@ const FabActions: React.FC = ({ navigationParams: [ NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveSelectAccount, + screen: ScreenName.ReceiveSelectCrypto, }, ], }; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx index d4277e1ef0d7..aca54a36659c 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx @@ -26,6 +26,7 @@ import { ErrorHeaderInfo } from "./BaseOnboardingNavigator"; import SettingsNavigator from "./SettingsNavigator"; import BuyDeviceNavigator from "./BuyDeviceNavigator"; import ReceiveFundsNavigator from "./ReceiveFundsNavigator"; +import NewReceiveFundsNavigator from "./NewReceiveFundsNavigator"; import SendFundsNavigator from "./SendFundsNavigator"; import SignMessageNavigator from "./SignMessageNavigator"; import SignTransactionNavigator from "./SignTransactionNavigator"; @@ -150,7 +151,7 @@ export default function BaseNavigator() { /> getStackNavigatorConfig(colors, true), + [colors], + ); + return ( + + {/* Select Crypto (see : apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.js) */} + + {/* Select Account */} + + {/* Select / Connect Device */} + + {/* Add account(s) automatically */} + {/* Receive Address */} + + {/* Receive Address Device Verification */} + + ); +} + +const Stack = createStackNavigator(); diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 3ef23b4f87c3..9d9090ead33d 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -103,6 +103,7 @@ export const ScreenName = { RateProviderSettings: "RateProviderSettings", ReceiveConfirmation: "ReceiveConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", + ReceiveSelectCrypto: "ReceiveSelectCrypto", ReceiveSelectAccount: "ReceiveSelectAccount", RegionSettings: "RegionSettings", RepairDevice: "RepairDevice", diff --git a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx index 450336400b59..f1e5dc055114 100644 --- a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx @@ -10,6 +10,7 @@ import { isAccountEmpty, getAccountSpendableBalance, } from "@ledgerhq/live-common/lib/account"; +import { ScreenName } from "../const"; import { NotEnoughBalance } from "@ledgerhq/errors"; import { accountsSelector } from "../reducers/accounts"; import { TrackScreen } from "../analytics"; @@ -80,14 +81,14 @@ export default function ReceiveFunds({ navigation, route }: Props) { if (!isNaN(minBalance) && balance.lte(minBalance)) { setError(new NotEnoughBalance()); } else { - navigation.navigate(next, { + navigation.navigate(ScreenName.ReceiveConnectDevice, { account, accountId: account.id, parentId: account.type !== "Account" ? account.parentId : undefined, }); } }, - [minBalance, navigation, next], + [minBalance, navigation], ); return ( diff --git a/apps/ledger-live-mobile/src/screens/SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/SelectCrypto.tsx new file mode 100644 index 000000000000..4926dbae3946 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/SelectCrypto.tsx @@ -0,0 +1,25 @@ +import React, { useCallback } from "react"; +import { Flex, Text, Button } from "@ledgerhq/native-ui"; +import { ScreenName } from "../const"; + +type Props = { + navigation: any; + route: { + params?: {}; + }; +}; + +export default function SelectCrypto({ navigation, route }: Props) { + const goToNext = useCallback(() => { + navigation.navigate(ScreenName.ReceiveSelectAccount, { + ...route.params, + }); + }, [navigation, route]); + + return ( + + Select Crypto + + + ); +} From 1d209dafca0141b659356ac19f74f782d957e96d Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Thu, 16 Jun 2022 16:28:20 +0200 Subject: [PATCH 19/83] feat/LIVE-2449-receive-flow-select-account-screen new select account done --- .../src/components/AccountCard.tsx | 17 ++- .../NewReceiveFundsNavigator.tsx | 19 ++- .../src/screens/SelectAccount.tsx | 116 ++++++++---------- 3 files changed, 83 insertions(+), 69 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/AccountCard.tsx b/apps/ledger-live-mobile/src/components/AccountCard.tsx index 1e78765efa61..b6b6462f44bd 100644 --- a/apps/ledger-live-mobile/src/components/AccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/AccountCard.tsx @@ -9,7 +9,7 @@ import { } from "@ledgerhq/live-common/lib/account/helpers"; import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex, Tag, Text } from "@ledgerhq/native-ui"; +import { Flex, Text } from "@ledgerhq/native-ui"; import { useTheme } from "styled-components/native"; import { TouchableOpacity } from "react-native-gesture-handler"; @@ -17,6 +17,14 @@ import Card, { Props as CardProps } from "./Card"; import CurrencyIcon from "./CurrencyIcon"; import CurrencyUnitValue from "./CurrencyUnitValue"; +const Tag = ({ children, ...props }: { children: string }) => ( + + + {children} + + +); + export type Props = CardProps & { account: Account; style?: any; @@ -54,7 +62,8 @@ const AccountCard = ({ > @@ -67,7 +76,7 @@ const AccountCard = ({ > {tag}} - + {/* Select Account */} {/* Select / Connect Device */} {/* Add account(s) automatically */} {/* Receive Address */} {/* Receive Address Device Verification */} diff --git a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx index f1e5dc055114..45b3bbb348f2 100644 --- a/apps/ledger-live-mobile/src/screens/SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/SelectAccount.tsx @@ -1,52 +1,35 @@ -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useMemo } from "react"; import { useSelector } from "react-redux"; +import { useTranslation } from "react-i18next"; +import { FlatList } from "react-native"; import { accountWithMandatoryTokens, flattenAccounts, } from "@ledgerhq/live-common/lib/account/helpers"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex } from "@ledgerhq/native-ui"; -import { - isAccountEmpty, - getAccountSpendableBalance, -} from "@ledgerhq/live-common/lib/account"; +import { Flex, Text } from "@ledgerhq/native-ui"; import { ScreenName } from "../const"; -import { NotEnoughBalance } from "@ledgerhq/errors"; import { accountsSelector } from "../reducers/accounts"; -import { TrackScreen } from "../analytics"; -import AccountSelector from "../components/AccountSelector"; -import GenericErrorBottomModal from "../components/GenericErrorBottomModal"; +import AccountCard from "../components/AccountCard"; +import type { Account, AccountLike } from "@ledgerhq/live-common/lib/types/account"; type Props = { navigation: any; route: { - params?: { - currency?: string; - selectedCurrency?: CryptoCurrency | TokenCurrency; - next: string; - category: string; - notEmptyAccounts?: boolean; - minBalance?: number; + params: { + selectedCurrency: CryptoCurrency | TokenCurrency; }; }; }; -export default function ReceiveFunds({ navigation, route }: Props) { - const { - selectedCurrency, - currency: initialCurrencySelected, - next, - category, - notEmptyAccounts, - minBalance, - } = route.params || {}; - - const [error, setError] = useState(); +export default function SelectAccount({ navigation, route }: Props) { + const { selectedCurrency } = route.params; - const accounts = useSelector(accountsSelector); - const enhancedAccounts = useMemo(() => { + const { t } = useTranslation(); + const allAccounts = useSelector(accountsSelector); + const currencyAccounts = useMemo(() => { if (selectedCurrency) { - const filteredAccounts = accounts.filter( + const filteredAccounts = allAccounts.filter( acc => acc.currency.id === (selectedCurrency.type === "TokenCurrency" @@ -68,45 +51,50 @@ export default function ReceiveFunds({ navigation, route }: Props) { } return flattenAccounts(filteredAccounts); } - return flattenAccounts(accounts); - }, [accounts, selectedCurrency]); - const allAccounts = notEmptyAccounts - ? enhancedAccounts.filter(account => !isAccountEmpty(account)) - : enhancedAccounts; + return flattenAccounts(allAccounts); + }, [allAccounts, selectedCurrency]); - const handleSelectAccount = useCallback( + const keyExtractor = (item: Account) => item.id; + + const onSelectAccount = useCallback( account => { - const balance = getAccountSpendableBalance(account); - - if (!isNaN(minBalance) && balance.lte(minBalance)) { - setError(new NotEnoughBalance()); - } else { - navigation.navigate(ScreenName.ReceiveConnectDevice, { - account, - accountId: account.id, - parentId: account.type !== "Account" ? account.parentId : undefined, - }); - } + navigation.navigate(ScreenName.ReceiveConnectDevice, { + account, + accountId: account.id, + parentId: account.type !== "Account" ? account.parentId : undefined, + }); }, - [minBalance, navigation], + [navigation], + ); + + const renderItem = ({ item }: { item: AccountLike }) => ( + onSelectAccount(item)} + /> ); return ( - - - - - - {error ? ( - setError(undefined)} - /> - ) : null} + + + {t("")}Select account + + + {t("")}Your {selectedCurrency.ticker} will be deposited into this account. + + ); } From d59fcdb1ddb447fabbf3c1bf515412da4ba41e8d Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Mon, 20 Jun 2022 10:15:29 +0200 Subject: [PATCH 20/83] feat/LIVE-2449-receive-flow-select-account-screen qr code style modified on receive screen --- .../NewReceiveFundsNavigator.tsx | 2 +- .../screens/ReceiveFunds/03-Confirmation.js | 53 +++++++++++++------ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index 1fc4724da841..eeea4be3a12e 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -45,7 +45,7 @@ export default function NewReceiveFundsNavigator() { headerTitle: "", }} initialParams={{ - selectedCurrency: findCryptoCurrencyById("bitcoin"), + selectedCurrency: findCryptoCurrencyById("dogecoin"), }} /> {/* Select / Connect Device */} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js index 0d79da821f17..8c40959a86b8 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js @@ -188,22 +188,45 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { {width < 350 ? ( - - + + + + ) : ( - - + + + + + + + )} @@ -359,7 +382,7 @@ const styles = StyleSheet.create({ borderWidth: 1, padding: 16, - borderRadius: 4, + borderRadius: 24, shadowOpacity: 0.03, shadowRadius: 8, shadowOffset: { From 4bbf12dccabd2d0c90e3826266b2217c85f593ad Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 10:46:05 +0200 Subject: [PATCH 21/83] bugfix/LIVE-2690-reborn-tabbar-ledger-button-fixed screen and component added specifically for the new receive flow --- .../src/components/ReceiveAccountCard.tsx | 109 ++++ .../NewReceiveFundsNavigator.tsx | 2 +- .../src/screens/ReceiveSelectAccount.tsx | 100 +++ pnpm-lock.yaml | 581 +++++++++++++++++- 4 files changed, 758 insertions(+), 34 deletions(-) create mode 100644 apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx diff --git a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx new file mode 100644 index 000000000000..bd246efeea20 --- /dev/null +++ b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx @@ -0,0 +1,109 @@ +import React from "react"; +import { + getAccountName, + getAccountSpendableBalance, +} from "@ledgerhq/live-common/lib/account"; +import { + getAccountCurrency, + getAccountUnit, +} from "@ledgerhq/live-common/lib/account/helpers"; +import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; +import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; +import { Flex, Text } from "@ledgerhq/native-ui"; +import { useTheme } from "styled-components/native"; +import { TouchableOpacity } from "react-native-gesture-handler"; + +import Card, { Props as CardProps } from "./Card"; +import CurrencyIcon from "./CurrencyIcon"; +import CurrencyUnitValue from "./CurrencyUnitValue"; + +const Tag = ({ children, ...props }: { children: string }) => ( + + + {children} + + +); + +export type Props = CardProps & { + account: Account; + style?: any; + disabled?: boolean; + useFullBalance?: boolean; + AccountSubTitle?: React.ReactNode; +}; + +const AccountCard = ({ + onPress, + account, + style, + disabled, + useFullBalance, + AccountSubTitle, + ...props +}: Props) => { + const { colors } = useTheme(); + const currency = getAccountCurrency(account); + const unit = getAccountUnit(account); + const tag = + account.derivationMode !== undefined && + account.derivationMode !== null && + getTagDerivationMode(currency as CryptoCurrency, account.derivationMode); + + return ( + + + + + + + {getAccountName(account)} + + {AccountSubTitle} + + {tag && {tag}} + + + + + + + + + ); +}; + +export default AccountCard; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index eeea4be3a12e..ad26eaed36d9 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -8,7 +8,7 @@ import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; import ReceiveSelectCrypto from "../../screens/SelectCrypto"; -import ReceiveSelectAccount from "../../screens/SelectAccount"; +import ReceiveSelectAccount from "../../screens/ReceiveSelectAccount"; import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; import StepHeader from "../StepHeader"; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx new file mode 100644 index 000000000000..45b3bbb348f2 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx @@ -0,0 +1,100 @@ +import React, { useCallback, useMemo } from "react"; +import { useSelector } from "react-redux"; +import { useTranslation } from "react-i18next"; +import { FlatList } from "react-native"; +import { + accountWithMandatoryTokens, + flattenAccounts, +} from "@ledgerhq/live-common/lib/account/helpers"; +import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; +import { Flex, Text } from "@ledgerhq/native-ui"; +import { ScreenName } from "../const"; +import { accountsSelector } from "../reducers/accounts"; +import AccountCard from "../components/AccountCard"; +import type { Account, AccountLike } from "@ledgerhq/live-common/lib/types/account"; + +type Props = { + navigation: any; + route: { + params: { + selectedCurrency: CryptoCurrency | TokenCurrency; + }; + }; +}; + +export default function SelectAccount({ navigation, route }: Props) { + const { selectedCurrency } = route.params; + + const { t } = useTranslation(); + const allAccounts = useSelector(accountsSelector); + const currencyAccounts = useMemo(() => { + if (selectedCurrency) { + const filteredAccounts = allAccounts.filter( + acc => + acc.currency.id === + (selectedCurrency.type === "TokenCurrency" + ? selectedCurrency.parentCurrency.id + : selectedCurrency.id), + ); + if (selectedCurrency.type === "TokenCurrency") { + // add in the token subAccount if it does not exist + return flattenAccounts( + filteredAccounts.map(acc => + accountWithMandatoryTokens(acc, [selectedCurrency]), + ), + ).filter( + acc => + acc.type === "Account" || + (acc.type === "TokenAccount" && + acc.token.id === selectedCurrency.id), + ); + } + return flattenAccounts(filteredAccounts); + } + return flattenAccounts(allAccounts); + }, [allAccounts, selectedCurrency]); + + const keyExtractor = (item: Account) => item.id; + + const onSelectAccount = useCallback( + account => { + navigation.navigate(ScreenName.ReceiveConnectDevice, { + account, + accountId: account.id, + parentId: account.type !== "Account" ? account.parentId : undefined, + }); + }, + [navigation], + ); + + const renderItem = ({ item }: { item: AccountLike }) => ( + onSelectAccount(item)} + /> + ); + + return ( + + + {t("")}Select account + + + {t("")}Your {selectedCurrency.ticker} will be deposited into this account. + + + + ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6151550d784..389118c67ce9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3052,6 +3052,7 @@ packages: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.17.9 + dev: true /@babel/code-frame/7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} @@ -3062,7 +3063,8 @@ packages: /@babel/code-frame/7.8.3: resolution: {integrity: sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==} dependencies: - '@babel/highlight': 7.17.12 + '@babel/highlight': 7.17.9 + dev: false /@babel/compat-data/7.17.10: resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} @@ -3259,6 +3261,7 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.20.3 semver: 6.3.0 + dev: false /@babel/helper-compilation-targets/7.18.2_@babel+core@7.17.10: resolution: {integrity: sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==} @@ -3363,6 +3366,7 @@ packages: '@babel/helper-split-export-declaration': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-create-regexp-features-plugin/7.17.0_@babel+core@7.17.10: resolution: {integrity: sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==} @@ -3393,6 +3397,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-annotate-as-pure': 7.16.7 regexpu-core: 5.0.1 + dev: false /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.17.10: resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} @@ -3445,6 +3450,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-environment-visitor/7.16.7: resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} @@ -3676,6 +3682,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} @@ -3697,7 +3704,8 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.10: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} @@ -3737,6 +3745,7 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-class-properties/7.16.7: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} @@ -3773,6 +3782,7 @@ packages: '@babel/helper-plugin-utils': 7.17.12 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-class-properties/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==} @@ -3784,6 +3794,7 @@ packages: '@babel/helper-plugin-utils': 7.17.12 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.10: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} @@ -3810,6 +3821,7 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-decorators/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==} @@ -3838,6 +3850,7 @@ packages: '@babel/plugin-syntax-decorators': 7.17.0_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} @@ -3868,6 +3881,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-export-default-from/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} @@ -3907,7 +3921,8 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} @@ -3938,6 +3953,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} @@ -3957,7 +3973,8 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} @@ -3988,6 +4005,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-nullish-coalescing-operator/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==} @@ -3997,6 +4015,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} @@ -4027,6 +4046,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-numeric-separator/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==} @@ -4036,6 +4056,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} @@ -4086,6 +4107,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} @@ -4116,6 +4138,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} @@ -4149,6 +4172,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-optional-chaining/7.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==} @@ -4158,6 +4182,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.9.0 + dev: false /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.10: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} @@ -4182,6 +4207,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} @@ -4210,6 +4236,7 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} @@ -4240,6 +4267,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.10: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -4264,6 +4292,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -4298,6 +4327,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -4316,6 +4346,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-decorators/7.17.0_@babel+core@7.17.10: resolution: {integrity: sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==} @@ -4333,7 +4364,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -4358,6 +4390,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-export-default-from/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} @@ -4392,6 +4425,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-flow/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} @@ -4418,7 +4452,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-import-meta/7.10.4: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -4469,6 +4504,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} @@ -4514,6 +4550,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.10: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -4530,6 +4567,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -4554,6 +4592,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.10: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -4578,6 +4617,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -4611,6 +4651,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -4635,6 +4676,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -4659,6 +4701,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -4677,6 +4720,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -4704,6 +4748,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-typescript/7.17.10: resolution: {integrity: sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==} @@ -4740,6 +4785,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-syntax-typescript/7.17.12_@babel+core@7.18.5: resolution: {integrity: sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==} @@ -4777,6 +4823,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.10: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} @@ -4816,6 +4863,7 @@ packages: '@babel/helper-remap-async-to-generator': 7.16.8 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} @@ -4843,6 +4891,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} @@ -4870,6 +4919,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} @@ -4924,6 +4974,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} @@ -4951,6 +5002,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.10: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} @@ -4978,6 +5030,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} @@ -5008,6 +5061,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} @@ -5035,6 +5089,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} @@ -5065,6 +5120,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-flow-strip-types/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} @@ -5094,6 +5150,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.17.12 '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} @@ -5121,6 +5178,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} @@ -5154,6 +5212,7 @@ packages: '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.9.0 '@babel/helper-function-name': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} @@ -5181,6 +5240,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} @@ -5208,6 +5268,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} @@ -5247,6 +5308,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-commonjs/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==} @@ -5289,6 +5351,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.10: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} @@ -5334,6 +5397,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} @@ -5370,6 +5434,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-named-capturing-groups-regex/7.17.10_@babel+core@7.17.10: resolution: {integrity: sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==} @@ -5397,6 +5462,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 + dev: false /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} @@ -5424,6 +5490,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-object-assign/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-R8mawvm3x0COTJtveuoqZIjNypn2FjfvXZr4pSQ8VhEFBuQGBz4XhHasZtHXjgXU4XptZ4HtGof3NoYc93ZH9Q==} @@ -5478,6 +5545,7 @@ packages: '@babel/helper-replace-supers': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} @@ -5515,6 +5583,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} @@ -5542,6 +5611,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-constant-elements/7.17.6_@babel+core@7.18.5: resolution: {integrity: sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==} @@ -5549,8 +5619,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.5 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/core': 7.9.0 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-display-name/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} @@ -5578,6 +5649,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-display-name/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==} @@ -5585,7 +5657,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} @@ -5614,6 +5687,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.9.0 + dev: false /@babel/plugin-transform-react-jsx-self/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA==} @@ -5640,7 +5714,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx-source/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==} @@ -5667,7 +5742,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.10: resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} @@ -5707,6 +5783,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.9.0 '@babel/types': 7.17.10 + dev: false /@babel/plugin-transform-react-pure-annotations/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} @@ -5728,6 +5805,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-regenerator/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==} @@ -5755,6 +5833,7 @@ packages: dependencies: '@babel/core': 7.9.0 regenerator-transform: 0.15.0 + dev: false /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} @@ -5782,6 +5861,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-runtime/7.17.10_@babel+core@7.17.10: resolution: {integrity: sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig==} @@ -5825,6 +5905,7 @@ packages: '@babel/helper-plugin-utils': 7.17.12 resolve: 1.22.1 semver: 5.7.1 + dev: false /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} @@ -5852,6 +5933,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} @@ -5882,6 +5964,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + dev: false /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} @@ -5909,6 +5992,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} @@ -5936,6 +6020,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} @@ -5963,6 +6048,7 @@ packages: dependencies: '@babel/core': 7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.17.10: resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} @@ -6002,6 +6088,7 @@ packages: '@babel/plugin-syntax-typescript': 7.17.10_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} @@ -6020,6 +6107,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} @@ -6050,6 +6138,7 @@ packages: '@babel/core': 7.9.0 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.9.0 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/polyfill/7.12.1: resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} @@ -6226,6 +6315,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /@babel/preset-env/7.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==} @@ -6295,6 +6385,7 @@ packages: semver: 5.7.1 transitivePeerDependencies: - supports-color + dev: false /@babel/preset-flow/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==} @@ -6342,6 +6433,7 @@ packages: '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.9.0 '@babel/types': 7.17.10 esutils: 2.0.3 + dev: false /@babel/preset-react/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==} @@ -6367,10 +6459,11 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.18.5 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.18.5 - '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.18.5 - '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.9.0 + '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/preset-react/7.9.1_@babel+core@7.9.0: resolution: {integrity: sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==} @@ -6384,6 +6477,7 @@ packages: '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.9.0 '@babel/plugin-transform-react-jsx-self': 7.16.7_@babel+core@7.9.0 '@babel/plugin-transform-react-jsx-source': 7.16.7_@babel+core@7.9.0 + dev: false /@babel/preset-typescript/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} @@ -6408,6 +6502,7 @@ packages: '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.9.0 transitivePeerDependencies: - supports-color + dev: false /@babel/register/7.17.7_@babel+core@7.17.10: resolution: {integrity: sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==} @@ -7413,9 +7508,11 @@ packages: /@csstools/convert-colors/1.4.0: resolution: {integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==} engines: {node: '>=4.0.0'} + dev: false /@csstools/normalize.css/10.1.0: resolution: {integrity: sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==} + dev: false /@dabh/diagnostics/2.0.3: resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} @@ -7460,6 +7557,7 @@ packages: global-tunnel-ng: 2.7.1 transitivePeerDependencies: - supports-color + dev: true /@electron/remote/2.0.8_electron@15.5.7: resolution: {integrity: sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw==} @@ -7815,6 +7913,7 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true /@eslint/eslintrc/1.2.3: resolution: {integrity: sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==} @@ -9039,10 +9138,12 @@ packages: /@hapi/address/2.1.4: resolution: {integrity: sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==} deprecated: Moved to 'npm install @sideway/address' + dev: false /@hapi/bourne/1.3.2: resolution: {integrity: sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==} deprecated: This version has been deprecated and is no longer supported or maintained + dev: false /@hapi/bourne/2.1.0: resolution: {integrity: sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==} @@ -9051,6 +9152,7 @@ packages: /@hapi/hoek/8.5.1: resolution: {integrity: sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==} deprecated: This version has been deprecated and is no longer supported or maintained + dev: false /@hapi/hoek/9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -9063,12 +9165,14 @@ packages: '@hapi/bourne': 1.3.2 '@hapi/hoek': 8.5.1 '@hapi/topo': 3.1.6 + dev: false /@hapi/topo/3.1.6: resolution: {integrity: sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==} deprecated: This version has been deprecated and is no longer supported or maintained dependencies: '@hapi/hoek': 8.5.1 + dev: false /@hapi/topo/5.1.0: resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} @@ -9158,6 +9262,7 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true /@humanwhocodes/config-array/0.6.0: resolution: {integrity: sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==} @@ -9183,6 +9288,7 @@ packages: /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true /@hutson/parse-repository-url/3.0.2: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} @@ -9212,6 +9318,7 @@ packages: '@jest/source-map': 24.9.0 chalk: 2.4.2 slash: 2.0.0 + dev: false /@jest/console/26.6.2: resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} @@ -9298,6 +9405,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /@jest/core/26.6.3: resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} @@ -9525,6 +9633,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 + dev: true /@jest/create-cache-key-function/27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} @@ -9543,6 +9652,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /@jest/environment/26.6.2: resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} @@ -9629,6 +9739,7 @@ packages: jest-mock: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /@jest/fake-timers/26.6.2: resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} @@ -9750,6 +9861,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /@jest/reporters/26.6.2: resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} @@ -9955,6 +10067,7 @@ packages: callsites: 3.1.0 graceful-fs: 4.2.10 source-map: 0.6.1 + dev: false /@jest/source-map/26.6.2: resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} @@ -9990,6 +10103,7 @@ packages: '@jest/console': 24.9.0 '@jest/types': 24.9.0 '@types/istanbul-lib-coverage': 2.0.4 + dev: false /@jest/test-result/26.6.2: resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} @@ -10044,6 +10158,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /@jest/test-sequencer/26.6.3: resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} @@ -10136,6 +10251,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /@jest/transform/26.6.2: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} @@ -10288,6 +10404,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 1.1.2 '@types/yargs': 13.0.12 + dev: false /@jest/types/26.6.2: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} @@ -11734,6 +11851,7 @@ packages: serve-static: 1.15.0 transitivePeerDependencies: - supports-color + dev: true /@react-native-community/cli-debugger-ui/6.0.0: resolution: {integrity: sha512-onf6vtvqSzOr6bNEWhPzgcJP2UQhA0VY6c8tXwNczIONC/ahnN93LPBB/uXDbn9d/kLMvE7oUJiqRadZWHk6aA==} @@ -11760,6 +11878,7 @@ packages: ip: 1.1.8 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-hermes/6.3.0: resolution: {integrity: sha512-Uhbm9bubyZLZ12vFCIfWbE/Qi3SBTbYIN/TC08EudTLhv/KbPomCQnmFsnJ7AXQFuOZJs73mBxoEAYSbRbwyVA==} @@ -11787,6 +11906,7 @@ packages: xmldoc: 1.1.2 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-platform-android/6.3.0: resolution: {integrity: sha512-d5ufyYcvrZoHznYm5bjBXaiHIJv552t5gYtQpnUsxBhHSQ8QlaNmlLUyeSPRDfOw4ND9b0tPHqs4ufwx6vp/fQ==} @@ -11816,6 +11936,7 @@ packages: xcode: 2.1.0 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-platform-ios/6.2.0: resolution: {integrity: sha512-k15MhExxLiLDDZOeuPgvTxbp0CsoLQQpk2Du0HjZDePqqWcKJylQqMZru1o8HuQHPcEr+b71HIs5V+lKyFYpfg==} @@ -11890,6 +12011,7 @@ packages: - encoding - supports-color - utf-8-validate + dev: true /@react-native-community/cli-server-api/6.4.3: resolution: {integrity: sha512-Ywy2x+PhIUZXgE74YiCYXylSVnuEBcq5cNfYLR3AwOvrILjh03smXfCca8s2V2LWUlzmWN6+L85FJGsT92MUJA==} @@ -11939,6 +12061,7 @@ packages: shell-quote: 1.6.1 transitivePeerDependencies: - encoding + dev: true /@react-native-community/cli-tools/6.2.0: resolution: {integrity: sha512-08ssz4GMEnRxC/1FgTTN/Ud7mExQi5xMphItPjfHiTxpZPhrFn+IMx6mya0ncFEhhxQ207wYlJMRLPRRdBZ8oA==} @@ -11958,6 +12081,7 @@ packages: resolution: {integrity: sha512-BesXnuFFlU/d1F3+sHhvKt8fUxbQlAbZ3hhMEImp9A6sopl8TEtryUGJ1dbazGjRXcADutxvjwT/i3LJVTIQug==} dependencies: ora: 3.4.0 + dev: true /@react-native-community/cli-types/6.0.0: resolution: {integrity: sha512-K493Fk2DMJC0ZM8s8gnfseKxGasIhuDaCUDeLZcoCSFlrjKEuEs1BKKEJiev0CARhKEXKOyyp/uqYM9nWhisNw==} @@ -12018,6 +12142,7 @@ packages: - metro-transform-worker - supports-color - utf-8-validate + dev: true /@react-native-community/cli/6.4.0_fazqo4unimqmfwpywzaiilj7ba: resolution: {integrity: sha512-UNvYnWaALa4mJEaWdLY3fVK+csZzx/Ja/FGvXISPJ9W9lrKvGtyXkidViUCPbPtMsJUi7teA4uIShHn0mbGmnQ==} @@ -12233,12 +12358,14 @@ packages: /@react-native/normalize-color/1.0.0: resolution: {integrity: sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==} + dev: true /@react-native/normalize-color/2.0.0: resolution: {integrity: sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw==} /@react-native/polyfills/1.0.0: resolution: {integrity: sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==} + dev: true /@react-native/polyfills/2.0.0: resolution: {integrity: sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==} @@ -16266,6 +16393,7 @@ packages: /@svgr/babel-plugin-add-jsx-attribute/4.2.0: resolution: {integrity: sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-add-jsx-attribute/5.4.0: resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} @@ -16275,6 +16403,7 @@ packages: /@svgr/babel-plugin-remove-jsx-attribute/4.2.0: resolution: {integrity: sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-remove-jsx-attribute/5.4.0: resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} @@ -16284,6 +16413,7 @@ packages: /@svgr/babel-plugin-remove-jsx-empty-expression/4.2.0: resolution: {integrity: sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-remove-jsx-empty-expression/5.0.1: resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} @@ -16293,6 +16423,7 @@ packages: /@svgr/babel-plugin-replace-jsx-attribute-value/4.2.0: resolution: {integrity: sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-replace-jsx-attribute-value/5.0.1: resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} @@ -16302,6 +16433,7 @@ packages: /@svgr/babel-plugin-svg-dynamic-title/4.3.3: resolution: {integrity: sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-svg-dynamic-title/5.4.0: resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} @@ -16311,6 +16443,7 @@ packages: /@svgr/babel-plugin-svg-em-dimensions/4.2.0: resolution: {integrity: sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-svg-em-dimensions/5.4.0: resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} @@ -16320,6 +16453,7 @@ packages: /@svgr/babel-plugin-transform-react-native-svg/4.2.0: resolution: {integrity: sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-transform-react-native-svg/5.4.0: resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} @@ -16329,6 +16463,7 @@ packages: /@svgr/babel-plugin-transform-svg-component/4.2.0: resolution: {integrity: sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==} engines: {node: '>=8'} + dev: false /@svgr/babel-plugin-transform-svg-component/5.5.0: resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} @@ -16347,6 +16482,7 @@ packages: '@svgr/babel-plugin-svg-em-dimensions': 4.2.0 '@svgr/babel-plugin-transform-react-native-svg': 4.2.0 '@svgr/babel-plugin-transform-svg-component': 4.2.0 + dev: false /@svgr/babel-preset/5.5.0: resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} @@ -16377,6 +16513,7 @@ packages: cosmiconfig: 5.2.1 transitivePeerDependencies: - supports-color + dev: false /@svgr/core/5.5.0: resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} @@ -16432,7 +16569,8 @@ packages: resolution: {integrity: sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==} engines: {node: '>=8'} dependencies: - '@babel/types': 7.18.4 + '@babel/types': 7.17.10 + dev: false /@svgr/hast-util-to-babel-ast/5.5.0: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} @@ -16451,6 +16589,7 @@ packages: svg-parser: 2.0.4 transitivePeerDependencies: - supports-color + dev: false /@svgr/plugin-jsx/5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} @@ -16471,6 +16610,7 @@ packages: cosmiconfig: 5.2.1 merge-deep: 3.0.3 svgo: 1.3.2 + dev: false /@svgr/plugin-svgo/5.5.0: resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} @@ -16507,6 +16647,7 @@ packages: loader-utils: 1.4.0 transitivePeerDependencies: - supports-color + dev: false /@szmarczak/http-timer/1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} @@ -16964,6 +17105,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-lib-report': 3.0.0 + dev: false /@types/istanbul-reports/3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} @@ -17092,6 +17234,7 @@ packages: /@types/node/14.18.17: resolution: {integrity: sha512-oajWz4kOajqpKJMPgnCvBajPq8QAvl2xIWoFjlAJPKGu6n7pjov5SxGE45a+0RxHDoo4ycOMoZw1SCOWtDERbw==} + dev: true /@types/node/16.11.12: resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==} @@ -17476,6 +17619,7 @@ packages: /@types/stack-utils/1.0.1: resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} + dev: false /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} @@ -17592,6 +17736,7 @@ packages: resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} dependencies: '@types/yargs-parser': 21.0.0 + dev: false /@types/yargs/15.0.14: resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} @@ -17636,6 +17781,7 @@ packages: tsutils: 3.21.0 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/eslint-plugin/3.10.1_3z7vojl37e4oxvwlh4ugr4qrou: resolution: {integrity: sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==} @@ -17807,6 +17953,7 @@ packages: transitivePeerDependencies: - supports-color - typescript + dev: false /@typescript-eslint/experimental-utils/3.10.1_e4zyhrvfnqudwdx5bevnvkluy4: resolution: {integrity: sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==} @@ -17896,6 +18043,7 @@ packages: eslint-visitor-keys: 1.3.0 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/parser/3.10.1_e4zyhrvfnqudwdx5bevnvkluy4: resolution: {integrity: sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==} @@ -18118,6 +18266,7 @@ packages: tsutils: 3.21.0 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/typescript-estree/3.10.1_typescript@4.6.4: resolution: {integrity: sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==} @@ -18506,6 +18655,7 @@ packages: '@webassemblyjs/helper-module-context': 1.8.5 '@webassemblyjs/helper-wasm-bytecode': 1.8.5 '@webassemblyjs/wast-parser': 1.8.5 + dev: false /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} @@ -18520,6 +18670,7 @@ packages: /@webassemblyjs/floating-point-hex-parser/1.8.5: resolution: {integrity: sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==} + dev: false /@webassemblyjs/floating-point-hex-parser/1.9.0: resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} @@ -18530,6 +18681,7 @@ packages: /@webassemblyjs/helper-api-error/1.8.5: resolution: {integrity: sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==} + dev: false /@webassemblyjs/helper-api-error/1.9.0: resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} @@ -18540,6 +18692,7 @@ packages: /@webassemblyjs/helper-buffer/1.8.5: resolution: {integrity: sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==} + dev: false /@webassemblyjs/helper-buffer/1.9.0: resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} @@ -18548,6 +18701,7 @@ packages: resolution: {integrity: sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==} dependencies: '@webassemblyjs/wast-printer': 1.8.5 + dev: false /@webassemblyjs/helper-code-frame/1.9.0: resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} @@ -18556,6 +18710,7 @@ packages: /@webassemblyjs/helper-fsm/1.8.5: resolution: {integrity: sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==} + dev: false /@webassemblyjs/helper-fsm/1.9.0: resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} @@ -18565,6 +18720,7 @@ packages: dependencies: '@webassemblyjs/ast': 1.8.5 mamacro: 0.0.3 + dev: false /@webassemblyjs/helper-module-context/1.9.0: resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} @@ -18585,6 +18741,7 @@ packages: /@webassemblyjs/helper-wasm-bytecode/1.8.5: resolution: {integrity: sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==} + dev: false /@webassemblyjs/helper-wasm-bytecode/1.9.0: resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} @@ -18605,6 +18762,7 @@ packages: '@webassemblyjs/helper-buffer': 1.8.5 '@webassemblyjs/helper-wasm-bytecode': 1.8.5 '@webassemblyjs/wasm-gen': 1.8.5 + dev: false /@webassemblyjs/helper-wasm-section/1.9.0: resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} @@ -18624,6 +18782,7 @@ packages: resolution: {integrity: sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: false /@webassemblyjs/ieee754/1.9.0: resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} @@ -18640,6 +18799,7 @@ packages: resolution: {integrity: sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==} dependencies: '@xtuc/long': 4.2.2 + dev: false /@webassemblyjs/leb128/1.9.0: resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} @@ -18652,6 +18812,7 @@ packages: /@webassemblyjs/utf8/1.8.5: resolution: {integrity: sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==} + dev: false /@webassemblyjs/utf8/1.9.0: resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} @@ -18680,6 +18841,7 @@ packages: '@webassemblyjs/wasm-opt': 1.8.5 '@webassemblyjs/wasm-parser': 1.8.5 '@webassemblyjs/wast-printer': 1.8.5 + dev: false /@webassemblyjs/wasm-edit/1.9.0: resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} @@ -18711,6 +18873,7 @@ packages: '@webassemblyjs/ieee754': 1.8.5 '@webassemblyjs/leb128': 1.8.5 '@webassemblyjs/utf8': 1.8.5 + dev: false /@webassemblyjs/wasm-gen/1.9.0: resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} @@ -18737,6 +18900,7 @@ packages: '@webassemblyjs/helper-buffer': 1.8.5 '@webassemblyjs/wasm-gen': 1.8.5 '@webassemblyjs/wasm-parser': 1.8.5 + dev: false /@webassemblyjs/wasm-opt/1.9.0: resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} @@ -18766,6 +18930,7 @@ packages: '@webassemblyjs/ieee754': 1.8.5 '@webassemblyjs/leb128': 1.8.5 '@webassemblyjs/utf8': 1.8.5 + dev: false /@webassemblyjs/wasm-parser/1.9.0: resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} @@ -18786,6 +18951,7 @@ packages: '@webassemblyjs/helper-code-frame': 1.8.5 '@webassemblyjs/helper-fsm': 1.8.5 '@xtuc/long': 4.2.2 + dev: false /@webassemblyjs/wast-parser/1.9.0: resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} @@ -18810,6 +18976,7 @@ packages: '@webassemblyjs/ast': 1.8.5 '@webassemblyjs/wast-parser': 1.8.5 '@xtuc/long': 4.2.2 + dev: false /@webassemblyjs/wast-printer/1.9.0: resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} @@ -18984,6 +19151,7 @@ packages: dependencies: acorn: 6.4.2 acorn-walk: 6.2.0 + dev: false /acorn-globals/6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} @@ -19026,6 +19194,7 @@ packages: /acorn-walk/6.2.0: resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} engines: {node: '>=0.4.0'} + dev: false /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -19041,6 +19210,7 @@ packages: resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} engines: {node: '>=0.4.0'} hasBin: true + dev: false /acorn/6.4.2: resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} @@ -19077,6 +19247,7 @@ packages: loader-utils: 1.2.3 object-path: 0.11.4 regex-parser: 2.2.10 + dev: false /aes-js/3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} @@ -19175,6 +19346,7 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true /algo-msgpack-with-bigint/2.1.1: resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} @@ -19233,6 +19405,7 @@ packages: /ansi-colors/4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + dev: true /ansi-escape-sequences/5.1.2: resolution: {integrity: sha512-JcpoVp1W1bl1Qn4cVuiXEhD6+dyXKSOgCn2zlzE8inYgCJCBy1aPnUhlz6I4DFum8D4ovb9Qi/iAjUcGvG2lqw==} @@ -19532,6 +19705,7 @@ packages: dependencies: ast-types-flow: 0.0.7 commander: 2.20.3 + dev: false /aria-query/4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} @@ -19542,7 +19716,16 @@ packages: dev: true /arity-n/1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} + resolution: {integrity: sha1-2edrEXM+CFacCEeuezmyhgswt0U=} + dev: false + + /arr-diff/2.0.0: + resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + dev: true + optional: true /arr-diff/4.0.0: resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} @@ -19571,7 +19754,8 @@ packages: dev: false /array-equal/1.0.0: - resolution: {integrity: sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==} + resolution: {integrity: sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=} + dev: false /array-filter/0.0.1: resolution: {integrity: sha1-fajPLiZijtcygDWB/SH2fKzS7uw=} @@ -19709,6 +19893,7 @@ packages: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 + dev: false /assert-plus/1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} @@ -19718,6 +19903,7 @@ packages: resolution: {integrity: sha512-N+aAxov+CKVS3JuhDIQFr24XvZvwE96Wlhk9dytTg/GmwWoghdOvR8dspx8MVz71O+Y0pA3UPqHF68D6iy8UvQ==} dependencies: util: 0.10.3 + dev: false /assert/1.5.0: resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} @@ -19831,10 +20017,12 @@ packages: dev: false /aws-sign2/0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} + dev: false /aws4/1.11.0: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + dev: false /axe-core/4.4.1: resolution: {integrity: sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==} @@ -19919,6 +20107,7 @@ packages: resolve: 1.22.0 transitivePeerDependencies: - supports-color + dev: false /babel-eslint/10.1.0_eslint@7.32.0: resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} @@ -19961,6 +20150,7 @@ packages: engines: {node: '>=4'} dependencies: babylon: 6.18.0 + dev: false /babel-generator/6.26.1: resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} @@ -20010,6 +20200,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /babel-jest/26.6.3_@babel+core@7.17.10: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} @@ -20159,6 +20350,7 @@ packages: pify: 4.0.1 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /babel-loader/8.2.5_usdhdj5awexcm2e5jtwd44bofa: resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} @@ -20257,6 +20449,7 @@ packages: test-exclude: 5.2.3 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-istanbul/6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} @@ -20276,6 +20469,7 @@ packages: engines: {node: '>= 6'} dependencies: '@types/babel__traverse': 7.17.1 + dev: false /babel-plugin-jest-hoist/26.6.2: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} @@ -20357,6 +20551,7 @@ packages: '@babel/core': ^7.1.0 dependencies: '@babel/core': 7.9.0 + dev: false /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.17.10: resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} @@ -20381,6 +20576,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.10: resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} @@ -20415,6 +20611,7 @@ packages: core-js-compat: 3.22.5 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.17.10: resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} @@ -20435,6 +20632,7 @@ packages: '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /babel-plugin-react-docgen/4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} @@ -20478,7 +20676,8 @@ packages: resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} /babel-plugin-syntax-object-rest-spread/6.13.0: - resolution: {integrity: sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==} + resolution: {integrity: sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=} + dev: false /babel-plugin-syntax-trailing-function-commas/7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} @@ -20488,9 +20687,11 @@ packages: dependencies: babel-plugin-syntax-object-rest-spread: 6.13.0 babel-runtime: 6.26.0 + dev: false /babel-plugin-transform-react-remove-prop-types/0.4.24: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + dev: false /babel-polyfill/6.26.0: resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} @@ -20637,6 +20838,7 @@ packages: '@babel/core': 7.9.0 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 babel-plugin-jest-hoist: 24.9.0 + dev: false /babel-preset-jest/26.6.2_@babel+core@7.17.10: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} @@ -20702,6 +20904,7 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: - supports-color + dev: false /babel-runtime/6.26.0: resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} @@ -20843,6 +21046,7 @@ packages: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 + dev: false /bech32/1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} @@ -21209,6 +21413,7 @@ packages: /boolean/3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + dev: true optional: true /borsh/0.7.0: @@ -21404,6 +21609,7 @@ packages: electron-to-chromium: 1.4.167 node-releases: 1.1.77 pkg-up: 3.1.0 + dev: false /browserslist/4.14.2: resolution: {integrity: sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==} @@ -21490,7 +21696,8 @@ packages: dev: false /buffer-crc32/0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: true /buffer-equal-constant-time/1.0.1: resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} @@ -21747,6 +21954,7 @@ packages: unique-filename: 1.1.1 transitivePeerDependencies: - bluebird + dev: false /cacache/15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} @@ -21913,6 +22121,7 @@ packages: /camelcase/5.0.0: resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} engines: {node: '>=6'} + dev: false /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} @@ -21962,6 +22171,7 @@ packages: /case-sensitive-paths-webpack-plugin/2.3.0: resolution: {integrity: sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==} engines: {node: '>=4'} + dev: false /case-sensitive-paths-webpack-plugin/2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -21969,7 +22179,8 @@ packages: dev: true /caseless/0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + dev: false /cashaddrjs/0.4.4: resolution: {integrity: sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==} @@ -22327,10 +22538,12 @@ packages: /cli-width/2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: false /cli-width/3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + dev: false /clipboardy/2.3.0: resolution: {integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==} @@ -22392,6 +22605,7 @@ packages: kind-of: 3.2.2 lazy-cache: 1.0.4 shallow-clone: 0.1.2 + dev: false /clone-deep/2.0.2: resolution: {integrity: sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==} @@ -22656,6 +22870,7 @@ packages: /common-tags/1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + dev: false /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -22686,6 +22901,7 @@ packages: resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} dependencies: arity-n: 1.0.4 + dev: false /compress-brotli/1.3.8: resolution: {integrity: sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==} @@ -22799,6 +23015,7 @@ packages: dependencies: ini: 1.3.8 proto-list: 1.2.4 + dev: true optional: true /configstore/5.0.1: @@ -22846,6 +23063,7 @@ packages: /contains-path/0.1.0: resolution: {integrity: sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==} engines: {node: '>=0.10.0'} + dev: false /content-disposition/0.5.2: resolution: {integrity: sha1-DPaLud318r55YcOoUXjLhdunjLQ=} @@ -23040,12 +23258,14 @@ packages: dev: true /convert-source-map/0.3.5: - resolution: {integrity: sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==} + resolution: {integrity: sha1-8dgClQr33SYxof6+BZZVDIarMZA=} + dev: false /convert-source-map/1.7.0: resolution: {integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==} dependencies: safe-buffer: 5.1.2 + dev: false /convert-source-map/1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} @@ -23349,6 +23569,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: false /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -23399,6 +23620,7 @@ packages: hasBin: true dependencies: postcss: 7.0.39 + dev: false /css-color-keywords/1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} @@ -23421,6 +23643,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /css-in-js-utils/2.0.1: resolution: {integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==} @@ -23448,6 +23671,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /css-loader/3.6.0_webpack@4.43.0: resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} @@ -23521,6 +23745,7 @@ packages: hasBin: true dependencies: postcss: 7.0.39 + dev: false /css-select-base-adapter/0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} @@ -23592,14 +23817,17 @@ packages: source-map: 0.6.1 source-map-resolve: 0.5.3 urix: 0.1.0 + dev: false /cssdb/4.4.0: resolution: {integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==} + dev: false /cssesc/2.0.0: resolution: {integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==} engines: {node: '>=4'} hasBin: true + dev: false /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -23689,6 +23917,7 @@ packages: resolution: {integrity: sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==} dependencies: cssom: 0.3.8 + dev: false /cssstyle/2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} @@ -23737,6 +23966,7 @@ packages: dependencies: es5-ext: 0.10.61 type: 1.2.0 + dev: false /d3-array/1.2.4: resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} @@ -23851,6 +24081,7 @@ packages: engines: {node: '>=0.10'} dependencies: assert-plus: 1.0.0 + dev: false /data-urls/1.1.0: resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} @@ -23858,6 +24089,7 @@ packages: abab: 2.0.6 whatwg-mimetype: 2.3.0 whatwg-url: 7.1.0 + dev: false /data-urls/2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} @@ -24338,6 +24570,7 @@ packages: /detect-newline/2.1.0: resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} engines: {node: '>=0.10.0'} + dev: false /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} @@ -24433,6 +24666,7 @@ packages: /diff-sequences/24.9.0: resolution: {integrity: sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==} engines: {node: '>= 6'} + dev: false /diff-sequences/26.6.2: resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} @@ -24488,6 +24722,7 @@ packages: dependencies: arrify: 1.0.1 path-type: 3.0.0 + dev: false /dir-glob/2.2.2: resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} @@ -24568,6 +24803,7 @@ packages: dependencies: esutils: 2.0.3 isarray: 1.0.0 + dev: false /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -24684,6 +24920,7 @@ packages: resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} dependencies: webidl-conversions: 4.0.2 + dev: false /domexception/2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} @@ -24756,6 +24993,7 @@ packages: /dotenv/8.2.0: resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} engines: {node: '>=8'} + dev: false /dotenv/8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} @@ -24821,6 +25059,7 @@ packages: dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 + dev: false /ecdsa-sig-formatter/1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -24964,6 +25203,7 @@ packages: extract-zip: 1.7.0 transitivePeerDependencies: - supports-color + dev: true /elegant-spinner/1.0.1: resolution: {integrity: sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=} @@ -25036,6 +25276,7 @@ packages: /emojis-list/2.1.0: resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} engines: {node: '>= 0.10'} + dev: false /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} @@ -25143,6 +25384,7 @@ packages: /env-paths/2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + dev: true /envinfo/7.8.1: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} @@ -25279,6 +25521,7 @@ packages: es6-iterator: 2.0.3 es6-symbol: 3.1.3 next-tick: 1.1.0 + dev: false /es5-shim/4.6.7: resolution: {integrity: sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==} @@ -25287,6 +25530,7 @@ packages: /es6-error/4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true /es6-iterator/2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -25294,6 +25538,7 @@ packages: d: 1.0.1 es5-ext: 0.10.61 es6-symbol: 3.1.3 + dev: false /es6-object-assign/1.1.0: resolution: {integrity: sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=} @@ -25318,6 +25563,7 @@ packages: dependencies: d: 1.0.1 ext: 1.6.0 + dev: false /es6-template-regex/0.1.1: resolution: {integrity: sha1-5Re54PdCvuuNMECDRUT9oORlFGc=} @@ -25742,6 +25988,7 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 + dev: false /escodegen/2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} @@ -25873,6 +26120,7 @@ packages: eslint-plugin-jsx-a11y: 6.2.3_eslint@6.8.0 eslint-plugin-react: 7.19.0_eslint@6.8.0 eslint-plugin-react-hooks: 1.7.0_eslint@6.8.0 + dev: false /eslint-config-standard/16.0.3_wnerebu6rbpsve3qx7qqwvcqtq: resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} @@ -25957,6 +26205,7 @@ packages: object-hash: 2.2.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /eslint-module-utils/2.7.3_cphntlaow2spielwlvsegonsm4: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} @@ -26059,6 +26308,7 @@ packages: find-up: 2.1.0 transitivePeerDependencies: - supports-color + dev: false /eslint-plugin-detox/1.0.0: resolution: {integrity: sha1-LZwBMOjrxM7Vbvtu6vDQ9cFjOY0=} @@ -26127,6 +26377,7 @@ packages: dependencies: eslint: 6.8.0 lodash: 4.17.21 + dev: false /eslint-plugin-flowtype/5.10.0_eslint@7.32.0: resolution: {integrity: sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==} @@ -26167,6 +26418,7 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false /eslint-plugin-import/2.26.0_eslint@7.32.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} @@ -26349,6 +26601,7 @@ packages: eslint: 6.8.0 has: 1.0.3 jsx-ast-utils: 2.4.1 + dev: false /eslint-plugin-jsx-a11y/6.5.1_eslint@7.32.0: resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} @@ -26528,6 +26781,7 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 dependencies: eslint: 6.8.0 + dev: false /eslint-plugin-react-hooks/4.5.0_eslint@7.32.0: resolution: {integrity: sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==} @@ -26603,6 +26857,7 @@ packages: semver: 6.3.0 string.prototype.matchall: 4.0.7 xregexp: 4.4.1 + dev: false /eslint-plugin-react/7.29.4_eslint@7.32.0: resolution: {integrity: sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==} @@ -26734,6 +26989,7 @@ packages: engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 + dev: false /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -26778,6 +27034,7 @@ packages: /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} + dev: true /eslint-visitor-keys/3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} @@ -26828,6 +27085,7 @@ packages: v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color + dev: false /eslint/7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} @@ -26876,6 +27134,7 @@ packages: v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color + dev: true /eslint/8.15.0: resolution: {integrity: sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==} @@ -26975,6 +27234,7 @@ packages: acorn: 7.4.1 acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 + dev: false /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} @@ -26983,6 +27243,7 @@ packages: acorn: 7.4.1 acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 + dev: true /espree/9.3.2: resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} @@ -27363,6 +27624,7 @@ packages: jest-regex-util: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /expect/26.6.2: resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} @@ -27940,6 +28202,7 @@ packages: resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} dependencies: type: 2.6.0 + dev: false /extend-shallow/2.0.1: resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} @@ -28009,6 +28272,7 @@ packages: yauzl: 2.10.0 transitivePeerDependencies: - supports-color + dev: true /extract-zip/2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -28027,6 +28291,7 @@ packages: /extsprintf/1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} + dev: false /extsprintf/1.4.1: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} @@ -28171,6 +28436,7 @@ packages: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 + dev: true /fecha/4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -28208,12 +28474,14 @@ packages: engines: {node: '>=4'} dependencies: flat-cache: 2.0.1 + dev: false /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 + dev: true /file-loader/4.3.0_webpack@4.42.0: resolution: {integrity: sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==} @@ -28224,6 +28492,7 @@ packages: loader-utils: 1.4.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /file-loader/6.0.0_webpack@4.43.0: resolution: {integrity: sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==} @@ -28292,6 +28561,7 @@ packages: /filesize/6.0.1: resolution: {integrity: sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==} engines: {node: '>= 0.4.0'} + dev: false /filesize/6.1.0: resolution: {integrity: sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==} @@ -28388,6 +28658,7 @@ packages: commondir: 1.0.1 mkdirp: 0.5.6 pkg-dir: 1.0.0 + dev: false /find-cache-dir/2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} @@ -28420,6 +28691,7 @@ packages: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 + dev: false /find-up/2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} @@ -28502,6 +28774,7 @@ packages: flatted: 2.0.2 rimraf: 2.6.3 write: 1.0.3 + dev: false /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} @@ -28509,6 +28782,7 @@ packages: dependencies: flatted: 3.2.5 rimraf: 3.0.2 + dev: true /flat/4.1.1: resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} @@ -28528,13 +28802,16 @@ packages: /flatted/2.0.2: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: false /flatted/3.2.5: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + dev: true /flatten/1.0.3: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + dev: false /flipper-plugin-rn-performance-android/0.1.0: resolution: {integrity: sha512-GfzhKeMfWxLDeXArkit91bXE2m+g4SyVoBCpwsxMO/s0zB1mcZbqx6oIOSKwjpGFlQ3b/BpNNQ1+Xms3OeV5fw==} @@ -28645,10 +28922,12 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.4 + dev: false /for-in/0.1.8: resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} engines: {node: '>=0.10.0'} + dev: false /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} @@ -28683,7 +28962,8 @@ packages: dev: true /forever-agent/0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + dev: false /fork-ts-checker-webpack-plugin/3.1.1_s4p5obgc5rn2wrc7rinrdszb4m: resolution: {integrity: sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==} @@ -28711,6 +28991,7 @@ packages: worker-rpc: 0.1.1 transitivePeerDependencies: - supports-color + dev: false /fork-ts-checker-webpack-plugin/4.1.6_7wnmsrtcnse6htziqnucw6w67m: resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} @@ -28927,6 +29208,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: false /form-data/2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} @@ -29141,6 +29423,7 @@ packages: os: [darwin] deprecated: '"Please update to latest v2.3 or v2.2"' requiresBuild: true + dev: false optional: true /fsevents/2.3.2: @@ -29353,6 +29636,7 @@ packages: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: assert-plus: 1.0.0 + dev: false /git-raw-commits/2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} @@ -29546,6 +29830,7 @@ packages: roarr: 2.15.4 semver: 7.3.7 serialize-error: 7.0.1 + dev: true optional: true /global-dirs/3.0.0: @@ -29577,6 +29862,7 @@ packages: lodash: 4.17.21 npm-conf: 1.1.3 tunnel: 0.0.6 + dev: true optional: true /global/4.4.0: @@ -29604,6 +29890,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true /globals/9.18.0: resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} @@ -29666,6 +29953,7 @@ packages: slash: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /globby/9.2.0: resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} @@ -29846,6 +30134,7 @@ packages: /har-schema/2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} + dev: false /har-validator/5.1.5: resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} @@ -29854,6 +30143,7 @@ packages: dependencies: ajv: 6.12.6 har-schema: 2.0.0 + dev: false /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} @@ -29862,6 +30152,7 @@ packages: /harmony-reflect/1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + dev: false /has-ansi/2.0.0: resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} @@ -30087,6 +30378,7 @@ packages: /hermes-engine/0.7.2: resolution: {integrity: sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==} + dev: true /hermes-engine/0.8.1: resolution: {integrity: sha512-as9Iccj/qrqqtDmfYUHbOIjt5xsQbUB6pjNIW3i1+RVr+pCAdz5S8/Jry778mz3rJWplYzHWdR1u1xQSYfBRYw==} @@ -30200,6 +30492,7 @@ packages: resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} dependencies: whatwg-encoding: 1.0.5 + dev: false /html-encoding-sniffer/2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} @@ -30300,6 +30593,7 @@ packages: tapable: 1.1.3 util.promisify: 1.0.0 webpack: 4.42.0 + dev: false /html-webpack-plugin/4.3.0_webpack@4.43.0: resolution: {integrity: sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==} @@ -30491,6 +30785,7 @@ packages: assert-plus: 1.0.0 jsprim: 1.4.2 sshpk: 1.17.0 + dev: false /http2-wrapper/1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} @@ -30584,6 +30879,7 @@ packages: engines: {node: '>=4'} dependencies: harmony-reflect: 1.6.2 + dev: false /idna-uts46-hx/2.3.1: resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} @@ -30610,6 +30906,7 @@ packages: /ignore/3.3.10: resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} + dev: false /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -30637,6 +30934,7 @@ packages: /immer/1.10.0: resolution: {integrity: sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==} + dev: false /immer/8.0.1: resolution: {integrity: sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==} @@ -30647,6 +30945,7 @@ packages: engines: {node: '>=4'} dependencies: import-from: 2.1.0 + dev: false /import-fresh/2.0.0: resolution: {integrity: sha1-2BNVwVYS04bGH53dOSLUMEgipUY=} @@ -30667,6 +30966,7 @@ packages: engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 + dev: false /import-lazy/2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} @@ -30785,6 +31085,7 @@ packages: string-width: 4.2.3 strip-ansi: 5.2.0 through: 2.3.8 + dev: false /inquirer/7.3.3: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} @@ -30803,6 +31104,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 + dev: false /int64-buffer/1.0.1: resolution: {integrity: sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==} @@ -30827,6 +31129,7 @@ packages: /interpret/1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + dev: true /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} @@ -31535,7 +31838,8 @@ packages: dev: false /isstream/0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} + dev: false /istanbul-instrumenter-loader/3.0.1_webpack@5.73.0: resolution: {integrity: sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==} @@ -31559,6 +31863,7 @@ packages: /istanbul-lib-coverage/2.0.5: resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} engines: {node: '>=6'} + dev: false /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} @@ -31599,6 +31904,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /istanbul-lib-instrument/4.0.3: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} @@ -31645,6 +31951,7 @@ packages: istanbul-lib-coverage: 2.0.5 make-dir: 2.1.0 supports-color: 6.1.0 + dev: false /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} @@ -31666,6 +31973,7 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: false /istanbul-lib-source-maps/4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} @@ -31683,6 +31991,7 @@ packages: engines: {node: '>=6'} dependencies: html-escaper: 2.0.2 + dev: false /istanbul-reports/3.1.4: resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} @@ -31765,6 +32074,7 @@ packages: '@jest/types': 24.9.0 execa: 1.0.0 throat: 4.1.0 + dev: false /jest-changed-files/26.6.2: resolution: {integrity: sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==} @@ -31927,6 +32237,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-cli/26.6.3: resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} @@ -32101,6 +32412,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-config/26.6.3: resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} @@ -32390,6 +32702,7 @@ packages: diff-sequences: 24.9.0 jest-get-type: 24.9.0 pretty-format: 24.9.0 + dev: false /jest-diff/26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} @@ -32434,6 +32747,7 @@ packages: engines: {node: '>= 6'} dependencies: detect-newline: 2.1.0 + dev: false /jest-docblock/26.0.0: resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} @@ -32474,6 +32788,7 @@ packages: pretty-format: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /jest-each/26.6.2: resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} @@ -32533,6 +32848,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-environment-jsdom/24.9.0: resolution: {integrity: sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==} @@ -32549,6 +32865,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-environment-jsdom/26.6.2: resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} @@ -32598,6 +32915,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /jest-environment-node/26.6.2: resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} @@ -32659,6 +32977,7 @@ packages: /jest-get-type/24.9.0: resolution: {integrity: sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==} engines: {node: '>= 6'} + dev: false /jest-get-type/26.3.0: resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} @@ -32693,6 +33012,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /jest-haste-map/26.6.2: resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} @@ -32850,6 +33170,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /jest-jasmine2/26.6.3: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} @@ -32940,6 +33261,7 @@ packages: dependencies: jest-get-type: 24.9.0 pretty-format: 24.9.0 + dev: false /jest-leak-detector/26.6.2: resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} @@ -32981,6 +33303,7 @@ packages: jest-diff: 24.9.0 jest-get-type: 24.9.0 pretty-format: 24.9.0 + dev: false /jest-matcher-utils/26.6.2: resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} @@ -33045,6 +33368,7 @@ packages: stack-utils: 1.0.5 transitivePeerDependencies: - supports-color + dev: false /jest-message-util/26.6.2: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} @@ -33110,6 +33434,7 @@ packages: engines: {node: '>= 6'} dependencies: '@jest/types': 24.9.0 + dev: false /jest-mock/26.6.2: resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} @@ -33153,6 +33478,7 @@ packages: optional: true dependencies: jest-resolve: 24.9.0 + dev: false /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} @@ -33205,6 +33531,7 @@ packages: /jest-regex-util/24.9.0: resolution: {integrity: sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==} engines: {node: '>= 6'} + dev: false /jest-regex-util/26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} @@ -33229,6 +33556,7 @@ packages: jest-snapshot: 24.9.0 transitivePeerDependencies: - supports-color + dev: false /jest-resolve-dependencies/26.6.3: resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} @@ -33297,6 +33625,7 @@ packages: chalk: 2.4.2 jest-pnp-resolver: 1.2.2_jest-resolve@24.9.0 realpath-native: 1.1.0 + dev: false /jest-resolve/26.6.2: resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} @@ -33410,6 +33739,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-runner/26.6.3: resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} @@ -33603,6 +33933,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest-runtime/26.6.3: resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} @@ -33772,6 +34103,7 @@ packages: /jest-serializer/24.9.0: resolution: {integrity: sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==} engines: {node: '>= 6'} + dev: false /jest-serializer/26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} @@ -33807,6 +34139,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /jest-snapshot/26.6.2: resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} @@ -33977,6 +34310,7 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: false /jest-util/26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} @@ -34035,6 +34369,7 @@ packages: jest-get-type: 24.9.0 leven: 3.1.0 pretty-format: 24.9.0 + dev: false /jest-validate/26.6.2: resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} @@ -34095,6 +34430,7 @@ packages: strip-ansi: 5.2.0 transitivePeerDependencies: - supports-color + dev: false /jest-watcher/24.9.0: resolution: {integrity: sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==} @@ -34109,6 +34445,7 @@ packages: string-length: 2.0.0 transitivePeerDependencies: - supports-color + dev: false /jest-watcher/26.6.2: resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} @@ -34175,6 +34512,7 @@ packages: dependencies: merge-stream: 2.0.0 supports-color: 6.1.0 + dev: false /jest-worker/25.5.0: resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} @@ -34187,6 +34525,7 @@ packages: dependencies: merge-stream: 2.0.0 supports-color: 7.2.0 + dev: false /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} @@ -34284,6 +34623,7 @@ packages: - metro - supports-color - utf-8-validate + dev: false /jest/26.6.3: resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} @@ -34494,10 +34834,12 @@ packages: argparse: 2.0.1 /jsbn/0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} + dev: false /jsc-android/245459.0.0: resolution: {integrity: sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==} + dev: true /jsc-android/250230.2.1: resolution: {integrity: sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q==} @@ -34559,6 +34901,7 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color + dev: true /jsdom/11.12.0: resolution: {integrity: sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==} @@ -34592,6 +34935,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /jsdom/14.1.0: resolution: {integrity: sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==} @@ -34626,6 +34970,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /jsdom/16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} @@ -34775,9 +35120,11 @@ packages: /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true /json-schema/0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} @@ -34786,6 +35133,7 @@ packages: resolution: {integrity: sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==} dependencies: jsonify: 0.0.0 + dev: false /json-stringify-safe/5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -34866,6 +35214,7 @@ packages: extsprintf: 1.3.0 json-schema: 0.4.0 verror: 1.10.0 + dev: false /jsqr/1.4.0: resolution: {integrity: sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==} @@ -34944,6 +35293,7 @@ packages: dependencies: array-includes: 3.1.5 object.assign: 4.1.2 + dev: false /jsx-ast-utils/3.3.0: resolution: {integrity: sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==} @@ -35059,6 +35409,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 + dev: false /kind-of/3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} @@ -35271,6 +35622,7 @@ packages: /lazy-cache/0.2.7: resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} engines: {node: '>=0.10.0'} + dev: false /lazy-cache/1.0.4: resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} @@ -35335,6 +35687,7 @@ packages: /left-pad/1.3.0: resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} deprecated: use String.prototype.padStart() + dev: false /level-blobs/0.1.7: resolution: {integrity: sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=} @@ -35415,6 +35768,7 @@ packages: engines: {node: '>= 6'} dependencies: leven: 3.1.0 + dev: false /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} @@ -35429,6 +35783,7 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true /libsodium-wrappers/0.7.10: resolution: {integrity: sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==} @@ -35613,6 +35968,7 @@ packages: dependencies: find-cache-dir: 0.1.1 mkdirp: 0.5.6 + dev: false /loader-runner/2.4.0: resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} @@ -35630,6 +35986,7 @@ packages: big.js: 5.2.2 emojis-list: 2.1.0 json5: 1.0.1 + dev: false /loader-utils/1.4.0: resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} @@ -35794,6 +36151,7 @@ packages: /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true /lodash.omit/4.5.0: resolution: {integrity: sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=} @@ -35840,6 +36198,7 @@ packages: /lodash.truncate/4.4.2: resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} + dev: true /lodash.unescape/4.0.1: resolution: {integrity: sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=} @@ -36198,6 +36557,7 @@ packages: /mamacro/0.0.3: resolution: {integrity: sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==} + dev: false /map-age-cleaner/0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} @@ -36249,6 +36609,7 @@ packages: engines: {node: '>=10'} dependencies: escape-string-regexp: 4.0.0 + dev: true optional: true /md5-file/3.2.3: @@ -36515,6 +36876,7 @@ packages: arr-union: 3.1.0 clone-deep: 0.2.4 kind-of: 3.2.2 + dev: false /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} @@ -36554,6 +36916,7 @@ packages: escape-string-regexp: 1.0.5 transitivePeerDependencies: - supports-color + dev: true /metro-babel-register/0.66.2: resolution: {integrity: sha512-3F+vsVubUPJYKfVMeol8/7pd8CC287Rw92QYzJD8LEmI980xcgwMUEVBZ0UIAUwlLgiJG/f4Mwhuji2EeBXrPg==} @@ -36806,6 +37169,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: true /metro-source-map/0.66.2: resolution: {integrity: sha512-038tFmB7vSh73VQcDWIbr5O1m+WXWyYafDaOy+1A/2K308YP0oj33gbEgDnZsLZDwcJ+xt1x6KUEBIzlX4YGeQ==} @@ -36848,6 +37212,7 @@ packages: vlq: 1.0.1 transitivePeerDependencies: - supports-color + dev: true /metro-symbolicate/0.66.2: resolution: {integrity: sha512-u+DeQHyAFXVD7mVP+GST/894WHJ3i/U8oEJFnT7U3P52ZuLgX8n4tMNxhqZU12RcLR6etF8143aP0Ktx1gFLEQ==} @@ -37209,6 +37574,7 @@ packages: schema-utils: 1.0.0 webpack: 4.42.0 webpack-sources: 1.4.3 + dev: false /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -37321,6 +37687,7 @@ packages: dependencies: for-in: 0.1.8 is-extendable: 0.1.1 + dev: false /mixme/0.5.4: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} @@ -37543,6 +37910,7 @@ packages: /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: false /mv/2.1.1: resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} @@ -37652,6 +38020,7 @@ packages: /next-tick/1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -37843,6 +38212,7 @@ packages: semver: 5.7.1 shellwords: 0.1.1 which: 1.3.1 + dev: false /node-notifier/8.0.2: resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} @@ -37975,6 +38345,7 @@ packages: prepend-http: 1.0.4 query-string: 4.3.4 sort-keys: 1.1.2 + dev: false /normalize-url/2.0.1: resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} @@ -38010,6 +38381,7 @@ packages: dependencies: config-chain: 1.1.13 pify: 3.0.0 + dev: true optional: true /npm-package-arg/6.1.0: @@ -38146,9 +38518,11 @@ packages: /oauth-sign/0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: false /ob1/0.64.0: resolution: {integrity: sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==} + dev: true /ob1/0.66.2: resolution: {integrity: sha512-RFewnL/RjE0qQBOuM+2bbY96zmJPIge/aDtsiDbLSb+MOiK8CReAhBHDgL+zrA3F1hQk00lMWpUwYcep750plA==} @@ -38171,6 +38545,7 @@ packages: /object-hash/2.2.0: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} + dev: false /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} @@ -38198,6 +38573,7 @@ packages: /object-path/0.11.4: resolution: {integrity: sha512-ICbQN+aw/eAASDtaC7+SJXSAruz7fvvNjxMFfS3mTdvZaaiuuw81XXYu+9CSJeUVrS3YpRhTr862YGywMQUOWg==} engines: {node: '>=0.10.0'} + dev: false /object-visit/1.0.1: resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} @@ -38408,6 +38784,7 @@ packages: cssnano: 4.1.11 last-call-webpack-plugin: 3.0.0 webpack: 4.42.0 + dev: false /optimize-css-assets-webpack-plugin/5.0.8_webpack@4.43.0: resolution: {integrity: sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==} @@ -38440,6 +38817,7 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.3 + dev: true /options/0.0.6: resolution: {integrity: sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=} @@ -38588,6 +38966,7 @@ packages: engines: {node: '>=4'} dependencies: p-reduce: 1.0.0 + dev: false /p-each-series/2.2.0: resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} @@ -38683,6 +39062,7 @@ packages: /p-reduce/1.0.0: resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==} engines: {node: '>=4'} + dev: false /p-retry/3.0.1: resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} @@ -38882,9 +39262,11 @@ packages: /parse5/4.0.0: resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + dev: false /parse5/5.1.0: resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} + dev: false /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -38929,6 +39311,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: pinkie-promise: 2.0.1 + dev: false /path-exists/3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} @@ -39035,7 +39418,8 @@ packages: sha.js: 2.4.11 /pend/1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + dev: true /performance-now/0.2.0: resolution: {integrity: sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=} @@ -39043,6 +39427,7 @@ packages: /performance-now/2.1.0: resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + dev: false /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} @@ -39168,6 +39553,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: find-up: 1.1.2 + dev: false /pkg-dir/3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} @@ -39261,6 +39647,7 @@ packages: /pn/1.1.0: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + dev: false /pngjs/3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} @@ -39287,6 +39674,7 @@ packages: ts-pnp: 1.2.0 transitivePeerDependencies: - typescript + dev: false /pnp-webpack-plugin/1.6.4_typescript@4.6.4: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} @@ -39343,6 +39731,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 6.0.10 + dev: false /postcss-browser-comments/3.0.0_browserslist@4.21.0: resolution: {integrity: sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==} @@ -39352,6 +39741,7 @@ packages: dependencies: browserslist: 4.21.0 postcss: 7.0.39 + dev: false /postcss-calc/7.0.5: resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} @@ -39366,6 +39756,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-gray/5.0.0: resolution: {integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==} @@ -39374,6 +39765,7 @@ packages: '@csstools/convert-colors': 1.4.0 postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-hex-alpha/5.0.3: resolution: {integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==} @@ -39381,6 +39773,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-mod-function/3.0.3: resolution: {integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==} @@ -39389,6 +39782,7 @@ packages: '@csstools/convert-colors': 1.4.0 postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-color-rebeccapurple/4.0.1: resolution: {integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==} @@ -39396,6 +39790,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-colormin/4.0.3: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} @@ -39419,6 +39814,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-custom-properties/8.0.11: resolution: {integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==} @@ -39426,6 +39822,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-custom-selectors/5.1.2: resolution: {integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==} @@ -39433,6 +39830,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /postcss-dir-pseudo-class/5.0.0: resolution: {integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==} @@ -39440,6 +39838,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /postcss-discard-comments/4.0.2: resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} @@ -39471,6 +39870,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-env-function/2.0.2: resolution: {integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==} @@ -39478,11 +39878,13 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-flexbugs-fixes/4.1.0: resolution: {integrity: sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==} dependencies: postcss: 7.0.39 + dev: false /postcss-flexbugs-fixes/4.2.1: resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} @@ -39495,23 +39897,27 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-focus-within/3.0.0: resolution: {integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-font-variant/4.0.1: resolution: {integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==} dependencies: postcss: 7.0.39 + dev: false /postcss-gap-properties/2.0.0: resolution: {integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-image-set-function/3.0.1: resolution: {integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==} @@ -39519,11 +39925,13 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-initial/3.0.4: resolution: {integrity: sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==} dependencies: postcss: 7.0.39 + dev: false /postcss-lab-function/2.0.1: resolution: {integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==} @@ -39532,6 +39940,7 @@ packages: '@csstools/convert-colors': 1.4.0 postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-load-config/2.1.2: resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} @@ -39539,6 +39948,7 @@ packages: dependencies: cosmiconfig: 5.2.1 import-cwd: 2.1.0 + dev: false /postcss-loader/3.0.0: resolution: {integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==} @@ -39548,6 +39958,7 @@ packages: postcss: 7.0.39 postcss-load-config: 2.1.2 schema-utils: 1.0.0 + dev: false /postcss-loader/4.3.0_gzaxsinx64nntyd3vmdqwl7coe: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} @@ -39570,12 +39981,14 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-media-minmax/4.0.0: resolution: {integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-merge-longhand/4.0.11: resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} @@ -39666,6 +40079,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-normalize-charset/4.0.1: resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} @@ -39748,6 +40162,7 @@ packages: postcss: 7.0.39 postcss-browser-comments: 3.0.0_browserslist@4.21.0 sanitize.css: 10.0.0 + dev: false /postcss-ordered-values/4.1.2: resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} @@ -39762,11 +40177,13 @@ packages: engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-page-break/2.0.0: resolution: {integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==} dependencies: postcss: 7.0.39 + dev: false /postcss-place/4.0.1: resolution: {integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==} @@ -39774,6 +40191,7 @@ packages: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 + dev: false /postcss-preset-env/6.7.0: resolution: {integrity: sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==} @@ -39816,6 +40234,7 @@ packages: postcss-replace-overflow-wrap: 3.0.0 postcss-selector-matches: 4.0.0 postcss-selector-not: 4.0.1 + dev: false /postcss-pseudo-class-any-link/6.0.0: resolution: {integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==} @@ -39823,6 +40242,7 @@ packages: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 + dev: false /postcss-reduce-initial/4.0.3: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} @@ -39846,12 +40266,14 @@ packages: resolution: {integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==} dependencies: postcss: 7.0.39 + dev: false /postcss-safe-parser/4.0.1: resolution: {integrity: sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==} engines: {node: '>=6.0.0'} dependencies: postcss: 7.0.39 + dev: false /postcss-safe-parser/4.0.2: resolution: {integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==} @@ -39865,12 +40287,14 @@ packages: dependencies: balanced-match: 1.0.2 postcss: 7.0.39 + dev: false /postcss-selector-not/4.0.1: resolution: {integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==} dependencies: balanced-match: 1.0.2 postcss: 7.0.39 + dev: false /postcss-selector-parser/3.1.2: resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} @@ -39887,6 +40311,7 @@ packages: cssesc: 2.0.0 indexes-of: 1.0.1 uniq: 1.0.1 + dev: false /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -39924,6 +40349,7 @@ packages: flatten: 1.0.3 indexes-of: 1.0.1 uniq: 1.0.1 + dev: false /postcss/7.0.21: resolution: {integrity: sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==} @@ -39932,6 +40358,7 @@ packages: chalk: 2.4.2 source-map: 0.6.1 supports-color: 6.1.0 + dev: false /postcss/7.0.39: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} @@ -40015,10 +40442,12 @@ packages: /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + dev: true /prepend-http/1.0.4: resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} engines: {node: '>=0.10.0'} + dev: false /prepend-http/2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} @@ -40085,6 +40514,7 @@ packages: ansi-regex: 4.1.1 ansi-styles: 3.2.1 react-is: 16.13.1 + dev: false /pretty-format/26.6.2: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} @@ -40334,7 +40764,8 @@ packages: dev: true /proto-list/1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} + dev: true optional: true /protobufjs/6.10.1: @@ -40537,6 +40968,7 @@ packages: /qs/6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + dev: false /qs/6.7.0: resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==} @@ -40554,6 +40986,7 @@ packages: dependencies: object-assign: 4.1.1 strict-uri-encode: 1.1.0 + dev: false /query-string/5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} @@ -40645,6 +41078,7 @@ packages: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: performance-now: 2.1.0 + dev: false /ramda/0.21.0: resolution: {integrity: sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=} @@ -40749,6 +41183,7 @@ packages: raf: 3.4.1 regenerator-runtime: 0.13.9 whatwg-fetch: 3.6.2 + dev: false /react-app-rewired/2.2.1_react-scripts@3.4.3: resolution: {integrity: sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==} @@ -40824,6 +41259,7 @@ packages: - typescript - vue-template-compiler - webpack + dev: false /react-dev-utils/11.0.4_mccwujuzvffchnbo4vkvqqqe2q: resolution: {integrity: sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==} @@ -40879,6 +41315,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true /react-docgen-typescript/2.2.2_typescript@4.6.4: resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} @@ -41146,6 +41583,7 @@ packages: transitivePeerDependencies: - '@babel/preset-env' - supports-color + dev: true /react-native-codegen/0.0.7: resolution: {integrity: sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng==} @@ -41741,6 +42179,7 @@ packages: - metro-transform-worker - supports-color - utf-8-validate + dev: true /react-native/0.65.1_react@17.0.2: resolution: {integrity: sha512-0UOVSnlssweQZjuaUtzViCifE/4tXm8oRbxwakopc8GavPu9vLulde145GOw6QVYiOy4iL50f+2XXRdX9NmMeQ==} @@ -42071,6 +42510,7 @@ packages: - vue-template-compiler - webpack-cli - webpack-command + dev: false /react-select/3.2.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==} @@ -42490,6 +42930,7 @@ packages: engines: {node: '>=4'} dependencies: util.promisify: 1.1.1 + dev: false /recast/0.20.5: resolution: {integrity: sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==} @@ -42505,6 +42946,7 @@ packages: engines: {node: '>= 0.10'} dependencies: resolve: 1.22.0 + dev: true /rechoir/0.7.1: resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} @@ -42629,6 +43071,7 @@ packages: /regex-parser/2.2.10: resolution: {integrity: sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==} + dev: false /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} @@ -42641,6 +43084,7 @@ packages: /regexpp/2.0.1: resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} engines: {node: '>=6.5.0'} + dev: false /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} @@ -42915,6 +43359,7 @@ packages: dependencies: lodash: 4.17.21 request: 2.88.2 + dev: false /request-promise-native/1.0.9_request@2.88.2: resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} @@ -42927,6 +43372,7 @@ packages: request-promise-core: 1.1.4_request@2.88.2 stealthy-require: 1.1.1 tough-cookie: 2.5.0 + dev: false /request/2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} @@ -42953,6 +43399,7 @@ packages: tough-cookie: 2.5.0 tunnel-agent: 0.6.0 uuid: 3.4.0 + dev: false /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -43055,6 +43502,7 @@ packages: rework: 1.0.1 rework-visit: 1.0.0 source-map: 0.6.1 + dev: false /resolve-url/0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} @@ -43072,6 +43520,7 @@ packages: resolution: {integrity: sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==} dependencies: path-parse: 1.0.7 + dev: false /resolve/1.22.0: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} @@ -43140,13 +43589,15 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} /rework-visit/1.0.0: - resolution: {integrity: sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==} + resolution: {integrity: sha1-mUWygD8hni96ygCtuLyfZA+ELJo=} + dev: false /rework/1.0.1: resolution: {integrity: sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==} dependencies: convert-source-map: 0.3.5 css: 2.2.4 + dev: false /rfc4648/1.5.1: resolution: {integrity: sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==} @@ -43265,6 +43716,7 @@ packages: json-stringify-safe: 5.0.1 semver-compare: 1.0.0 sprintf-js: 1.1.2 + dev: true optional: true /router-ips/1.0.0: @@ -43291,6 +43743,7 @@ packages: /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + dev: false /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -43383,6 +43836,7 @@ packages: /sanitize.css/10.0.0: resolution: {integrity: sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==} + dev: false /sass-loader/8.0.2_webpack@4.42.0: resolution: {integrity: sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==} @@ -43406,6 +43860,7 @@ packages: schema-utils: 2.7.1 semver: 6.3.0 webpack: 4.42.0 + dev: false /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -43415,6 +43870,7 @@ packages: engines: {node: '>=8'} dependencies: xmlchars: 2.2.0 + dev: false /saxes/5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} @@ -43526,6 +43982,7 @@ packages: /semver-compare/1.0.0: resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=} + dev: true /semver-diff/3.1.1: resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} @@ -43644,6 +44101,7 @@ packages: engines: {node: '>=10'} dependencies: type-fest: 0.13.1 + dev: true optional: true /serialize-error/8.1.0: @@ -43837,6 +44295,7 @@ packages: kind-of: 2.0.1 lazy-cache: 0.2.7 mixin-object: 2.0.1 + dev: false /shallow-clone/1.0.0: resolution: {integrity: sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==} @@ -43912,6 +44371,7 @@ packages: glob: 7.2.0 interpret: 1.4.0 rechoir: 0.6.2 + dev: true /shellwords/0.1.1: resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} @@ -44027,6 +44487,7 @@ packages: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + dev: true /sliced/1.0.1: resolution: {integrity: sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=} @@ -44198,6 +44659,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-plain-obj: 1.1.0 + dev: false /sort-keys/2.0.0: resolution: {integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=} @@ -44383,6 +44845,7 @@ packages: /sprintf-js/1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + dev: true optional: true /sshpk/1.17.0: @@ -44399,6 +44862,7 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 tweetnacl: 0.14.5 + dev: false /ssri/6.0.2: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} @@ -44411,6 +44875,7 @@ packages: dependencies: figgy-pudding: 3.5.2 minipass: 3.1.6 + dev: false /ssri/8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} @@ -44431,6 +44896,7 @@ packages: engines: {node: '>=8'} dependencies: escape-string-regexp: 2.0.0 + dev: false /stack-utils/2.0.5: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} @@ -44524,6 +44990,7 @@ packages: /stealthy-require/1.1.1: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} + dev: false /stellar-base/8.0.1: resolution: {integrity: sha512-IB7GxyAF59jHmY0jyX5vxzD5k7AJLTGSelRIcjJZwsENsqa7tNWEh9HpnmYGvCgdeG2D+MxaeR5fouEvElaH8A==} @@ -44695,6 +45162,7 @@ packages: dependencies: astral-regex: 1.0.0 strip-ansi: 4.0.0 + dev: false /string-length/3.1.0: resolution: {integrity: sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==} @@ -44702,6 +45170,7 @@ packages: dependencies: astral-regex: 1.0.0 strip-ansi: 5.2.0 + dev: false /string-length/4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -44875,6 +45344,7 @@ packages: dependencies: babel-extract-comments: 1.0.0 babel-plugin-transform-object-rest-spread: 6.26.0 + dev: false /strip-eof/1.0.0: resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} @@ -44923,6 +45393,7 @@ packages: dependencies: loader-utils: 1.4.0 schema-utils: 1.0.0 + dev: false /style-loader/1.2.1_webpack@4.43.0: resolution: {integrity: sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==} @@ -45131,6 +45602,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true /superagent/6.1.0: resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} @@ -45348,6 +45820,7 @@ packages: slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true /tail/2.2.4: resolution: {integrity: sha512-PX8klSxW1u3SdgDrDeewh5GNE+hkJ4h02JvHfV6YrHqWOVJ88nUdSQqtsUf/gWhgZlPAws3fiZ+F1f8euspcuQ==} @@ -45549,6 +46022,7 @@ packages: webpack: 4.42.0 webpack-sources: 1.4.3 worker-farm: 1.7.0 + dev: false /terser-webpack-plugin/1.4.5_webpack@4.42.1: resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} @@ -45623,6 +46097,7 @@ packages: transitivePeerDependencies: - bluebird - metro + dev: false /terser-webpack-plugin/3.1.0_3vxwytkl4ej33mzbpow4f24y7e: resolution: {integrity: sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA==} @@ -45769,6 +46244,7 @@ packages: minimatch: 3.1.2 read-pkg-up: 4.0.0 require-main-filename: 2.0.0 + dev: false /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -45811,7 +46287,8 @@ packages: any-promise: 1.3.0 /throat/4.1.0: - resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} + resolution: {integrity: sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=} + dev: false /throat/5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -46051,6 +46528,7 @@ packages: dependencies: psl: 1.8.0 punycode: 2.1.1 + dev: false /tough-cookie/4.0.0: resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} @@ -46370,6 +46848,7 @@ packages: peerDependenciesMeta: typescript: optional: true + dev: false /ts-pnp/1.2.0: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} @@ -46419,6 +46898,7 @@ packages: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 + dev: false /tsutils/3.21.0_typescript@4.6.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -46604,7 +47084,8 @@ packages: dev: false /tweetnacl/0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} + dev: false /tweetnacl/1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -46621,6 +47102,7 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -46639,6 +47121,7 @@ packages: /type-fest/0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} + dev: true /type-fest/0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} @@ -46684,9 +47167,11 @@ packages: /type/1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false /type/2.6.0: resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==} + dev: false /typedarray-to-buffer/3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -47197,6 +47682,7 @@ packages: mime: 2.6.0 schema-utils: 2.7.1 webpack: 4.42.0 + dev: false /url-loader/4.1.1_f26uezmxiklaqqap5voqnq7ioy: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} @@ -47425,7 +47911,8 @@ packages: define-properties: 1.1.4 for-each: 0.3.3 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.4 + object.getownpropertydescriptors: 2.1.3 + dev: false /util/0.10.3: resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} @@ -47585,7 +48072,8 @@ packages: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 - extsprintf: 1.4.1 + extsprintf: 1.3.0 + dev: false /verror/1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} @@ -48129,6 +48617,7 @@ packages: domexception: 1.0.1 webidl-conversions: 4.0.2 xml-name-validator: 3.0.0 + dev: false /w3c-xmlserializer/2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} @@ -48553,6 +49042,7 @@ packages: range-parser: 1.2.1 webpack: 4.42.0 webpack-log: 2.0.0 + dev: false /webpack-dev-middleware/3.7.3_webpack@4.43.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} @@ -48644,6 +49134,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: false /webpack-dev-server/3.11.0_webpack@4.43.0: resolution: {integrity: sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==} @@ -48731,6 +49222,7 @@ packages: object.entries: 1.1.5 tapable: 1.1.3 webpack: 4.42.0 + dev: false /webpack-manifest-plugin/2.2.0_webpack@4.43.0: resolution: {integrity: sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==} @@ -48818,6 +49310,7 @@ packages: webpack-sources: 1.4.3 transitivePeerDependencies: - supports-color + dev: false /webpack/4.42.1: resolution: {integrity: sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==} @@ -49157,6 +49650,7 @@ packages: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 + dev: false /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -49327,11 +49821,13 @@ packages: resolution: {integrity: sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-broadcast-update/4.3.1: resolution: {integrity: sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-build/4.3.1: resolution: {integrity: sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==} @@ -49360,19 +49856,23 @@ packages: workbox-streams: 4.3.1 workbox-sw: 4.3.1 workbox-window: 4.3.1 + dev: false /workbox-cacheable-response/4.3.1: resolution: {integrity: sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-core/4.3.1: resolution: {integrity: sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==} + dev: false /workbox-expiration/4.3.1: resolution: {integrity: sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-google-analytics/4.3.1: resolution: {integrity: sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==} @@ -49381,39 +49881,47 @@ packages: workbox-core: 4.3.1 workbox-routing: 4.3.1 workbox-strategies: 4.3.1 + dev: false /workbox-navigation-preload/4.3.1: resolution: {integrity: sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-precaching/4.3.1: resolution: {integrity: sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-range-requests/4.3.1: resolution: {integrity: sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-routing/4.3.1: resolution: {integrity: sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-strategies/4.3.1: resolution: {integrity: sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-streams/4.3.1: resolution: {integrity: sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==} dependencies: workbox-core: 4.3.1 + dev: false /workbox-sw/4.3.1: resolution: {integrity: sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==} + dev: false /workbox-webpack-plugin/4.3.1_webpack@4.42.0: resolution: {integrity: sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==} @@ -49425,11 +49933,13 @@ packages: json-stable-stringify: 1.0.1 webpack: 4.42.0 workbox-build: 4.3.1 + dev: false /workbox-window/4.3.1: resolution: {integrity: sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==} dependencies: workbox-core: 4.3.1 + dev: false /worker-farm/1.7.0: resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} @@ -49510,6 +50020,7 @@ packages: graceful-fs: 4.2.10 imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: false /write-file-atomic/2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} @@ -49539,6 +50050,7 @@ packages: engines: {node: '>=4'} dependencies: mkdirp: 0.5.6 + dev: false /ws/1.1.5: resolution: {integrity: sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==} @@ -49581,6 +50093,7 @@ packages: optional: true dependencies: async-limiter: 1.0.1 + dev: false /ws/6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} @@ -49839,6 +50352,7 @@ packages: resolution: {integrity: sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==} dependencies: '@babel/runtime-corejs3': 7.17.9 + dev: false /xstate/4.32.0: resolution: {integrity: sha512-62gETqwnw4pBRe+tVWMt8hLgWEU8lq2qO8VN5PWmTELceRVt3I1bu1cwdraVRHUn4Bb2lnhNzn1A73oShuC+8g==} @@ -50088,6 +50602,7 @@ packages: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + dev: true /yazl/2.5.1: resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} From b9ec6a617b00f3031d39a4826e6d8446c0bd9d5b Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 11:14:12 +0200 Subject: [PATCH 22/83] feat/LIVE-2449-receive-flow-select-account-screen SelectAccount screen and AccountCard component changes reverted --- .../src/components/AccountCard.tsx | 17 +-- .../src/screens/SelectAccount.tsx | 116 ++++++++++-------- 2 files changed, 68 insertions(+), 65 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/AccountCard.tsx b/apps/ledger-live-mobile/src/components/AccountCard.tsx index b6b6462f44bd..1e78765efa61 100644 --- a/apps/ledger-live-mobile/src/components/AccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/AccountCard.tsx @@ -9,7 +9,7 @@ import { } from "@ledgerhq/live-common/lib/account/helpers"; import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex, Text } from "@ledgerhq/native-ui"; +import { Flex, Tag, Text } from "@ledgerhq/native-ui"; import { useTheme } from "styled-components/native"; import { TouchableOpacity } from "react-native-gesture-handler"; @@ -17,14 +17,6 @@ import Card, { Props as CardProps } from "./Card"; import CurrencyIcon from "./CurrencyIcon"; import CurrencyUnitValue from "./CurrencyUnitValue"; -const Tag = ({ children, ...props }: { children: string }) => ( - - - {children} - - -); - export type Props = CardProps & { account: Account; style?: any; @@ -62,8 +54,7 @@ const AccountCard = ({ > @@ -76,7 +67,7 @@ const AccountCard = ({ > {tag}} - + (); - const { t } = useTranslation(); - const allAccounts = useSelector(accountsSelector); - const currencyAccounts = useMemo(() => { + const accounts = useSelector(accountsSelector); + const enhancedAccounts = useMemo(() => { if (selectedCurrency) { - const filteredAccounts = allAccounts.filter( + const filteredAccounts = accounts.filter( acc => acc.currency.id === (selectedCurrency.type === "TokenCurrency" @@ -51,50 +68,45 @@ export default function SelectAccount({ navigation, route }: Props) { } return flattenAccounts(filteredAccounts); } - return flattenAccounts(allAccounts); - }, [allAccounts, selectedCurrency]); + return flattenAccounts(accounts); + }, [accounts, selectedCurrency]); + const allAccounts = notEmptyAccounts + ? enhancedAccounts.filter(account => !isAccountEmpty(account)) + : enhancedAccounts; - const keyExtractor = (item: Account) => item.id; - - const onSelectAccount = useCallback( + const handleSelectAccount = useCallback( account => { - navigation.navigate(ScreenName.ReceiveConnectDevice, { - account, - accountId: account.id, - parentId: account.type !== "Account" ? account.parentId : undefined, - }); - }, - [navigation], - ); + const balance = getAccountSpendableBalance(account); - const renderItem = ({ item }: { item: AccountLike }) => ( - onSelectAccount(item)} - /> + if (!isNaN(minBalance) && balance.lte(minBalance)) { + setError(new NotEnoughBalance()); + } else { + navigation.navigate(ScreenName.ReceiveConnectDevice, { + account, + accountId: account.id, + parentId: account.type !== "Account" ? account.parentId : undefined, + }); + } + }, + [minBalance, navigation], ); return ( - - - {t("")}Select account - - - {t("")}Your {selectedCurrency.ticker} will be deposited into this account. - - + + + + + + {error ? ( + setError(undefined)} + /> + ) : null} ); } From 534ce28cb941e54cd82b4f59fa178e4e25fe8619 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 11:25:28 +0200 Subject: [PATCH 23/83] feat/LIVE-2449-receive-flow-select-account-screen useless code removed and texts added to en locale --- apps/ledger-live-desktop/static/i18n/en/app.json | 4 ++++ .../src/components/ReceiveAccountCard.tsx | 8 ++++---- .../components/RootNavigator/NewReceiveFundsNavigator.tsx | 6 +----- .../src/screens/ReceiveSelectAccount.tsx | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json index c2c1d28c6dc3..7eba355a1735 100644 --- a/apps/ledger-live-desktop/static/i18n/en/app.json +++ b/apps/ledger-live-desktop/static/i18n/en/app.json @@ -1839,6 +1839,10 @@ "receive": { "title": "Receive", "successTitle": "Address shared securely", + "selectAccount": { + "title": "Select account", + "subtitle": "Your {{currencyTicker}} will be deposited into this account." + }, "steps": { "chooseAccount": { "title": "Account", diff --git a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx index bd246efeea20..d64959062121 100644 --- a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx @@ -45,10 +45,10 @@ const AccountCard = ({ const { colors } = useTheme(); const currency = getAccountCurrency(account); const unit = getAccountUnit(account); - const tag = - account.derivationMode !== undefined && - account.derivationMode !== null && - getTagDerivationMode(currency as CryptoCurrency, account.derivationMode); + const tag = getTagDerivationMode( + currency as CryptoCurrency, + account.derivationMode, + ); return ( diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index ad26eaed36d9..d41148b783cc 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -2,20 +2,16 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; -import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; +import { findCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; import ReceiveSelectCrypto from "../../screens/SelectCrypto"; import ReceiveSelectAccount from "../../screens/ReceiveSelectAccount"; import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; -import StepHeader from "../StepHeader"; - -import { findCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; export default function NewReceiveFundsNavigator() { - const { t } = useTranslation(); const { colors } = useTheme(); const stackNavigationConfig = useMemo( () => getStackNavigatorConfig(colors, true), diff --git a/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx index 45b3bbb348f2..27fc10ad023f 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx @@ -10,7 +10,7 @@ import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; import { Flex, Text } from "@ledgerhq/native-ui"; import { ScreenName } from "../const"; import { accountsSelector } from "../reducers/accounts"; -import AccountCard from "../components/AccountCard"; +import ReceiveAccountCard from "../components/ReceiveAccountCard"; import type { Account, AccountLike } from "@ledgerhq/live-common/lib/types/account"; type Props = { @@ -68,7 +68,7 @@ export default function SelectAccount({ navigation, route }: Props) { ); const renderItem = ({ item }: { item: AccountLike }) => ( - onSelectAccount(item)} /> @@ -77,7 +77,7 @@ export default function SelectAccount({ navigation, route }: Props) { return ( - {t("")}Select account + {t("receive.selectAccount.title")} - {t("")}Your {selectedCurrency.ticker} will be deposited into this account. + {t("receive.selectAccount.subtitle", { currencyTicker: selectedCurrency.ticker})} Date: Tue, 21 Jun 2022 11:26:40 +0200 Subject: [PATCH 24/83] feat/LIVE-2449-receive-flow-select-account-screen useless code removed and texts added to en locale --- apps/ledger-live-desktop/static/i18n/en/app.json | 4 ---- apps/ledger-live-mobile/src/locales/en/common.json | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json index 7eba355a1735..c2c1d28c6dc3 100644 --- a/apps/ledger-live-desktop/static/i18n/en/app.json +++ b/apps/ledger-live-desktop/static/i18n/en/app.json @@ -1839,10 +1839,6 @@ "receive": { "title": "Receive", "successTitle": "Address shared securely", - "selectAccount": { - "title": "Select account", - "subtitle": "Your {{currencyTicker}} will be deposited into this account." - }, "steps": { "chooseAccount": { "title": "Account", diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index 215068f8b719..4b2d4283f2d7 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2157,6 +2157,10 @@ "shareAddress": "Share address", "addressCopied": "Address copied!", "taprootWarning": "Make sure the sender supports taproot", + "selectAccount": { + "title": "Select account", + "subtitle": "Your {{currencyTicker}} will be deposited into this account." + }, "notSynced": { "text": "Synchronizing", "desc": "This may take a moment if you have many transactions or if you have a slow internet connection." From a8142dc0b708f2c4aeb6c534ad2fb86ffc50b579 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Tue, 21 Jun 2022 13:40:18 +0200 Subject: [PATCH 25/83] feat/LIVE-2451-receive-flow-receive-screen typescript confirmation screen added --- .../screens/ReceiveFunds/03-Confirmation.tsx | 466 ++++++++++++++++++ .../src/screens/ReceiveSelectAccount.tsx | 4 +- 2 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx new file mode 100644 index 000000000000..8e46910190dd --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -0,0 +1,466 @@ +// @flow + +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { of } from "rxjs"; +import { delay } from "rxjs/operators"; +import { View, StyleSheet, Platform } from "react-native"; +import { useSelector } from "react-redux"; +import QRCode from "react-native-qrcode-svg"; +import { Trans } from "react-i18next"; +import ReactNativeModal from "react-native-modal"; +import type { + Account, + TokenAccount, + AccountLike, +} from "@ledgerhq/live-common/lib/types"; +import { + getMainAccount, + getAccountCurrency, + getAccountName, +} from "@ledgerhq/live-common/lib/account"; +import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; +import type { DeviceModelId } from "@ledgerhq/devices"; +import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; +import { useTheme } from "@react-navigation/native"; +import getWindowDimensions from "../../logic/getWindowDimensions"; +import { accountScreenSelector } from "../../reducers/accounts"; +import { TrackScreen } from "../../analytics"; +import PreventNativeBack from "../../components/PreventNativeBack"; +import LText from "../../components/LText/index"; +import DisplayAddress from "../../components/DisplayAddress"; +import Alert from "../../components/Alert"; +import BottomModal from "../../components/BottomModal"; +import QRcodeZoom from "../../icons/QRcodeZoom"; +import Touchable from "../../components/Touchable"; +import Button from "../../components/Button"; +import CurrencyIcon from "../../components/CurrencyIcon"; +import CopyLink from "../../components/CopyLink"; +import ShareLink from "../../components/ShareLink"; +import NavigationScrollView from "../../components/NavigationScrollView"; +import { urls } from "../../config/urls"; +import { readOnlyModeEnabledSelector } from "../../reducers/settings"; +import SkipLock from "../../components/behaviour/SkipLock"; +import logger from "../../logger"; +import { rejectionOp } from "../../logic/debugReject"; +import GenericErrorView from "../../components/GenericErrorView"; + +type Props = { + account?: (TokenAccount | Account), + parentAccount?: Account, + navigation: any, + route: { params: RouteParams }, + readOnlyModeEnabled: boolean, +}; + +type RouteParams = { + account?: AccountLike, + accountId: string, + modelId: DeviceModelId, + wired: boolean, + device?: Device, + onSuccess?: (address?: string) => void, + onError?: () => void, +}; + +export default function ReceiveConfirmation({ navigation, route }: Props) { + const { colors, dark } = useTheme(); + const { account, parentAccount } = useSelector(accountScreenSelector(route)); + const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector); + + const [verified, setVerified] = useState(false); + const [isModalOpened, setIsModalOpened] = useState(false); + const onModalHide = useRef(() => {}); + const [error, setError] = useState(null); + const [zoom, setZoom] = useState(false); + const [allowNavigation, setAllowNavigation] = useState(true); + const sub = useRef(); + + const { onSuccess, onError } = route.params; + + const verifyOnDevice = useCallback( + async (device: Device): Promise => { + if (!account) return; + const mainAccount = getMainAccount(account, parentAccount); + + sub.current = (mainAccount.id.startsWith("mock") + ? of({}).pipe(delay(1000), rejectionOp()) + : getAccountBridge(mainAccount).receive(mainAccount, { + deviceId: device.deviceId, + verify: true, + }) + ).subscribe({ + complete: () => { + setVerified(true); + setAllowNavigation(true); + onSuccess && onSuccess(mainAccount.freshAddress); + }, + error: error => { + if (error && error.name !== "UserRefusedAddress") { + logger.critical(error); + } + setError(error); + setIsModalOpened(true); + setAllowNavigation(true); + onError && onError(); + }, + }); + }, + [account, onError, onSuccess, parentAccount], + ); + + function onRetry(): void { + if (isModalOpened) { + setIsModalOpened(false); + onModalHide.current = navigation.goBack; + } else { + navigation.goBack(); + } + } + + function onModalClose(): void { + setIsModalOpened(false); + onModalHide.current = onDone; + } + + function onZoom(): void { + setZoom(!zoom); + } + + function onDone(): void { + const n = navigation.getParent(); + if (n) { + n.pop(); + } + } + + useEffect(() => { + if (!allowNavigation) { + navigation.setOptions({ + headerLeft: null, + headerRight: () => null, + gestureEnabled: false, + }); + } + }, [allowNavigation, colors, navigation]); + + useEffect(() => { + const device = route.params.device; + + if (device && !verified) { + verifyOnDevice(device); + } + setAllowNavigation(true); + }, [route.params, verified, verifyOnDevice]); + + if (!account) return null; + const { width } = getWindowDimensions(); + const unsafe = !route.params.device?.deviceId; + const QRSize = Math.round(width / 1.8 - 16); + const mainAccount = getMainAccount(account, parentAccount); + const currency = getAccountCurrency(account); + + return ( + + + {allowNavigation ? null : ( + <> + + + + )} + + + + {width < 350 ? ( + + + + + + ) : ( + + + + + + + + + )} + + + + + + + + + + {getAccountName(account)} + + + + + + {mainAccount.derivationMode === "taproot" ? ( + + + + + + ) : null} + + + } + > + + + + + + + + + + + {unsafe ? ( + + + + ) : verified ? ( + + + + ) : ( + + + + )} + + + {verified && ( + + + {isToastDisplayed ? ( + - + + +); + +export default AdditionalInfoModal; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx new file mode 100644 index 000000000000..8b74166bdc65 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx @@ -0,0 +1,94 @@ +import React, { useCallback, useState } from "react"; +import { TouchableOpacity } from "react-native"; +import { Trans } from "react-i18next"; +import styled from "styled-components/native"; +import { Flex, Text, Button, Checkbox } from "@ledgerhq/native-ui"; + +type Props = { + closeModal: Function; + setStep: Function; + setShouldNotRemindUserAgain: Function; +}; + +const ConfirmUnverified = ({ + closeModal, + setStep, + setShouldNotRemindUserAgain, +}: Props) => { + const [doNotRemindUserAgain, setDoNotRemindUserAgain] = useState(false); + const toggleDoNotRemindUserAgain = useCallback(() => { + setDoNotRemindUserAgain(!doNotRemindUserAgain); + }, [doNotRemindUserAgain]); + + const onGoBack = useCallback(() => { + setStep("initMessage"); + }, [setStep]); + const onCloseModal = useCallback(() => { + closeModal(); + if (doNotRemindUserAgain) { + setShouldNotRemindUserAgain(); + } + }, [closeModal, doNotRemindUserAgain, setShouldNotRemindUserAgain]); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default ConfirmUnverified; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx new file mode 100644 index 000000000000..9b37aa42b05a --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx @@ -0,0 +1,64 @@ +import React, { useCallback } from "react"; +import { TouchableOpacity } from "react-native"; +import { Trans } from "react-i18next"; +import styled from "styled-components/native"; +import { Flex, Text, Button } from "@ledgerhq/native-ui"; + +const NotNowButton = styled(TouchableOpacity)` + align-items: center; + justify-content: center; + margin-top: 32px; +`; + +type Props = { + setStep: Function; + onVerifyAddress: Function; +}; + +const InitMessage = ({ setStep, onVerifyAddress }: Props) => { + const onDontVerify = useCallback(() => { + setStep("confirmUnverified"); + }, [setStep]); + + return ( + + + + + + + + + + + + + + + + + + + + ); +}; + +export default InitMessage; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx new file mode 100644 index 000000000000..141fb042ad2e --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx @@ -0,0 +1,101 @@ +import React, { useCallback, useEffect, useState, useMemo } from "react"; +import { BottomDrawer } from "@ledgerhq/native-ui"; +import Animated, { + useSharedValue, + useAnimatedStyle, + withTiming, +} from "react-native-reanimated"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import InitMessage from "./InitMessage"; +import ConfirmUnverified from "./ConfirmUnverified"; + +const shouldNotRemindUserAgainToVerifyAddressOnReceive = + "shouldNotRemindUserAgainToVerifyAddressOnReceive"; + +const ReceiveSecurityModal = ({ + onVerifyAddress, +}: { + onVerifyAddress: Function; +}) => { + const [isModalOpen, setIsModalOpen] = useState(false); + + async function getShouldNotRemindUserAgain() { + const shouldNotRemindUserAgain = await AsyncStorage.getItem( + shouldNotRemindUserAgainToVerifyAddressOnReceive, + ); + return shouldNotRemindUserAgain + ? JSON.parse(shouldNotRemindUserAgain) + : false; + } + + async function setShouldNotRemindUserAgain() { + await AsyncStorage.setItem( + shouldNotRemindUserAgainToVerifyAddressOnReceive, + JSON.stringify(true), + ); + } + + useEffect(() => { + getShouldNotRemindUserAgain().then(shouldNotRemindUserAgain => { + if (!shouldNotRemindUserAgain || true) { + setTimeout(() => { + setIsModalOpen(true); + }, 800); + } + }); + }, []); + + const [step, setStep] = useState("initMessage"); + const sharedHeight = useSharedValue(0); + const onLayout = useCallback(({ nativeEvent: { layout } }) => { + sharedHeight.value = withTiming(layout.height, { duration: 200 }); + }, []); + + const animatedStyle = useAnimatedStyle( + () => ({ + height: sharedHeight.value, + }), + [], + ); + + const closeModal = useCallback(() => { + setIsModalOpen(false); + setStep("initMessage"); + sharedHeight.value = 0; + }, [setIsModalOpen, sharedHeight]); + + const onVerify = useCallback(() => { + closeModal(); + onVerifyAddress(); + }, [closeModal, onVerifyAddress]); + + const component = useMemo(() => { + const components = { + initMessage: , + confirmUnverified: ( + + ), + }; + + return components[step]; + }, [closeModal, onVerify, step]); + + return ( + + + {component} + + + ); +}; + +export default ReceiveSecurityModal; From 4b6b96d8ca300cfa3e765b9e67882b759ec14dc3 Mon Sep 17 00:00:00 2001 From: Come Grellard Date: Thu, 23 Jun 2022 17:17:59 +0200 Subject: [PATCH 27/83] feat/LIVE-2451-receive-flow-receive-screen some text added to the toast on the receive screen --- apps/ledger-live-mobile/src/locales/en/common.json | 3 ++- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 7 +++++-- .../src/screens/ReceiveFunds/AdditionalInfoModal.tsx | 2 +- .../screens/ReceiveFunds/ReceiveSecurityModal/index.tsx | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index 588ec54c4638..d71981fb1014 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2183,7 +2183,8 @@ "yes": "Yes" }, "toastMessages": { - "accountImported": "We've imported a {{currencyTicker}} account for you." + "accountImported": "We've imported a {{currencyTicker}} account for you. ", + "why": "Tell me why." }, "additionalInfoModal": { "title": "Why we imported an account?", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index d8366c057940..4963e317c4d4 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -257,14 +257,14 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { - {isToastDisplayed ? ( {t("transfer.receive.toastMessages.accountImported", { currencyTicker: currency.ticker })} + + {t("transfer.receive.toastMessages.why")} + diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx index 4ef4099bf8e5..eb12c4001ed7 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx @@ -32,7 +32,7 @@ const AdditionalInfoModal = ({ values={{ currencyTicker }} /> - + diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx index 141fb042ad2e..85db6f9b3a6e 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/index.tsx @@ -37,7 +37,7 @@ const ReceiveSecurityModal = ({ useEffect(() => { getShouldNotRemindUserAgain().then(shouldNotRemindUserAgain => { - if (!shouldNotRemindUserAgain || true) { + if (!shouldNotRemindUserAgain) { setTimeout(() => { setIsModalOpen(true); }, 800); From 2a040def72930b42373bd2e3a1fbcaf4f45c4180 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Sat, 25 Jun 2022 16:45:42 +0200 Subject: [PATCH 28/83] LLM - New receive flow functional draft --- .../src/components/CurrencyRow.js | 88 ---- .../src/components/CurrencyRow.tsx | 74 +++ .../NewReceiveFundsNavigator.tsx | 30 +- .../src/components/TabBar/TransferButton.tsx | 4 +- .../src/components/TabBar/TransferDrawer.tsx | 4 +- .../src/const/navigation.js | 4 + .../src/locales/en/common.json | 11 +- .../screens/ReceiveFunds/01-SelectAccount.tsx | 93 ---- .../screens/ReceiveFunds/01-SelectCrypto.tsx | 145 ++++++ .../screens/ReceiveFunds/02-AddAccount.tsx | 289 +++++++++++ .../02-AddAccountSelectDevice.tsx | 121 +++++ .../screens/ReceiveFunds/02-SelectAccount.tsx | 89 ++++ .../screens/ReceiveFunds/03-Confirmation.js | 476 ------------------ .../screens/ReceiveFunds/03-Confirmation.tsx | 56 ++- .../src/screens/ReceiveSelectAccount.tsx | 100 ---- .../src/screens/SelectCrypto.tsx | 25 - pnpm-lock.yaml | 65 +-- 17 files changed, 835 insertions(+), 839 deletions(-) delete mode 100644 apps/ledger-live-mobile/src/components/CurrencyRow.js create mode 100644 apps/ledger-live-mobile/src/components/CurrencyRow.tsx delete mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx delete mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js delete mode 100644 apps/ledger-live-mobile/src/screens/ReceiveSelectAccount.tsx delete mode 100644 apps/ledger-live-mobile/src/screens/SelectCrypto.tsx diff --git a/apps/ledger-live-mobile/src/components/CurrencyRow.js b/apps/ledger-live-mobile/src/components/CurrencyRow.js deleted file mode 100644 index c90643fb23af..000000000000 --- a/apps/ledger-live-mobile/src/components/CurrencyRow.js +++ /dev/null @@ -1,88 +0,0 @@ -// @flow - -import { StyleSheet } from "react-native"; -import React, { PureComponent } from "react"; -import { RectButton } from "react-native-gesture-handler"; -import type { - CryptoCurrency, - TokenCurrency, -} from "@ledgerhq/live-common/lib/types"; - -import LText from "./LText"; -import CircleCurrencyIcon from "./CircleCurrencyIcon"; -import { withTheme } from "../colors"; - -type Props = { - currency: CryptoCurrency | TokenCurrency, - onPress: (CryptoCurrency | TokenCurrency) => void, - isOK?: boolean, - style?: *, - colors: *, - iconSize?: number, -}; - -class CurrencyRow extends PureComponent { - onPress = () => { - this.props.onPress(this.props.currency); - }; - - render() { - const { currency, style, isOK = true, colors, iconSize = 26 } = this.props; - - return ( - - - - {`${currency.name} (${currency.ticker})`} - - {currency.type === "TokenCurrency" && currency.parentCurrency ? ( - - {currency.parentCurrency.name} - - ) : null} - - ); - } -} - -const styles = StyleSheet.create({ - root: { - flexDirection: "row", - alignItems: "center", - padding: 16, - }, - name: { - flexGrow: 1, - flexShrink: 1, - marginLeft: 10, - fontSize: 14, - }, - currencyLabel: { - flexGrow: 0, - flexShrink: 0, - flexBasis: "auto", - textAlign: "right", - borderRadius: 4, - borderWidth: 1, - paddingHorizontal: 6, - fontSize: 10, - height: 24, - lineHeight: 24, - marginLeft: 12, - }, -}); - -export default withTheme(CurrencyRow); diff --git a/apps/ledger-live-mobile/src/components/CurrencyRow.tsx b/apps/ledger-live-mobile/src/components/CurrencyRow.tsx new file mode 100644 index 000000000000..961e4081de71 --- /dev/null +++ b/apps/ledger-live-mobile/src/components/CurrencyRow.tsx @@ -0,0 +1,74 @@ +// @flow +import React, { PureComponent } from "react"; +import { RectButton } from "react-native-gesture-handler"; +import type { + CryptoCurrency, + TokenCurrency, +} from "@ledgerhq/live-common/lib/types"; + +import LText from "./LText"; +import CircleCurrencyIcon from "./CircleCurrencyIcon"; +import styled from "styled-components/native"; +import {Flex, Tag} from "@ledgerhq/native-ui"; + +const StyledRectButton = styled(RectButton)` + flex-direction: row; + align-items: center; + padding: 16px; +` + +type Props = { + currency: CryptoCurrency | TokenCurrency, + onPress: (currency: CryptoCurrency | TokenCurrency) => void, + isOK?: boolean, + style?: any, + colors: any, + iconSize?: number, +}; + +class CurrencyRow extends PureComponent { + onPress = () => { + this.props.onPress(this.props.currency); + }; + + render() { + const { currency, style, isOK = true, colors, iconSize = 32 } = this.props; + + return ( + + + + + {currency.name} + + + {currency.ticker} + + + {currency.type === "TokenCurrency" && currency.parentCurrency ? ( + + {currency.parentCurrency.name} + + ) : null} + + ); + } +} + +export default CurrencyRow; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index d41148b783cc..a455c6bfb372 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -3,12 +3,15 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; import { useTheme } from "styled-components/native"; -import { findCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; -import ReceiveSelectCrypto from "../../screens/SelectCrypto"; -import ReceiveSelectAccount from "../../screens/ReceiveSelectAccount"; +import ReceiveSelectCrypto from "../../screens/ReceiveFunds/01-SelectCrypto"; + +import ReceiveAddAccountSelectDevice from "../../screens/ReceiveFunds/02-AddAccountSelectDevice"; +import ReceiveSelectAccount from "../../screens/ReceiveFunds/02-SelectAccount"; +import ReceiveAddAccount from "../../screens/ReceiveFunds/02-AddAccount"; + import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; export default function NewReceiveFundsNavigator() { @@ -33,6 +36,7 @@ export default function NewReceiveFundsNavigator() { headerTitle: "", }} /> + {/* Select Account */} + + {/* Select Account */} + + + {/* Select Account */} + + {/* Select / Connect Device */} diff --git a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx index eca8a32b581c..9d4e3273f4a7 100644 --- a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx +++ b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx @@ -58,9 +58,7 @@ export default function TransferDrawer({ onClose }: ModalProps) { ); const onReceiveFunds = useCallback( () => - onNavigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveSelectAccount, - }), + onNavigate(NavigatorName.ReceiveFunds), [onNavigate], ); const onSwap = useCallback( diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 9d9090ead33d..566b0273ebb9 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -101,10 +101,14 @@ export const ScreenName = { PortfolioOperationHistory: "PortfolioOperationHistory", PurchaseDevice: "PurchaseDevice", RateProviderSettings: "RateProviderSettings", + ReceiveConfirmation: "ReceiveConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", ReceiveSelectCrypto: "ReceiveSelectCrypto", ReceiveSelectAccount: "ReceiveSelectAccount", + ReceiveAddAccountSelectDevice: "ReceiveAddAccountSelectDevice", + ReceiveAddAccount: "ReceiveAddAccount", + RegionSettings: "RegionSettings", RepairDevice: "RepairDevice", Resources: "Resources", diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index d71981fb1014..36eed4690593 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2157,10 +2157,19 @@ "shareAddress": "Share address", "addressCopied": "Copied", "taprootWarning": "Make sure the sender supports taproot", + "selectCrypto": { + "title": "Select a crypto" + }, "selectAccount": { - "title": "Select account", + "title": "Select an account", "subtitle": "Your {{currencyTicker}} will be deposited into this account." }, + "addAccount": { + "title": "Blockchain synchronization", + "subtitle": "We are verifying if you already have an {{currencyTicker}} account on blockchain.", + "foundAccounts": "{{count}} accounts found", + "stopSynchronization": "Stop synchronization" + }, "receiveConfirmation": { "title": "Receive {{currencyTicker}}", "addressVerified": "Address verified", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx deleted file mode 100644 index 3d589bd10533..000000000000 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectAccount.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useCallback, useMemo } from "react"; -import SafeAreaView from "react-native-safe-area-view"; -import { useSelector } from "react-redux"; -import { useTheme } from "styled-components/native"; -import { - accountWithMandatoryTokens, - flattenAccounts, -} from "@ledgerhq/live-common/lib/account/helpers"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex } from "@ledgerhq/native-ui"; - -import { accountsSelector } from "../../reducers/accounts"; -import { ScreenName } from "../../const"; -import { TrackScreen } from "../../analytics"; -import KeyboardView from "../../components/KeyboardView"; -import AccountSelector from "../../components/AccountSelector"; - -const forceInset = { bottom: "always" }; - -type Props = { - navigation: any; - route: { - params?: { - currency?: string; - selectedCurrency?: CryptoCurrency | TokenCurrency; - }; - }; -}; - -export default function ReceiveFunds({ navigation, route }: Props) { - const { colors } = useTheme(); - const { selectedCurrency, currency: initialCurrencySelected } = - route.params || {}; - - const accounts = useSelector(accountsSelector); - const enhancedAccounts = useMemo(() => { - if (selectedCurrency) { - const filteredAccounts = accounts.filter( - acc => - acc.currency.id === - (selectedCurrency.type === "TokenCurrency" - ? selectedCurrency.parentCurrency.id - : selectedCurrency.id), - ); - if (selectedCurrency.type === "TokenCurrency") { - // add in the token subAccount if it does not exist - return flattenAccounts( - filteredAccounts.map(acc => - accountWithMandatoryTokens(acc, [selectedCurrency]), - ), - ).filter( - acc => - acc.type === "Account" || - (acc.type === "TokenAccount" && - acc.token.id === selectedCurrency.id), - ); - } - return flattenAccounts(filteredAccounts); - } - return flattenAccounts(accounts); - }, [accounts, selectedCurrency]); - const allAccounts = enhancedAccounts; - - const handleSelectAccount = useCallback( - account => { - navigation.navigate(ScreenName.ReceiveConnectDevice, { - account, - accountId: account.id, - parentId: account.type !== "Account" ? account.parentId : undefined, - }); - }, - [navigation], - ); - - return ( - - - - - - - - - ); -} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx new file mode 100644 index 000000000000..8e16085cd674 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -0,0 +1,145 @@ +// @flow +import React, { useCallback, useMemo } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { StyleSheet, FlatList } from "react-native"; +import type { + CryptoCurrency, + TokenCurrency, +} from "@ledgerhq/live-common/lib/types"; +import { + isCurrencySupported, + listTokens, + useCurrenciesByMarketcap, + listSupportedCurrencies, +} from "@ledgerhq/live-common/lib/currencies"; + +import {Flex } from "@ledgerhq/native-ui"; +import { useSelector } from "react-redux"; +import { Account, TokenAccount } from "@ledgerhq/live-common/src/types"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import FilteredSearchBar from "../../components/FilteredSearchBar"; +import CurrencyRow from "../../components/CurrencyRow"; +import LText from "../../components/LText"; +import { flattenAccountsSelector } from "../../reducers/accounts"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; + +const SEARCH_KEYS = ["name", "ticker"]; + +type Props = { + devMode: boolean, + navigation: any, + route: { params: { filterCurrencyIds?: string[] } }, +}; + +const keyExtractor = (currency: CryptoCurrency | TokenCurrency) => currency.id; + +const renderEmptyList = () => ( + + + + + +); + +const listSupportedTokens = () => + listTokens().filter(t => isCurrencySupported(t.parentCurrency)); + +const findAccountByCurrency = (accounts: (TokenAccount | Account)[], currency: CryptoCurrency | TokenCurrency) => accounts.filter((acc: TokenAccount | Account) => + (acc.type === "Account" ? acc.currency?.id : acc.token.id) === currency.id + ) + +export default function AddAccountsSelectCrypto({ navigation, route }: Props) { + const {t } = useTranslation(); + const { filterCurrencyIds = [] } = route.params || {}; + const cryptoCurrencies = useMemo( + () => + listSupportedCurrencies() + .concat(listSupportedTokens()) + .filter( + ({ id }) => + filterCurrencyIds.length <= 0 || filterCurrencyIds.includes(id), + ), + [filterCurrencyIds], + ); + + const accounts = useSelector(flattenAccountsSelector); + + const sortedCryptoCurrencies = useCurrenciesByMarketcap(cryptoCurrencies); + + const onPressItem = useCallback((currency: CryptoCurrency | TokenCurrency) => { + + const accs = findAccountByCurrency(accounts, currency); + if(accs.length > 1) { + navigation.navigate(ScreenName.ReceiveSelectAccount, { + currency + }); + } else if(accs.length === 1) { + navigation.navigate(ScreenName.ReceiveConfirmation, { + accountId: accs[0].id, + parentId: accs[0]?.parentId, + }); + } else if (currency.type === "TokenCurrency") { + const parentAccounts = findAccountByCurrency(accounts, currency.parentCurrency); + if (parentAccounts.length > 1) { + navigation.navigate(ScreenName.ReceiveSelectAccount, { + currency, + createTokenAccount: true + }); + } else if (parentAccounts.length === 1) { + navigation.navigate(ScreenName.ReceiveConfirmation, { + accountId: parentAccounts[0].id, + currency, + createTokenAccount: true + }); + } else { + navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { + currency: currency.parentCurrency, + createTokenAccount: true + }); + } + } else { + navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { + currency, + }); + } + + }, [accounts, navigation]); + + const renderList = useCallback((items: any) => ( + ( + + )} + keyExtractor={keyExtractor} + showsVerticalScrollIndicator={false} + keyboardDismissMode="on-drag" + /> + ), [onPressItem]); + + return ( + <> + + {t("transfer.receive.selectCrypto.title")} + + + ); +} + +const styles = StyleSheet.create({ + list: { + paddingBottom: 32, + }, + filteredSearchInputWrapperStyle: { + marginHorizontal: 16, + marginBottom: 16 + }, +}); diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx new file mode 100644 index 000000000000..deead71204ae --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -0,0 +1,289 @@ +import React, { + PureComponent, + useEffect, + useCallback, + useState, + useRef, + memo, + useMemo, +} from "react"; +import { StyleSheet, SafeAreaView, FlatList } from "react-native"; +import { concat, from } from "rxjs"; +import { ignoreElements } from "rxjs/operators"; +import { connect, useDispatch } from "react-redux"; +import { compose } from "redux"; +import { + isAccountEmpty, + groupAddAccounts, +} from "@ledgerhq/live-common/lib/account"; +import type { AddAccountSupportLink } from "@ledgerhq/live-common/lib/account/addAccounts"; +import { createStructuredSelector } from "reselect"; +import uniq from "lodash/uniq"; +import { Trans, useTranslation } from "react-i18next"; +import type { CryptoCurrency, Account, Currency, AccountLike } from "@ledgerhq/live-common/lib/types"; +import { getCurrencyBridge } from "@ledgerhq/live-common/lib/bridge"; +import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; + +import type { DerivationMode } from "@ledgerhq/live-common/lib/derivation"; + +import { useTheme } from "@react-navigation/native"; +import { Flex, InfiniteLoader } from "@ledgerhq/native-ui"; +import { replaceAccounts } from "../../actions/accounts"; +import { accountsSelector } from "../../reducers/accounts"; +import logger from "../../logger"; +import { withTheme } from "../../colors"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import Button from "../../components/Button"; +import PreventNativeBack from "../../components/PreventNativeBack"; +import SelectableAccountsList from "../../components/SelectableAccountsList"; +import LiveLogo from "../../icons/LiveLogoIcon"; +import IconPause from "../../icons/Pause"; +import ExternalLink from "../../icons/ExternalLink"; +import Chevron from "../../icons/Chevron"; +import Info from "../../icons/Info"; +import Spinning from "../../components/Spinning"; +import LText from "../../components/LText"; +import RetryButton from "../../components/RetryButton"; +import CancelButton from "../../components/CancelButton"; +import GenericErrorBottomModal from "../../components/GenericErrorBottomModal"; +import NavigationScrollView from "../../components/NavigationScrollView"; +import { prepareCurrency } from "../../bridge/cache"; +import { blacklistedTokenIdsSelector } from "../../reducers/settings"; +import BottomModal from "../../components/BottomModal"; +import { urls } from "../../config/urls"; +import AccountCard from "../../components/AccountCard"; + +type RouteParams = { + currency: CryptoCurrency, + device: Device, + onSuccess?: (params?: any) => void, +}; + +type OwnProps = {}; + +type Props = { + navigation: any; + route: { params: RouteParams }; + blacklistedTokenIds?: string[]; + colors: any; +}; + + + +function AddAccountsAccounts({ + navigation, + route, +}: Props) { + const { colors } = useTheme(); + const dispatch = useDispatch(); + + const [scanning, setScanning] = useState(true); + const [error, setError] = useState(null); + const [latestScannedAccount, setLatestScannedAccount] = useState(null); + const [scannedAccounts, setScannedAccounts] = useState([]); + const [cancelled, setCancelled] = useState(false); + + const scanSubscription = useRef(); + + const { + currency, + device: { deviceId }, + device + } = route.params || {}; + + useEffect(() => { + startSubscription(); + return () => stopSubscription(false); + }, []); + + const startSubscription = useCallback(() => { + const bridge = getCurrencyBridge(currency); + const syncConfig = { + paginationConfig: { + operation: 0, + }, + blacklistedTokenIds: [], + }; + // will be set to false if an existing account is found + + scanSubscription.current = concat( + from(prepareCurrency(currency)).pipe(ignoreElements()), + bridge.scanAccounts({ + currency, + deviceId, + syncConfig, + }), + ).subscribe({ + next: ({ account }) => { + setScannedAccounts((accs) => [...accs, account]) + }, + complete: () => setScanning(false), + error: error => { + logger.critical(error); + setError(error); + }, + }); + }, [currency, deviceId]); + + const restartSubscription = useCallback(() => { + setScanning(true); + setScannedAccounts([]); + setError(null); + setCancelled(false); + startSubscription(); + }, []); + + const stopSubscription = useCallback((syncUI?: boolean = true) => { + if (scanSubscription.current) { + scanSubscription.current.unsubscribe(); + scanSubscription.current = null; + if (syncUI) { + setScanning(false); + } + } + }, []); + + const onCancel = useCallback(() => { + setError(null); + setCancelled(true); + }, []); + + const onModalHide = useCallback(() => { + if (cancelled) { + navigation.getParent().pop(); + } + }, [cancelled, navigation]); + + const selectAccount = useCallback( + (account: Account) => { + dispatch(replaceAccounts({ scannedAccounts, selectedIds: [account.id], renamings: {}})); + navigation.navigate(ScreenName.ReceiveConfirmation, {...route.params, accountId: account.id }); + }, + [dispatch, navigation, route.params, scannedAccounts], + ); + + const renderItem = useCallback( + ({ item: account }: { item: Account }) => ( + + selectAccount(account)} /> + + ), + [selectAccount], + ); + + const keyExtractor = useCallback(item => item?.id, []); + + return ( + + + + {scanning ? : ( + + )} + + + + + } + /> + + ); +} + +function ScanLoading({ currency, scannedAccounts, stopSubscription }: {currency: Currency, scannedAccounts: Account[], stopSubscription: () => void}) { + const { t } = useTranslation(); + return ( + + + {t("transfer.receive.addAccount.title")} + {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} + { + scannedAccounts?.length > 0 ? <> + {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} + + : null } + + ); + } + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + paddingHorizontal: { + paddingHorizontal: 16, + }, + inner: { + paddingTop: 24, + }, + innerContent: { + paddingBottom: 24, + }, + descText: { + paddingHorizontal: 16, + marginBottom: 16, + textAlign: "center", + }, + scanLoadingRoot: { + flexDirection: "row", + marginHorizontal: 16, + marginBottom: 16, + alignItems: "center", + justifyContent: "center", + height: 40, + borderWidth: 1, + borderStyle: "dashed", + borderRadius: 4, + }, + scanLoadingText: { + fontSize: 14, + marginLeft: 8, + }, + footer: { + borderTopWidth: 1, + padding: 16, + }, + addAccountsError: { + marginHorizontal: 16, + marginBottom: 16, + }, + button: { + flex: 1, + marginHorizontal: 8, + }, + buttonRight: { + marginLeft: 8, + }, + smallMarginBottom: { marginBottom: 8 }, + moreAddressTypesContainer: { paddingHorizontal: 16, marginBottom: 32 }, + subtitle: { fontSize: 14 }, + title: { fontSize: 16 }, + modalTitle: { fontSize: 20 }, + modal: { paddingHorizontal: 24 }, + modalContainer: { + marginTop: 24, + marginBottom: 16, + alignItems: "center", + justifyContent: "center", + }, + modalRow: { marginVertical: 16 }, +}); + +export default AddAccountsAccounts; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx new file mode 100644 index 000000000000..abe82d72baca --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccountSelectDevice.tsx @@ -0,0 +1,121 @@ +// @flow + +import React, { useCallback, useEffect, useState } from "react"; +import { StyleSheet, SafeAreaView } from "react-native"; +import { useDispatch } from "react-redux"; +import type { CryptoCurrency } from "@ledgerhq/live-common/lib/types"; +import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; +import { createAction } from "@ledgerhq/live-common/lib/hw/actions/app"; +import connectApp from "@ledgerhq/live-common/lib/hw/connectApp"; +import { useTheme } from "@react-navigation/native"; +import { prepareCurrency } from "../../bridge/cache"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import SelectDevice from "../../components/SelectDevice"; +import NavigationScrollView from "../../components/NavigationScrollView"; +import DeviceActionModal from "../../components/DeviceActionModal"; +import SkipSelectDevice from "../SkipSelectDevice"; +import { setLastConnectedDevice } from "../../actions/settings"; + +type Props = { + navigation: any, + route: { params: RouteParams }, +}; + +type RouteParams = { + currency: CryptoCurrency, + inline?: boolean, + analyticsPropertyFlow?: string, +}; + +const action = createAction(connectApp); + +export default function AddAccountsSelectDevice({ navigation, route }: Props) { + const { colors } = useTheme(); + const [device, setDevice] = useState(); + const dispatch = useDispatch(); + + const onSetDevice = useCallback( + device => { + dispatch(setLastConnectedDevice(device)); + setDevice(device); + }, + [dispatch], + ); + + const onClose = useCallback(() => { + setDevice(); + }, []); + + const onResult = useCallback( + meta => { + setDevice(); + const { inline } = route.params; + const arg = { ...route.params, ...meta }; + if (inline) { + navigation.replace(ScreenName.ReceiveAddAccount, arg); + } else { + navigation.navigate(ScreenName.ReceiveAddAccount, arg); + } + }, + [navigation, route], + ); + + useEffect(() => { + // load ahead of time + prepareCurrency(route.params.currency); + }, [route.params.currency]); + + const currency = route.params.currency; + const analyticsPropertyFlow = route.params?.analyticsPropertyFlow; + return ( + + + + + + + setDevice()} + analyticsPropertyFlow={analyticsPropertyFlow || "add account"} + /> + + ); +} + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + scroll: { + flex: 1, + backgroundColor: "transparent", + }, + scrollContainer: { + padding: 16, + }, +}); diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx new file mode 100644 index 000000000000..002dd87ef905 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -0,0 +1,89 @@ +import React, { useCallback, useEffect } from "react"; +import { FlatList } from "react-native"; +import SafeAreaView from "react-native-safe-area-view"; +import { useSelector } from "react-redux"; + +import { Flex } from "@ledgerhq/native-ui"; +import styled from "styled-components/native"; +import { useTranslation } from "react-i18next"; +import { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; +import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; +import { ScreenName } from "../../const"; +import { TrackScreen } from "../../analytics"; +import AccountCard from "../../components/AccountCard"; +import LText from "../../components/LText"; + +const forceInset = { bottom: "always" }; + +const StyledSaferAreaView = styled(SafeAreaView)` + flex: 1; + background-color: ${p => p.theme.colors.background.main}; +`; + +type Props = { + navigation: any; + route: { params?: { currency?: Currency } }; +}; + +function ReceiveSelectAccount({ navigation, route }: Props) { + const currency = route.params?.currency; + const { t } = useTranslation(); + + const accounts = useSelector( + flattenAccountsByCryptoCurrencyScreenSelector(currency), + ); + + const selectAccount = useCallback( + (account: AccountLike) => { + navigation.navigate(ScreenName.ReceiveConfirmation, { + ...route.params, + accountId: account.id, + }); + }, + [navigation, route.params], + ); + + useEffect(() => { + if (accounts.length === 1) { + selectAccount(accounts[0]); + } else if (accounts.length <= 0) { + navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { + ...route.params, + currency, + }); + } + }, [accounts, currency, navigation, route.params, selectAccount]); + + const renderItem = useCallback( + ({ item: account }: { item: SearchResult }) => ( + + selectAccount(account)} /> + + ), + [selectAccount], + ); + + const keyExtractor = useCallback(item => item?.id, []); + + return accounts.length > 1 ? ( + + + + {t("transfer.receive.selectAccount.title")} + + + {t("transfer.receive.selectAccount.subtitle", { + currencyTicker: currency?.ticker, + })} + + + + ) : null; +} + +export default ReceiveSelectAccount; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js deleted file mode 100644 index 8c40959a86b8..000000000000 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.js +++ /dev/null @@ -1,476 +0,0 @@ -// @flow - -import React, { useCallback, useEffect, useRef, useState } from "react"; -import { of } from "rxjs"; -import { delay } from "rxjs/operators"; -import { View, StyleSheet, Platform } from "react-native"; -import { useSelector } from "react-redux"; -import QRCode from "react-native-qrcode-svg"; -import { Trans } from "react-i18next"; -import ReactNativeModal from "react-native-modal"; -import type { - Account, - TokenAccount, - AccountLike, -} from "@ledgerhq/live-common/lib/types"; -import { - getMainAccount, - getAccountCurrency, - getAccountName, -} from "@ledgerhq/live-common/lib/account"; -import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; -import type { DeviceModelId } from "@ledgerhq/devices"; -import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; -import { useTheme } from "@react-navigation/native"; -import getWindowDimensions from "../../logic/getWindowDimensions"; -import { accountScreenSelector } from "../../reducers/accounts"; -import { TrackScreen } from "../../analytics"; -import PreventNativeBack from "../../components/PreventNativeBack"; -import LText from "../../components/LText/index"; -import DisplayAddress from "../../components/DisplayAddress"; -import Alert from "../../components/Alert"; -import BottomModal from "../../components/BottomModal"; -import QRcodeZoom from "../../icons/QRcodeZoom"; -import Touchable from "../../components/Touchable"; -import Button from "../../components/Button"; -import CurrencyIcon from "../../components/CurrencyIcon"; -import CopyLink from "../../components/CopyLink"; -import ShareLink from "../../components/ShareLink"; -import NavigationScrollView from "../../components/NavigationScrollView"; -import { urls } from "../../config/urls"; -import { readOnlyModeEnabledSelector } from "../../reducers/settings"; -import SkipLock from "../../components/behaviour/SkipLock"; -import logger from "../../logger"; -import { rejectionOp } from "../../logic/debugReject"; -import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; -import GenericErrorView from "../../components/GenericErrorView"; - -type Props = { - account: ?(TokenAccount | Account), - parentAccount: ?Account, - navigation: any, - route: { params: RouteParams }, - readOnlyModeEnabled: boolean, -}; - -type RouteParams = { - account?: AccountLike, - accountId: string, - modelId: DeviceModelId, - wired: boolean, - device?: Device, - onSuccess?: (address?: string) => void, - onError?: () => void, -}; - -export default function ReceiveConfirmation({ navigation, route }: Props) { - const { colors, dark } = useTheme(); - const { account, parentAccount } = useSelector(accountScreenSelector(route)); - const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector); - - const [verified, setVerified] = useState(false); - const [isModalOpened, setIsModalOpened] = useState(false); - const onModalHide = useRef(() => {}); - const [error, setError] = useState(null); - const [zoom, setZoom] = useState(false); - const [allowNavigation, setAllowNavigation] = useState(true); - const sub = useRef(); - - const { onSuccess, onError } = route.params; - - const verifyOnDevice = useCallback( - async (device: Device): Promise => { - if (!account) return; - const mainAccount = getMainAccount(account, parentAccount); - - sub.current = (mainAccount.id.startsWith("mock") - ? // $FlowFixMe - of({}).pipe(delay(1000), rejectionOp()) - : getAccountBridge(mainAccount).receive(mainAccount, { - deviceId: device.deviceId, - verify: true, - }) - ).subscribe({ - complete: () => { - setVerified(true); - setAllowNavigation(true); - onSuccess && onSuccess(mainAccount.freshAddress); - }, - error: error => { - if (error && error.name !== "UserRefusedAddress") { - logger.critical(error); - } - setError(error); - setIsModalOpened(true); - setAllowNavigation(true); - onError && onError(); - }, - }); - }, - [account, onError, onSuccess, parentAccount], - ); - - function onRetry(): void { - if (isModalOpened) { - setIsModalOpened(false); - onModalHide.current = navigation.goBack; - } else { - navigation.goBack(); - } - } - - function onModalClose(): void { - setIsModalOpened(false); - onModalHide.current = onDone; - } - - function onZoom(): void { - setZoom(!zoom); - } - - function onDone(): void { - const n = navigation.getParent(); - if (n) { - n.pop(); - } - } - - useEffect(() => { - if (!allowNavigation) { - navigation.setOptions({ - headerLeft: null, - headerRight: () => null, - gestureEnabled: false, - }); - return; - } - - const { headerRight } = getStackNavigatorConfig(colors, true); - navigation.setOptions({ - headerLeft: null, - headerRight, - gestureEnabled: Platform.OS === "ios", - }); - }, [allowNavigation, colors, navigation]); - - useEffect(() => { - const device = route.params.device; - - if (device && !verified) { - verifyOnDevice(device); - } - setAllowNavigation(true); - }, [route.params, verified, verifyOnDevice]); - - if (!account) return null; - const { width } = getWindowDimensions(); - const unsafe = !route.params.device?.deviceId; - const QRSize = Math.round(width / 1.8 - 16); - const mainAccount = getMainAccount(account, parentAccount); - const currency = getAccountCurrency(account); - - return ( - - - {allowNavigation ? null : ( - <> - - - - )} - - - - {width < 350 ? ( - - - - - - ) : ( - - - - - - - - - )} - - - - - - - - - - {getAccountName(account)} - - - - - - {mainAccount.derivationMode === "taproot" ? ( - - - - - - ) : null} - - - } - > - - - - - - - - - - - {unsafe ? ( - - - - ) : verified ? ( - - - - ) : ( - - - - )} - - - {verified && ( - - - - ); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 389118c67ce9..e6413b46e305 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3298,6 +3298,7 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.21.0 semver: 6.3.0 + dev: false /@babel/helper-create-class-features-plugin/7.17.9: resolution: {integrity: sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==} @@ -3450,7 +3451,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false /@babel/helper-environment-visitor/7.16.7: resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} @@ -3704,7 +3704,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.18.5 dev: false /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.10: @@ -3732,6 +3732,7 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.5 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.9.0: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} @@ -3782,7 +3783,6 @@ packages: '@babel/helper-plugin-utils': 7.17.12 transitivePeerDependencies: - supports-color - dev: false /@babel/plugin-proposal-class-properties/7.8.3_@babel+core@7.9.0: resolution: {integrity: sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==} @@ -3871,6 +3871,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.5 + dev: false /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} @@ -3921,7 +3922,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.9.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.5 dev: false /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.10: @@ -3943,6 +3944,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.5 + dev: false /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} @@ -3973,7 +3975,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.9.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.5 dev: false /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.10: @@ -4036,6 +4038,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.5 + dev: false /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} @@ -4257,6 +4260,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} @@ -4327,7 +4331,6 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - dev: false /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.10: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -4364,7 +4367,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.17.10: @@ -4452,7 +4455,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-syntax-import-meta/7.10.4: @@ -4567,7 +4570,6 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 - dev: false /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.10: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -5051,6 +5053,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} @@ -5080,6 +5083,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} @@ -5295,6 +5299,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} @@ -5382,6 +5387,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.9.0: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} @@ -5422,6 +5428,7 @@ packages: '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - supports-color + dev: false /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} @@ -5453,6 +5460,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.18.5 + dev: false /@babel/plugin-transform-named-capturing-groups-regex/7.17.10_@babel+core@7.9.0: resolution: {integrity: sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==} @@ -5481,6 +5489,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} @@ -5619,7 +5628,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.9.0 + '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 dev: false @@ -5678,6 +5687,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.18.5 + dev: false /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} @@ -5714,7 +5724,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-transform-react-jsx-source/7.16.7_@babel+core@7.17.10: @@ -5742,7 +5752,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.17.12 dev: false /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.10: @@ -5852,6 +5862,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} @@ -6039,6 +6050,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.9.0: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} @@ -6421,6 +6433,7 @@ packages: '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.18.5 '@babel/types': 7.17.10 esutils: 2.0.3 + dev: false /@babel/preset-modules/0.1.5_@babel+core@7.9.0: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} @@ -6459,10 +6472,10 @@ packages: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.16.7 '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.9.0 - '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.9.0 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.18.5 + '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.18.5 dev: false /@babel/preset-react/7.9.1_@babel+core@7.9.0: @@ -19719,14 +19732,6 @@ packages: resolution: {integrity: sha1-2edrEXM+CFacCEeuezmyhgswt0U=} dev: false - /arr-diff/2.0.0: - resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - dev: true - optional: true - /arr-diff/4.0.0: resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} engines: {node: '>=0.10.0'} @@ -20182,6 +20187,7 @@ packages: transitivePeerDependencies: - metro - supports-color + dev: false /babel-jest/24.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} @@ -20576,7 +20582,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.10: resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} @@ -20611,7 +20616,6 @@ packages: core-js-compat: 3.22.5 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.17.10: resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} @@ -20632,7 +20636,6 @@ packages: '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 transitivePeerDependencies: - supports-color - dev: false /babel-plugin-react-docgen/4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} @@ -20828,6 +20831,7 @@ packages: '@babel/core': 7.18.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.5 babel-plugin-jest-hoist: 24.9.0 + dev: false /babel-preset-jest/24.9.0_@babel+core@7.9.0: resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} @@ -21948,7 +21952,7 @@ packages: mkdirp: 0.5.6 move-concurrently: 1.0.1 p-map: 3.0.0 - promise-inflight: 1.0.1_bluebird@3.7.2 + promise-inflight: 1.0.1 rimraf: 2.7.1 ssri: 7.1.1 unique-filename: 1.1.1 @@ -28297,6 +28301,8 @@ packages: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} requiresBuild: true + dev: true + optional: true /eyes/0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} @@ -28938,6 +28944,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: for-in: 1.0.2 + dev: false /for-own/1.0.0: resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} @@ -40663,7 +40670,6 @@ packages: peerDependenciesMeta: bluebird: optional: true - dev: true /promise-inflight/1.0.1_bluebird@3.7.2: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} @@ -44446,6 +44452,7 @@ packages: /slash/1.0.0: resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} engines: {node: '>=0.10.0'} + dev: false /slash/2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} From 858898d63b3d70dc0be4cefbeaba5770c389660b Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Sun, 26 Jun 2022 16:25:25 +0200 Subject: [PATCH 29/83] LLM - New Receive Flow - full flow complete --- .changeset/warm-months-attend.md | 5 + .../NewReceiveFundsNavigator.tsx | 34 +++- apps/ledger-live-mobile/src/config/urls.tsx | 2 + .../src/const/navigation.js | 1 + .../src/images/illustration/Dark/_080.png | Bin 0 -> 11610 bytes .../src/images/illustration/Light/_080.png | Bin 0 -> 17945 bytes .../src/locales/en/common.json | 16 +- .../screens/ReceiveFunds/01-SelectCrypto.tsx | 2 + .../screens/ReceiveFunds/02-AddAccount.tsx | 29 ++- .../screens/ReceiveFunds/02-SelectAccount.tsx | 90 +++++---- .../screens/ReceiveFunds/03-Confirmation.tsx | 189 ++++------------- ...ConnectDevice.js => 03a-ConnectDevice.tsx} | 24 +-- .../ReceiveFunds/03b-VerifyAddress.tsx | 191 ++++++++++++++++++ .../components/message/Notification/index.tsx | 71 +++++-- .../Notification/Notification.stories.tsx | 12 +- 15 files changed, 429 insertions(+), 237 deletions(-) create mode 100644 .changeset/warm-months-attend.md create mode 100644 apps/ledger-live-mobile/src/images/illustration/Dark/_080.png create mode 100644 apps/ledger-live-mobile/src/images/illustration/Light/_080.png rename apps/ledger-live-mobile/src/screens/ReceiveFunds/{02-ConnectDevice.js => 03a-ConnectDevice.tsx} (89%) create mode 100644 apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx diff --git a/.changeset/warm-months-attend.md b/.changeset/warm-months-attend.md new file mode 100644 index 000000000000..76b2f53fd2c9 --- /dev/null +++ b/.changeset/warm-months-attend.md @@ -0,0 +1,5 @@ +--- +"@ledgerhq/native-ui": patch +--- + +UI - native - notifications component styles extended diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx index a455c6bfb372..a71792877772 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx @@ -3,9 +3,11 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; import { useTheme } from "styled-components/native"; +import { useTranslation } from "react-i18next"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; -import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; +import ReceiveConnectDevice from "../../screens/ReceiveFunds/03a-ConnectDevice"; +import ReceiveVerifyAddress from "../../screens/ReceiveFunds/03b-VerifyAddress"; import ReceiveSelectCrypto from "../../screens/ReceiveFunds/01-SelectCrypto"; import ReceiveAddAccountSelectDevice from "../../screens/ReceiveFunds/02-AddAccountSelectDevice"; @@ -13,9 +15,11 @@ import ReceiveSelectAccount from "../../screens/ReceiveFunds/02-SelectAccount"; import ReceiveAddAccount from "../../screens/ReceiveFunds/02-AddAccount"; import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; +import StepHeader from "../StepHeader"; export default function NewReceiveFundsNavigator() { const { colors } = useTheme(); + const { t } = useTranslation(); const stackNavigationConfig = useMemo( () => getStackNavigatorConfig(colors, true), [colors], @@ -51,7 +55,15 @@ export default function NewReceiveFundsNavigator() { name={ScreenName.ReceiveAddAccountSelectDevice} component={ReceiveAddAccountSelectDevice} options={{ - headerTitle: "", + headerTitle: () => ( + + ), }} /> @@ -68,8 +80,26 @@ export default function NewReceiveFundsNavigator() { ( + + ), + }} + /> + {/* Select / Connect Device */} + {/* Add account(s) automatically */} diff --git a/apps/ledger-live-mobile/src/config/urls.tsx b/apps/ledger-live-mobile/src/config/urls.tsx index 0514bc449b26..83a04a957d63 100644 --- a/apps/ledger-live-mobile/src/config/urls.tsx +++ b/apps/ledger-live-mobile/src/config/urls.tsx @@ -133,6 +133,8 @@ export const urls = { "https://support.ledgerwallet.com/hc/en-us?utm_source=ledger_live_mobile&utm_medium=self_referral", maxSpendable: "https://support.ledger.com/hc/en-us/articles/360012960679?utm_source=ledger_live_mobile&utm_medium=self_referral", + receiveVerifyAddress: + "https://support.ledger.com/hc/en-us/categories/4404369571601-Support?support=true&utm_source=ledger_live_mobile&utm_medium=self_referral", elrond: { website: "https://elrond.com", }, diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 566b0273ebb9..8e40907748a8 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -104,6 +104,7 @@ export const ScreenName = { ReceiveConfirmation: "ReceiveConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", + ReceiveVerifyAddress: "ReceiveVerifyAddress", ReceiveSelectCrypto: "ReceiveSelectCrypto", ReceiveSelectAccount: "ReceiveSelectAccount", ReceiveAddAccountSelectDevice: "ReceiveAddAccountSelectDevice", diff --git a/apps/ledger-live-mobile/src/images/illustration/Dark/_080.png b/apps/ledger-live-mobile/src/images/illustration/Dark/_080.png new file mode 100644 index 0000000000000000000000000000000000000000..f5eb4c02d37ce7bb91ecadfbec2cbc3bdcc0e78d GIT binary patch literal 11610 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 literal 0 HcmV?d00001 diff --git a/apps/ledger-live-mobile/src/images/illustration/Light/_080.png b/apps/ledger-live-mobile/src/images/illustration/Light/_080.png new file mode 100644 index 0000000000000000000000000000000000000000..771796096f6d2715e62a66b5bc8880f2cfed1d5f GIT binary patch literal 17945 zcmd73^5!6? z2FbB~o_oEn>$-jafcFpIAG|rYa~|i>aX-fx6C-U}DmE$*2t=!^qhSgHL4c27JOvr> z*9Juc9SFpf5@Kc*VCoda6J znXTx$&{Ma?Fqou5ms9H__7CrDK5AqdJcIsYMM>a|-&8uAG zVws4G!&Tqi)6?^<>+N$F3*kY7=PtkH_OkDBPXsHy=r~_KXKuIW`_4TVv~{8DwR1VV zW&ixSuH_iZ(dzB}h_E*9{d0|r)_WtrHV;fzJs}Zo^kLEac*CR2UyVs?gzW?NN%Rj< zj+Fa~0#^w*?<&~Ui!RCFN?dH|V>_MGr?Z^KF%s=sYN`?Gzm7o&x*_gJLhED1YkV7b z^C|Diqt9L4>mHU?Nx1R^~yGMIE(6hP=WiapJR8+@v4YDxW(&ucgU)^{wb!$B%&9WzzKV}i<@ICJYci&1Iz}(sO7X>jN}fK zelT9U_3hnE6KArxX}U3bIXZqOd~n90H%n+sY*_?vy^?KuocAr8?}^Il)~j;wy_t|( zM;mHiN3MU0f1u?R=dg2nu%k>M%EZRhz55 zcXU8tnScn@E`)51o>CU1;UjSF7oD#$lR3ZneZ7J6EHigdUNh9TG}Pf;hS#Nt>Z}62 z?^&0}o-Sr*zknNtZ)aRQzV_nD7Y;o;s?ey9qU)FMO%>jHc+I`AG0y%Jm)-6jU3+ZR zwlk367<;QN(ltbu_Jqw-pNtWI5$Sr&OeZX$}3v3q55?$Gx|S)(Ikf1wisC6_b9Y?~tW)`YI}>C6UxRP?mJ4tZquu%<;p z%8m8AG-mVrm8Glc<5knDVo3Vk^`r&X>m2N-myG)BV5CFOc<%Apr$~}+{K~ZbJu%ii z&-bOq{KjgcOf~Ap?-5F2I75tCS_Br8yS);wko}FD3OhJ}(6tDjs=k^me<$C_CJxiuBq!-x{ z8lV4TyYqynL6&l|HuTe{z-_x36;E_to{EvP0H+@k{p?1&p<7Hb`MJW^&_NxbrWIE88XV%)rHVtmu*Q`F%H ziRgM0I?CeDrF_9t?_UpBz)G_`DEmLZ7h3(KCqJu6<-DzAduJCuM3?%kTw~_vInPao zcIud0TWNpzX|i|?>57cdSk}{L33dtoupG5~BP=J))C;FZe@{^Z+-s>HQ5t1$lvnhc zEFVt1mY-7g=W^`57CbpgFi_yj#sM?*LyPz4;>Bb~$~uXw$d(XVK5r^&oBpdyi==n+B@^O&D88u@-gsORczL9d2lP!@nd$Bc}3%$4nOAorkqGMp15c? zmoTu~zQ5+ir=78d=T6IvZ@9c2BjrC^lB*N2#jkTeJ4iBEM^lvlqWpTBOLcW-G)$yZi?Uy%Kc{cqt9X$$Z)>XSH*EnPp%h@H=n(l3Gk*lLxZ@%K@5qQYuHOVhSJ zrHfRN2NG$}5}bh4=-L#W%I^ekm?b_HoW09*93yir#|2bQO;h>KQLRA&EpWpif1K?$ ztMz2adoT0ELd}XclR^;B<+Tr~e}z+Ts=7@`Z>_t3LVD&?UVg6)jWuxn9@D=uNW?d3U>mN-b3Z8D0UP7QzHb2Rzv*TIIcf8;@gqZE2(#a*1Q;6gXoiF4L(@FJI99oUG^l(?B;&O@9*`yWI zu9rX-D8#j+-suxh!#+f-`eVF9!#+VbV?V+-<8P&37zQjjSCP(UQzb^OQ=8}`z@mt%kqt9NH&1b29jS&9+<#ohu zW|NLPVpw>E3E8-+CZ$s~2MtC4BhC1wR8flv(!)pjoo_UI`0e7BRSVthT=89+^0sJe zae7VKfFB>5*naDxwJ({OfhbrLYaFwRMz4w5=8OJzFS+;3ZENV__otoPw0sI`QDR0r z@w#u#P4-;iGvwaE;l)_093ye}X5UM*j(@E6T|DBGAkV6eM%MiYdR$FBx=l>(LP9;B z`T0HNw=sxKE70|QbqiW4Vv)9dJx1oUI6pu01A}QebNI>JoOU2Qb#2M~Sw{fHO&oaB zcy*XLov!H%?3;uZjXw3@0O zrWK^-RUP%*zqL?`+UZZ>YR%}Kmm+ucT;GQc|GXjfktEfBH*L3rkxr6SrGxeG+4bt+ zvzN1|&}I_x-P@Hq`qKROyPt51d^Cb#PmxrA4l{!U-YTt(KtuH>TTdp1qi>-AB5Uglrhs!x`6(Y~Fo&$tMF z9^--(w6D;j%coTC`M5iB#_lKITrR``0Xyf)SpIlMluVIv7%)33@_B=)?$`--=N(^9)53o9Ns{2>)LdUBCqhrS9kVd zr_nJU>aVQMqgz+iUKxYUyp%LspT91l9nQ%UkL)hmyLUBYnN(sW1v3ZcL5C-p!&>YCAufTuZe z{Ip`rR#<&nwPjD#n}@OV0*Bj0hYZEr-D-rIfxeKGQc<-)wf=tFuk&rany`Y0{=I;)4IaIhvFTC*w__yR z4Xy4Rvyeo4ptiLNUkur9wcOiyDS&)aa+8DwHXDEVC3Wsay4kF!L2~9=691fyahW}J z{I_w6=PTQxDtEr?ltz;deXvt?myr3L2n~;+vI!H3>Q*jl)6UNxiV1sZVsOdaH*9za zZHl@~|A>F_P+ajR(>InR3N}89d^~NHDfCe5sVr`Q*)c!*+con~ikuBquLZq4-^ZAF zGipyhRJrx$HqK%zL|I5(`6T>J|BYj{oyL;h4@_3jEU;c^_C|H?U|Z=WW0{s`SL%CT zd2c=g#}}y2>(&?W@cBjZ#=ESh3>w8LK<) z9d>-{uvS%(c?!|8s6&4MS6|LM+FWIiTe3*9kw5g7;2_IMEn_b-eQ`HVPv1EBiJ!yN z+sq^HeBHeIVb$#`x#0ZYteT@w&m`8umJx1mV&rpKvUEnfCc;^<2@ak^BQ6V(A2k-t z7qW9Dlsqzu4>!&syhFi1wCzLH$K2gV#M~IUFe}$>j6Wpp=k77bxLREP)N%bqNgPjM zj4?AsQF47D=U)a7%Fp`W+fskCmv30^jyiaa-D4_Oq8)rq+Sa7X+~dgIeAL?G^XCMc zayjD4gRdm(s)>cuEU9DadFDNa>CeE*ms9jz9S4RJ%+TNx#6zZWI=AS*BIomTwCq;#uU*^WtcOcMnNNcv&&?HZ?S`&>%-7+Z znul=NMQ7P+TGz8WW9#B&R~$q2t9wNuagKdSg{4yX>v{?cZUw3IYCT*p2N~NghfU^F zt~<|DQ1t$VOjxx>XWWBNMi0MYar$`tAwP%-a%G8RUh>Yfv!RN^!iA6>!6MJ zgeNcb_@g|_ql)r{(@l&fb_xQgpF@)isYGX&ZBRbNA64Mdx;>oc-*ZVl82ZTw_cIN0 zbLA|e$a;Gj6wqcH-2RcaEJofOS%p6ni+@Xzd>=Oj*$G+F+NfWTvLTD``Fnfpig(S- zo8x1tYsbb%9PK}D&^@-o2+LKGounQq%z;k9@gL5}c~~<-=ZAmjZzIs*J9Cc-SrddG z4@j(Q%zjedKxDW!Nybw(zVqOF3|;#Y8Imr2yc(D_W5OJDrkOO|K!<)nkG5T zjk~t=`dBsVzPQ)qn)uCf-NJ;4d=2mYp>u``B)FtqpqaPI)<<3Xr`ucrO0orOB z&V0`6>+giBp#{S6{@#zA=tbuBNq#%=sk0;FQ*KOTl)8M1vJ&s7tDmV;x0zAo2!+y$zTX!hJbZ8~y|>6c za;wFQ35?-Cy<6QZK?%$R zx5GKZOiJaPPpZ5Nwe@K}DPqTkvAte(K3g7~f-K&iztnlk{=$gExuo$u613z^!y%*7RGt z`B$3WlhH61GK|b-Gr`_o<@@u*R->X$c7oD&Y$}QrH71#OG-o1H{U%Uke=Js4bJ~ME zoBC7Ha|>kCk2+SPR(UvganW>9#f^Idwbe#UyG`HAJ@_Uhm>ECVB#XU$@nmUjXv->D zHpSY@P~?++cQSHS)+8*YoqCEs^^Fj&AT=;vU{U;160e7DSP_enx=du(ZDrZ@_7pZ* zn52qg)Ixn=w8hsMG)is1#gj>*N@6J5#UhjB>ev8pQDIR|@Qb5lYNh%4R2y~!zj{6k zn`r6c{3|Y+gKn!XtO+u2$-TLs9D65vkxBDH*E!6zRclDSPdnh(J|KJ8KAPNYEAq(u z?6BASi<4FIw0ajgv1N(nsmd7z|rc8}1~ zXyMLeQwDW+gT3UTFZXZbkD6ILvaxwK^j_IyYmKg8JmlWHn)+9HsrsLMX?se}c}l%i z*^_T?c#c!$z4_QJe_$`PAQxa8PfCMknRjz2_zNhHQz9%-S9G^Yh*J zM?1b+TasJezJvok3V3W9@P>hq#%R+S>^Bo1bj%gB1IoYm@WZ4y-TO?J!bNfMBzq=k z)tVa1ZJGzF_luR&4EX2e+P4>${@5qGKFvG#KNOTp0xQ1>PF;`IY`v}6=DwbN9HU-- zL!fiD^8uNC!pWOIwSB(X)O6H}63&Hp4?218*9>(%X0Lmf&tMGGW;8Dd<6Wx#{Pb0w zO=azh(kXSMoVQEHAITS&y5Xq_&nZ~VlTD(dZd9-d@SA?*KG=Q1iAc1&)vV|E+e(#G z@MNf|H^rq1QZ}h+ymG@<7v(&HtnyG9aEFeD;nZA;4H!u zQf!_h6Zb1?*rnJ)#U`qmH5f@W`Pf=wlMN>H?h}6R3G>YteSY06?FCg;>T;7o3hFRP;wa&u#Vh54lDD#X1^I;hjJ1Psls3{}_NH*&5Gmrj6&X1>> zE@A3KgbP|pvi%xOX<-L&x-ro;$HW5SAQzsZ^OfUlVqsx}?I=J1rI?;enPM1nrznDg>lncXP6(BcgKU+ z!D1!J1G)ktYd3nBK)N0+T`DqupvlLCcTaG4y20I=ofUDJG@!(hPb(O@$=gAmt7{MD zC^@dc9&p~Smk9#v^oA}uNEQXK-jsLk=bpzPElu?z@9Noe7&b$AbnAR@{z*A~2US$YmOSd|SGpem-Ky<=zu zDQ?0;@{j&J#4%VS?7ke}B+27lb17A6=c{#akugvd8bfFbb;_-sJS@l2*#Q=`>c7f`^+n|{Iz zz?d5rOSZ}+cp4lum?T&U&M$N4ixE~2dxoXMUa1S-+QUx4#5->F0i@g55%i8M)tJ$f zczR@3kI&hGn}$K&mnl)hz_HGDEY47Iiy$ZjP7-bbj5}4Z7X+aLN6$YdSmyGybahl1 z_V2G&kLiQIpk}jzd-IT-eD^ced7#Kb8)*XVx773Tk8B_ur!0GuipL4PkDj|&?JMY$ zs{LIwTDB)2Fs7*p+tB^6wwb(giugD7g{!DQjz||IIr5h|7ygk3uHWemu*Oy@rz-V) z@T!7M+a`ZP&SLQ00IW)N%B5Y5>Yx^VEY#vC7!>}M8m#MKSa-@h3EO0z#${*)LJRP) zM-KvqHU;5bpcZrGL7Bf~WM^e5LZC#OpC`;$r{}_uqaa5~KMf5|H#Ovig4bhG)gPOZ_+^wnvcH@R zG!D70)!Fhy@nI-rTxJSq;lhOd384i6G1)KuChD8dXeiCl*O$8tlR3xu+{l_gG_S!S zQXy`A=%(&`VPbrERHAS+!C=|RmBA9MJ2vyF8y*A`XF7S3@}lAIxCp?HxhJmgjeWfj zbs5-se0@#={_ER<)e-cb=f~4ISWV%V4Jzc-@KNC_Is&w$x%H>e$tUOZ;E43@6$fk5 zV9wy8;gxHG#|*>>>Q~t^Xh57Z+HKR%vpIf6H^KKYW+8|a??2~dGJxv`E$yV4p0WE0 zRVOnokUA!zC#rJeck>L5%_bXOs(S;0HqeDp)ms;ym$Ta@KY6|B*e%7knEx!i(Y4I$ z&!2=e+w1x~DYd6N6xsBE`-5h{989nW)MpoLNY+^X@IKj1KrhSgxQlOb+k~1?Q0=Ql zAX6X&PmXacCy=$XSZ^f`{9}J+q*+{-3PR7FV$!s_pSu{cn#lRv@^Hmi!+>1b<&|_Dz*4SQY z1duFC-}fWhddm^CWnioW@&SBNN}rb%R0x;Ge?`KuznWf>?~+XpUm$82fodpte`$w= zgN%mklQoP#iE~!v7F@ZWQcP#?cU zyNX1O$ZxA8Z`AFHC78;S2TuVGEK|oyQSNe(2B_=h6fOuX3QGORM&ifkr>4>BEeF&~ zVzP%!x`z*(NEk!4wL8^Q)jUGCAqn#BL@I32eHRX=6tZk5sD1~)@qye(VD(e3P9Eh! zdZLo}7CHaR%W_ZL_S_7>%SJa0w)eg$Vd_N-sPM=eM_rg44Kbd?flojzpmOj3vBJ}0 z?(1828-(Gt-9`*P)*%CxqGJ)(wL;@^OM{BKfm`_DRJ9FRfEADNla}J-0WzX%JBS?< zuq$Ff>0qiq^`(FPc{u_|HdPQK|7HgucWZj%E|7iMdxY)>fNmajiH))X5$65#M4>48 zpXBumN(UaRJJko0uBJDh9l{JPv!#6qvV@dqcb=!J6G?dCl#mBVC6u#faI#l3;gLS? zs0u)&Ztg^(Bsq@s9{8yC^neSf!ukJG2`^wpPb=DDsAYo4F~aRXdYyyHl244Ys({2G z=Ng@tQ`LH}19bXj@J0efU~C^YLK?vjxel3Y{Qt1C03_H5>g-FfrT;oy3-k->B4-b} z3z@74;r_^I`lyLo_3YDLke&c1T`LubfQXl3v^R@Kok3j)iRo%0?fF$;rxq|>EJDa1YT)`GD#d+gya9rOcp_T zSj!ehmQDToHM-}&8t#LpL9%RULEBdqK4Cgcbs$0D_rbA<+~gmV*t^mQ5S|n#32$gP z)dzfzXeV$QNXV8}`I_yviWt1Tnj?`01jGwL^d`duC;cw;gc|5atn_(%KyQKI8o<86 zu46x2Jhw#g@hw)RssTYnB$71yA;`R}<7)f8?Y#SPK=TRs{@i6*`m}S*KB(GKqt!*= zYCqi|#N-|uVihROSbZ#)G@=XIqTN|6jnJ(Gy$9l%Z{89sXc1ZJ%q-2u2D>cs0*E0X zEijX7fkNe$$mb*G(dd(sqJ$BfZHS4|KMF4B@fmGt?9XdN+QaWlWMQsaf`}T1`_b+~ z%Q_fqm+?+8@t(&zw?OaFu`1whusTxI;&~_v4BM+MN^l05+{q#Yq1ciA6=X|D6l_oB zUx|G1Sr8eBlK#DyV#os&O!QbEAh6a?xaxR=>vf2XpP5GMM%6#E```|M%yFLF%1DcS z1bdW)p#qv)rnXZAb5rDF?q!t>poLL6uq3MQoeaU{Tb$31?cyyQldL5C*Df<}Dc@6G zo_fmz2g>00o&5w_$8+>V?}`|Z;8KcCtL|l-9^F_N&oc--{_M|pzZOFV5Kk#RoudvA zTNuZ%%YJ9Y6o&j31&!98R^9orqCz&o50AKikOnwf?-(wv@;kC`1gG+^X_b#Hc>peI zr3hTkjg=xll?g9UZSZ#;4#+}9KW60Ar_-Qo3WJD@#IWT?loH>4K0upLWbfvE$61E3 z!FA`xjV*4NjQnQeewRJSqi>RsfsMF!@`0Y1w4Z9*CklZCLl5S-SC`*J%CY254Ew`XG<| zgm0)0>99jN{|(KurK2wh2V7Wc0Ae995p>2POJ+6rkA~b=CJ7B#O42hu@C*q}K(hnj ziywaBLcwW_YeG^Wa;?s`xXQv>K(>`mIn}CXVQGD+QEz-AkgqfIE_U<-MZHip~ap7jtXQ_mpZ~6zEx`#b3LHME|f0>EHVW#67_9vP4WEahJVV~$CmE8zvCZ{=_aLA41K;zw7n0qRec zA#7s>N)GH;Xv_yj2{A+{@`etdLirNTnz_^`8<} zpW!Y-%JJq)JYKxoMMH7v#+7ZEW~*z-c*fvsMFDq~g9HKM(g8HPIoaVWpumPx=CK~t zv|hqC2@QzLP=GVn^l@4-z!dxUkEvJlN-lD^V8?RLqHu;s1!phK#DK`t7bvQzNCuYt zp#fd_KIzKE22)!|xe2Y7D*7-S9hi+fSr>_L_79E!LZdDZRlX(SY zZLrr>aA9Q~e{qD(kfXSp=P*NpgG6W;+dp1me z2GEX=0#wgzl(;WcqBm`}1snKKE*>XmVh~H)hk!nPZOh_RrW4R7GrWR_n+O39#Qfat zd$M}BKx@;46H%zJX;mEo-867Vu(hH67vh18W@iDBleOv8ilxE8;xBhkK%c1mOlars z!~HUe5@b&H{*^x`Z?)3jv)AyhIwtg?-KxI>F?(taX5oVU>ZMF%pXGTw-3?${7FMqBW^mNE#Ax9H99|44sXT~)sGBY>k3E4_% zUHo#bcMZbd6C66WE23OZLIZfQRKewXB~s78a2njOlfXw$Puv+Fd{LxNm=%;PcC69q z+&9E8vGw$>-t_3C>lD3JX|(S!=ykv$Kz6_TE@5f_G*ACe6kEKHT)|M>Z0hp$_tN<8 zw?c_Uvq}?0JK<83>y9~~0UEviu z@$@WY-)+B)V}#-Ng8pG`{kHy)bbo?%-sEuF<_YrLR8OjnSwqiV$Z?#l{cG?%#|wMF zsq%`!@z&86GSdzq_U~QXlmDa|b3OM`wy@l0l*8DGCw(lMGOiuS8Olmbu)D(QWtm&q zzwEAq$w9`2$z;XJQ;$pWH{YhZ^0d;}Ew2GaSWY|lwcR0cT(`iTayhRKVX{r9nrR_D z4A>qi{D8Jrr{s%!z{wcAJEhI2S17c*ak%d<*vC*{Hp|qeovF&7VW=+J;XD z*KSM`zFkH``l(^h)5pS^wyE`2R$h*3t+1a4EoLVz1xc*C*`b3B-}g2#V!N*Z;X1I? z0!5ci^+ehpjTDU>ab0E(?$!ZT-4E_&_+GQHwaYb&ggLv?Y|6b-tyQXiN~_XW*z5WR zkP#f_Ou6EAgb}FLS7>+Podh$*?Y!61d7nZyuSV4Bd)dzn-;Xv4W{%BqI0~RI^wL|;PX6KHoQA6?0>i|IhtsCk z#2!5-9HlnJeAjNkDf^Nml27?QnZGGqEfaf06kLne7caC8-Nd8a^Ddx96HQzCeIS3SYIG=9lw0KZ>eAO=val_oR` ztk&-!R{z~WM`j_sa2%mrBq>-l@+A)m%z?eq=R1_yHj9X~I1&I+;(TMeKPNyuu&W2l zaINaL@%;VyqU0ZO_^ZST>u?gGGH)WZ$K3~QEK2qPpft~ansPH{XpZm~gFrAo!&F|P zXr%w2A;>Kbx?M+O-cL&d$<-6s`nP{)f$iPb@S@wK3}&C%I0KCrCf_Tcfm;&=Fu2qN zvudt|@8&a=dVKBmz#0k^6^XncPOA(M<#_Y~Y7`|@u9FmaUBT8-M{ix>-yWP2;;Yrk ztLiYnV^R2_61(m^PCqgC4+A>4-}1sENH#&OPMRNV*qY>v4h{6&|1)%wqEtXapl*zaBHe5+xCBcx#WgMha+Q=B^5g6IjGC1 zRZ~53TRK2pOac^&957D^IphKGlRh}DBsteuz}t%mt(g___(@e$-6To(0=Qs33Dt8K z*XITBC3qB47xsv(n!&FPz{Fmng9mRBkuo%q>m#x;ke2NmLOLkhg_TI;kZ0FGqnzH0 zLeW)|g%KF4A^|X~mw|*U20e<5M9S#fM6U{V>jJ~4ZV@%a@(t&W6CFwnJ^~LR8t&mN zYA0<|!GRfOEPwcqL;9mcubs8$fg=C)FAKf(ZmiL@^C>>QcOAr72jE+R9rhaVjW4Kx z<6n?YQUNF&3QaPcjb z(D%C+9sKJbsu}h+wU~pQrN4M$AnZ>P2C!G8!d|gHIjJAq3n36$^FP>u&{XYBb3i!2 zxE7=KK&aoFf86<&!po`Lqhm(DCmME;aymPmz+HQ7d3kuT+&?1y*~G~BdC|_nk$iAC z2)@{c26|VrrnboTBYW7R7yluV1CR((*La;Pz@#Cm(HVz*i1pk$2`_n55e$qiIz>4b zRb-nEUm8zHWD6#jQRs6N6QJIjt=)RDSLpHoC}LR^s27cEEAlXLK6oW$46Frl7+E`L zC4KGp-vGad{RGHGkEDLMO0UtW0DGiZ4fg{Ezoe3j{zX?ON}^ZK;#SF{M^3z>wL5>y zokqg;v@|wpyi}(-xdD*v<%>+|s%rq$CD?EoS>$!%U1>J4?YJrymG$7w-||*%>b&?AJ?ULBT}Qs6RxZ@EuaGc2&_pF2Ud5f z?6X5cM|MSup-|6LPQh;SO~b%2>`##szSYLx1|&6Chf0SVC{w?JcmxRjD&Vxy6K~NN zblUXNxmg^&)n(aB!F4euu?0uRvNudYZkwEa_W{@$aSjz4-~HPiq)``(E<>3kot!OC z&x<=?dok*B@IH&l71AWY(H|?HJG|aZ#MB2EX#{*re54V^04sr9AhQIs@?y}Q92Zw? z>w6mzHmQ&QI8zqRD8Sb2zl0V-?#=(mY6>9IoMjw}%Paf5}2%P@Te|%Xi z#eYSXdl$xuKqZ{69=^L3=VVj+gJ!kVe2!GQ%I>GbDK0jE?AOwC3D~F#*OqlZs<+P` zWZIr{_sa^sUrN8q@z}!^PtfazQviit4tm%qUF}Lcw+NjV7Rm`_x0sZkss-YCdAwdK z;$i`|m+CUmR`J2BWw7?!15mG0GykY_{^GP?Vha0M1*wW2lws6fT) z3aSOvtDF?Ttcvd{r{ATjSJ+38RoiLc`aD+gjkPS3F3FhF<4}2EI>dWN0i$cO*y^3> zpLo%lQ|7KQ^UoLR(g>h-;QH4ZAc2(&wy&?ZR3cw4%nMFOJg^45c7GJ70LGN>O$SW; z#gDFF(ngU_*u8TpaFZKEY5VfAR8nCVX~;eie)r4Yjj`EM!`(}Tw+tJPYtdI+fel*o0+`rxcaM}0zHtIay^Iv>Cpcwc zfH_hKbjnuX(z89S92EO&(ciHM9sI?EdGYuMXE6B0r{G24YxHzQ0bl4R@-Hk|?#iyH?G)*L5nWChy-9`#nwYOho#UIKHgd^Eg zv*3IVYT;jQwot!Vr? zQCmeoel}Qm#BI6{`y^Ehu#id|*(bn4Rq^N&VSgvc(kDZbPfIx$M2G1c>P0w=&DURt zL<&E0$^^2lxvIzEP&jPC1p(ZH>|cc|zeN8;F1wvWn+9H?Yb=^?l0k%I@RWBhv{Z@5 z0-ntd3x)gv8Gr21Z@;}YC~R`xk3R>Mm_J>E_^t~B3HCM5u9ZeP?I!idher|7mUhAh z2gX>#?_u+ER)CihD?>StpGdX*O_p@YECddPZt4)c(zS;@GjHH#g5_Cp)!)zwLA^H} zgts!QMs!yiyA&V4N_8f$Rp?OiU8WL05&{`R?b(z9>@_wY5S__va}*g3bZVZUs=>u| zOTd0Vamx8qHqP}d9~VWgesawamI&7Dwkxdd)1jWI&&;^>MpYOS&*iL$VG9`SB~*^=b%&D z%T~PbV(XNd_;oF8xN3l^gFKH=ddKvk~k1REFo!uv7)R{ zZb1}O`qm2{<%WL+4zhH||3v0^P7wwTgM0nZZ+4s95;@XH0iPA29>Bww0$lB(J@S_l$X4Y6fqV5zkx3>=7=pX#LGP z4RfKX*4I#U|2hIA9_T%Oat^eJP%e++Q*uA1>gaw4AeEW6vjYN}&6~W{moWAQ(Z!-$ zDu`FE$#cX@U)8`@zkK=?|4PiKVVeOUv6rZ*Q!ku9SRs*fzA-?;I0uZQlkLbl1u~89 zsSjR-WB@vr@%1h@BrYD^UH)H6?bbr+AP}89@ht$iEb|1L4nQ;yyNAtz!7Pjb8}+&_ zIk2!$WRnE=td#CR)KU7tonJ~4aILgId7=P4hq{_v6e~Go(AZJDMx$f?-Q#;O#~{mX z)tpg6>c{D4qw%`YgJ`k{c7l!b`6)v3Rmm^%>_u<{@k>BV-+3=b`b>=4hCdeQ^3u%z zp+0@W%&%~t!1C5p!uWzj7JL#*e)5ly!0iI~91@Atd^mhk1s-^brmx5*>SeG?g?sYv znKAg2%)!VYN+0DU9Rc`+00w|pr<3eEc0&6VrI2$;_Md`Yr`&z>RKZbK(-+U4XrFp~ z4E(Pfda%lCG~m(z_?);ueR2+71t|>Uib5SojmUhCf3*Ea0C-At1Y^I$r{gbrsw_a* z{O@evqV+tQu#$|D2=HqN(57_%SAE9VN@tlx>*9R&89PTE>U^nM`5;;A=IKhgfJD_{q^(}R>Qf@K*$kxJtpf?SqPmcgnzqoiFu z5IJWK6YuZ+XNMOq1~{%mHU43)JZTd|Rs_y(EeDuL0Mn0Q_PbntN5YtTeh>hk_dfi4 z@GR~eihzbl9efOMTT<;=& zFAS?KiMX3`bQ7Ur5U8QImlaC8Htu#%hRuZSWiS!JRjDE@r;aYVp5joQlti1cd z>%4yT2pAf5zvf){l9!LU9hlX6;)(dL;QOCIOEM6NC#rpM0N)56^Z58w{^rOAagzA@ zYkrlZ z|7`H|OYt7p=(J7MBCg)vM2u=>m4Lrg#1SVNyU{otW`K_Xq>+D5ws8OWRPg5ae@`~w z`hXbM?qt#D0}RIGe}s|Sjnv9&+sGqs{X9u9gzZKDk1LjmCZHUb|4TL!5Vykef@p@9 zO6PMQhgY!S#KFQe-+cO*paR=VB<}m5A|Y5OSt><@m;1}UC~0YKqQvVK2rgzdWJ zWMEkxqIBR(==00i#KB*`NJ5_McBiYr`4!ljaTn!eig%au@xZMHQROBVA>$11nT#rG zw*s>;0CaKTSxwTM6TXva%9dk#7C}CMM_4T9*Kq+V_qCgoP9*Q!QGpOCFy5 zv&^eS0iOFf8L+{|9Ca#>Of1G<4|u|B?N~;K7gj>$d{7K1=DW76eqG-r#MtVYog~0? zAIkjCZ$3_2m+3ax9=$g4e(7}g)^3f<`{}MZk)i;~UCiGfxVw67NazPe$!{<~AH6Z? zbSlOB*EWD_ZAdE#hlMM`G9J?Y(`{M_s1$dIE7BB1Zre-YcZ!m?$$Y@=wyt^Jj~oet z^iO{i1*4mdwj?Qkv2xZQiHoo+;r0g&RSY)}V$m-+ZWE!O7<3R4V;e)~jsF8R27f`G z{yCHorQ)z#=G{2~!Z-Orn(Z?>_YbqCdTC&Kpz%NLRwA+bINWd@zUZS36hHupqIq3I zvo(c77zHNG@&3gJi5HE;ZaQ{$4LrUIILc#Tcsq%fO-!JB@tnTE1=EShlfVQAi6in5 z>8T@U4cssch_hadgXP1*E$?56lK3b=@>3+65lP;x-fEyBd$0}q^9T>*+k~loX9S@KvAWfFP<7o577pdf}DyKCS4Hh?Ax0} z#yEKAVU7j8->WQEs#>-0Wi9(Sml#)?zRd@u96aYHw_BQ{0)*Uuj$B2>qONGja6Kfn)GaB#zcbqrBRGDmyIn>UNdd~3XypGiD*OR&GI7uhpO z8vgJL{(D&OqU^j4fgi{kDH0?Guh0@bJ~sZg>=;}aR$R^vufpGAzr&g`Xm>-PNEBOR z_#Llu;EMvJZjQwMfz?PMgb5UVvePpb_^T&yLGLFsRE7Q0!d>lL;Jvi> z4FSYYI3I-~E35?~1VOk(rr9MNVW<|$*@!PCmQc*7oR^BZ0!63D%Rt09X@qTv5pjyx zNUSHU23pNqfq6DxDNq!?QON59Ql!hK7B+j9Kf`SGX}BQ>S$2^^gw>jPc6Bt$DL3g_ zr(ULgk}Vo>VkXxU5Xm+DL=~J~EVd?5&p@*+{B0BHr0NK-_!b`^W&sm>=w52d@M^?9 z!cP0|GEjqpijv2?R{3QSdh3j}Ek~THKba4ovYbR{WK$Rjf2-cQ>vBYp_AA1;0TT5a zQKWOhR+H>k0hIEySGz{gJSzFeudSgIW*q@e@>Zk3w3eu>;0@sY$8UDa%2?1)5vY#P zj7$P#bk}HItpe@=bo?1el;hA&ST<}1wxw>bn;BARC=jbB@TBba(jNenyX*!UC|IBV zI{*@eTAW2l(zD&p8In0j|G7u1;LIb3rF%yhxR;^4Av@kSiICh z>r;Q_tD&Gd&yQQc?KIw|=sqyckKDfPc*{>yZ(Yx^u~!%|dj&U~n=K;3kgs}D+pnh-;##16Qd80}mSwTKg37=}WA10{60FA6Wh~<6 zu7*PER;07#iLEGHYvA_5;IcI+C7j@D_H=CuebR{0BEFR2dxj-N^&>_`{)-ZZ34a!Qej#pwyL6-e!y7De&`)twvWE1yiPogte!{yea&+;d>lkIk&i$d$bJ5x)teF!5i!$v{nh=)fhK z)pEJ|ae=o3gpX4hhyeEi#jMCdEAJyj+v)|eP4VB}4#E4Sl;JCET#i(}=M!uB$_$^X zl7k9nYLg%zk4ppE02^TByHjF0T$X)|(My>m$i-y?tdE3Pnpr?L`gP44X6HAFx6~e4 z=15lTHn#hTP zyNS5#SkT2yFFSpQ_>$J+GK3BJq$iM4aq>2I!ITt%0AMJ~6vPL+_0(V(Oh&uY278S9 zgA&*RPHKvoBwW(gA~Jxvxof7eNh=KHplvl>YAg@@MGyg+hXUZfgr^>H=_E+wHRKFx z3u&}`xZ*8$?!Y`z-n&UK&?b)g8xuU2V2_M7HYpDI6hx{Jm85_~kC znP zzf5uk6hX%E<@@-7Z%iZVuVBeFJ>axnCl)JiS&|9LwW((+``}#%*k1Z*5^)1JNh+Br zS%dqEJ3Zt)beNl{zu?=BwDZhZHdUGV@OioUc&z$@g9p(!63t@A!3kFZ@pOR+Jn{eJ j12CQa|MHnNkjkml1X?_Y74X2Dbdav5kw&GOcontact us as soon as possible." + } + }, "receiveConfirmation": { "title": "Receive {{currencyTicker}}", "addressVerified": "Address verified", @@ -2193,7 +2206,8 @@ }, "toastMessages": { "accountImported": "We've imported a {{currencyTicker}} account for you. ", - "why": "Tell me why." + "why": "Tell me why.", + "addressVerified": "Your address is now verified" }, "additionalInfoModal": { "title": "Why we imported an account?", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index 8e16085cd674..0b332d3d2aff 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -81,7 +81,9 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { }); } else if (currency.type === "TokenCurrency") { const parentAccounts = findAccountByCurrency(accounts, currency.parentCurrency); + if (parentAccounts.length > 1) { + navigation.navigate(ScreenName.ReceiveSelectAccount, { currency, createTokenAccount: true diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index deead71204ae..a946776f44d0 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -77,10 +77,10 @@ function AddAccountsAccounts({ }: Props) { const { colors } = useTheme(); const dispatch = useDispatch(); + const {t} = useTranslation(); const [scanning, setScanning] = useState(true); const [error, setError] = useState(null); - const [latestScannedAccount, setLatestScannedAccount] = useState(null); const [scannedAccounts, setScannedAccounts] = useState([]); const [cancelled, setCancelled] = useState(false); @@ -172,6 +172,13 @@ function AddAccountsAccounts({ [selectAccount], ); + const renderHeader = useCallback(() => + + {t("transfer.receive.selectAccount.title")} + {t("transfer.receive.selectAccount.subtitle", {currencyTicker: currency.ticker})} + + , [currency.ticker, t]) + const keyExtractor = useCallback(item => item?.id, []); return ( @@ -186,6 +193,7 @@ function AddAccountsAccounts({ @@ -210,16 +218,21 @@ function AddAccountsAccounts({ function ScanLoading({ currency, scannedAccounts, stopSubscription }: {currency: Currency, scannedAccounts: Account[], stopSubscription: () => void}) { const { t } = useTranslation(); return ( - - - {t("transfer.receive.addAccount.title")} - {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} + <> + + + {t("transfer.receive.addAccount.title")} + {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} + + { scannedAccounts?.length > 0 ? <> - {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} + {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} - : null } - + : null + } + + ); } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 002dd87ef905..68ef547e87e8 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -1,25 +1,17 @@ -import React, { useCallback, useEffect } from "react"; +import React, { useCallback, useMemo } from "react"; import { FlatList } from "react-native"; -import SafeAreaView from "react-native-safe-area-view"; import { useSelector } from "react-redux"; import { Flex } from "@ledgerhq/native-ui"; -import styled from "styled-components/native"; import { useTranslation } from "react-i18next"; -import { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; +import type { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/lib/account"; import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; import { TrackScreen } from "../../analytics"; import AccountCard from "../../components/AccountCard"; import LText from "../../components/LText"; -const forceInset = { bottom: "always" }; - -const StyledSaferAreaView = styled(SafeAreaView)` - flex: 1; - background-color: ${p => p.theme.colors.background.main}; -`; - type Props = { navigation: any; route: { params?: { currency?: Currency } }; @@ -32,32 +24,56 @@ function ReceiveSelectAccount({ navigation, route }: Props) { const accounts = useSelector( flattenAccountsByCryptoCurrencyScreenSelector(currency), ); + const parentAccounts = useSelector( + flattenAccountsByCryptoCurrencyScreenSelector(currency?.parentCurrency), + ); + + const aggregatedAccounts = useMemo( + () => + currency.type === "TokenCurrency" + ? parentAccounts.reduce((accs, pa) => { + const tokenAccounts = pa.subAccounts.filter( + acc => acc.token.id === currency.id, + ); + + if (tokenAccounts.length > 0) { + accs.push(...tokenAccounts); + } else { + const tokenAcc = makeEmptyTokenAccount(pa, currency); + tokenAcc.parentAccount = pa; + tokenAcc.triggerCreateAccount = true; + accs.push(tokenAcc); + } + + return accs; + }, []) + : accounts, + [accounts, currency, parentAccounts], + ); const selectAccount = useCallback( (account: AccountLike) => { navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, - accountId: account.id, + accountId: account?.parentId || account.id, + createTokenAccount: account?.triggerCreateAccount, }); }, [navigation, route.params], ); - useEffect(() => { - if (accounts.length === 1) { - selectAccount(accounts[0]); - } else if (accounts.length <= 0) { - navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { - ...route.params, - currency, - }); - } - }, [accounts, currency, navigation, route.params, selectAccount]); - const renderItem = useCallback( ({ item: account }: { item: SearchResult }) => ( - selectAccount(account)} /> + {account.parentAccount.name} + ) : null + } + onPress={() => selectAccount(account)} + /> ), [selectAccount], @@ -65,24 +81,26 @@ function ReceiveSelectAccount({ navigation, route }: Props) { const keyExtractor = useCallback(item => item?.id, []); - return accounts.length > 1 ? ( - + return aggregatedAccounts.length > 1 ? ( + <> - - {t("transfer.receive.selectAccount.title")} - - - {t("transfer.receive.selectAccount.subtitle", { - currencyTicker: currency?.ticker, - })} - + + + {t("transfer.receive.selectAccount.title")} + + + {t("transfer.receive.selectAccount.subtitle", { + currencyTicker: currency.ticker, + })} + + - + ) : null; } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 866290b4525f..5d26e096d97d 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -1,8 +1,6 @@ // @flow import React, { useCallback, useEffect, useRef, useState } from "react"; -import { of } from "rxjs"; -import { delay } from "rxjs/operators"; import { TouchableOpacity, TouchableWithoutFeedback, Share } from "react-native"; import { useDispatch, useSelector } from "react-redux"; import QRCode from "react-native-qrcode-svg"; @@ -17,22 +15,13 @@ import { getAccountCurrency, getAccountName, } from "@ledgerhq/live-common/lib/account"; -import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; -import type { DeviceModelId } from "@ledgerhq/devices"; -import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import { useTheme } from "styled-components/native"; -import { Flex, Text, Icons, Button } from "@ledgerhq/native-ui"; +import { Flex, Text, Icons, Button, Notification } from "@ledgerhq/native-ui"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; -import PreventNativeBack from "../../components/PreventNativeBack"; -import BottomModal from "../../components/BottomModal"; import CurrencyIcon from "../../components/CurrencyIcon"; import CopyLink from "../../components/CopyLink"; import NavigationScrollView from "../../components/NavigationScrollView"; -import SkipLock from "../../components/behaviour/SkipLock"; -import logger from "../../logger"; -import { rejectionOp } from "../../logic/debugReject"; -import GenericErrorView from "../../components/GenericErrorView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; @@ -65,20 +54,21 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { const { colors } = useTheme(); const { account, parentAccount } = useSelector(accountScreenSelector(route)); const { t } = useTranslation(); - const [verified, setVerified] = useState(false); + const verified = route.params?.verified; const [isModalOpened, setIsModalOpened] = useState(false); const [hasAddedTokenAccount, setHasAddedTokenAccount] = useState(); const [isToastDisplayed, setIsToastDisplayed] = useState(false); + const [isVerifiedToastDisplayed, setIsVerifiedToastDisplayed] = useState(verified); const onModalHide = useRef(() => {}); - const [error, setError] = useState(null); - const [allowNavigation, setAllowNavigation] = useState(true); const [isAddionalInfoModalOpen, setIsAddionalInfoModalOpen] = useState(false); - const sub = useRef(); const dispatch = useDispatch(); const hideToast = useCallback(() => { setIsToastDisplayed(false); }, []); + const hideVerifiedToast = useCallback(() => { + setIsVerifiedToastDisplayed(false); + }, []); const openAdditionalInfoModal = useCallback(() => { setIsAddionalInfoModalOpen(true); @@ -89,39 +79,6 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { setIsAddionalInfoModalOpen(false); }, [setIsAddionalInfoModalOpen]); - const { onSuccess, onError } = route.params; - - const verifyOnDevice = useCallback( - async (device: Device): Promise => { - if (!account) return; - const mainAccount = getMainAccount(account, parentAccount); - - sub.current = (mainAccount.id.startsWith("mock") - ? of({}).pipe(delay(1000), rejectionOp()) - : getAccountBridge(mainAccount).receive(mainAccount, { - deviceId: device.deviceId, - verify: true, - }) - ).subscribe({ - complete: () => { - setVerified(true); - setAllowNavigation(true); - onSuccess && onSuccess(mainAccount.freshAddress); - }, - error: error => { - if (error && error.name !== "UserRefusedAddress") { - logger.critical(error); - } - setError(error); - setIsModalOpened(true); - setAllowNavigation(true); - onError && onError(); - }, - }); - }, - [account, onError, onSuccess, parentAccount], - ); - const onRetry = useCallback(() => { if (isModalOpened) { setIsModalOpened(false); @@ -131,26 +88,11 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { } }, [isModalOpened, navigation, route.params]) - const onDone = useCallback(() => { - const n = navigation.getParent(); - if (n) { - n.pop(); - } - }, [navigation]) - - const onModalClose = useCallback(() => { - setIsModalOpened(false); - onModalHide.current = onDone; - }, [onDone]) - - - const { width } = getWindowDimensions(); const QRSize = Math.round(width / 1.8 - 16); const mainAccount = account && getMainAccount(account, parentAccount); const currency = route.params?.currency || (account && getAccountCurrency(account)); - useEffect(() => { if(route.params?.createTokenAccount && !hasAddedTokenAccount) { const newMainAccount = mainAccount; @@ -164,28 +106,14 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, [currency, route.params?.createTokenAccount, mainAccount, dispatch, hasAddedTokenAccount]) useEffect(() => { - if (!allowNavigation) { - navigation.setOptions({ - headerLeft: null, - headerTitle: getAccountName(account), - headerRight: () => null, - gestureEnabled: false, - }); - } else { - navigation.setOptions({ - headerTitle: getAccountName(account), - }); - } - }, [allowNavigation, colors, navigation, account]); + navigation.setOptions({ + headerTitle: getAccountName(account), + }); + }, [colors, navigation, account]); useEffect(() => { - const device = route.params.device; - - if (device && !verified) { - verifyOnDevice(device); - } - setAllowNavigation(true); - }, [route.params, verified, verifyOnDevice]); + setIsVerifiedToastDisplayed(verified) + }, [verified]) const onShare = useCallback(() => { if (mainAccount?.freshAddress) { @@ -197,12 +125,6 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { return ( - {allowNavigation ? null : ( - <> - - - - )} @@ -250,11 +172,10 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { - + {isToastDisplayed ? ( - - - - - - - - - {t("transfer.receive.toastMessages.accountImported", { currencyTicker: currency.ticker })} - - {t("transfer.receive.toastMessages.why")} - - - - - - - - - - - - ) : null} - + + ) : isVerifiedToastDisplayed ? : } + + {verified ? null : } + - - {error ? ( - - - - + + + : + {t("transfer.receive.verifyAddress.title")} + {t("transfer.receive.verifyAddress.subtitle")} + + + {mainAccount.freshAddress} + + + + + + } + + ); +} diff --git a/libs/ui/packages/native/src/components/message/Notification/index.tsx b/libs/ui/packages/native/src/components/message/Notification/index.tsx index 6f33338fc001..bd3f207ccdb6 100644 --- a/libs/ui/packages/native/src/components/message/Notification/index.tsx +++ b/libs/ui/packages/native/src/components/message/Notification/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import styled, { useTheme } from "styled-components/native"; -import FlexBox from "../../Layout/Flex"; +import FlexBox, { FlexBoxProps } from "../../Layout/Flex"; import { TextProps, TouchableOpacity, TouchableOpacityProps } from "react-native"; import Text from "../../Text"; import CloseMedium from "@ledgerhq/icons-ui/native/CloseMedium"; @@ -8,10 +8,12 @@ import { Flex } from "../../Layout"; import { space } from "styled-system"; import { ExternalLinkMedium } from "@ledgerhq/icons-ui/native"; +type NotificationVariant = "primary" | "secondary" | "success" | "warning" | "error" | string; + type Props = { Icon?: React.ComponentType<{ size: number; color?: string }>; iconColor?: string; - variant?: "primary" | "secondary"; + variant?: NotificationVariant; title: string; subtitle?: string; numberOfLines?: TextProps["numberOfLines"]; @@ -20,20 +22,50 @@ type Props = { onLinkPress?: TouchableOpacityProps["onPress"]; }; -const NotificationContainer = styled.View>` - display: flex; - width: 100%; - flex-direction: row; - align-items: center; - ${(p) => - p.variant === "primary" && - ` - padding: 16px; - `} - background-color: ${(p) => - p.variant === "primary" ? p.theme.colors.primary.c90 : "transparent"}; - border-radius: ${(p) => `${p.theme.radii[1]}px`}; -`; +const variantProps: Record> = { + primary: { + bg: "primary.c90", + color: "neutral.c00", + padding: 6, + }, + success: { + bg: "success.c100", + color: "neutral.c00", + padding: 6, + }, + warning: { + bg: "warning.c100", + color: "neutral.c00", + padding: 6, + }, + error: { + bg: "error.c100", + color: "neutral.c00", + padding: 6, + }, + neutral: { + bg: "neutral.c30", + color: "neutral.c100", + linkColor: "primary.c80", + padding: 6, + }, + secondary: { + bg: "transparent", + color: "neutral.c100", + padding: 0, + }, +}; + +const NotificationContainer = styled(FlexBox).attrs( + (p: FlexBoxProps & { variant: NotificationVariant }) => ({ + width: "100%", + flexDirection: "row", + alignItems: "center", + bg: variantProps[p.variant]?.bg ?? variantProps.primary.bg, + p: variantProps[p.variant]?.padding, + borderRadius: 1, + }), +)``; const ClosePressableExtendedBounds = styled.TouchableOpacity.attrs({ p: 5, @@ -54,7 +86,8 @@ export default function Notification({ onLinkPress, }: Props): React.ReactElement { const { colors } = useTheme(); - const textColor = variant === "primary" ? colors.neutral.c00 : colors.neutral.c100; + const textColor = variantProps[variant]?.color ?? variantProps.primary.color; + const linkColor = variantProps[variant]?.linkColor || textColor; return ( @@ -86,10 +119,10 @@ export default function Notification({ - + {linkText} - + diff --git a/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx b/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx index cecce528c6e7..af09b52cff89 100644 --- a/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx +++ b/libs/ui/packages/native/storybook/stories/message/Notification/Notification.stories.tsx @@ -10,7 +10,11 @@ const NotificationSample = () => ( ( Date: Mon, 27 Jun 2022 10:54:44 +0200 Subject: [PATCH 30/83] LLM - Receive Flow - fixes in navigation and tokens --- .../src/components/TabBar/TransferDrawer.tsx | 5 ++--- .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 2 +- .../src/screens/ReceiveFunds/02-AddAccount.tsx | 9 ++++++--- .../{NotSyncedWarning.js => NotSyncedWarning.tsx} | 0 4 files changed, 9 insertions(+), 7 deletions(-) rename apps/ledger-live-mobile/src/screens/ReceiveFunds/{NotSyncedWarning.js => NotSyncedWarning.tsx} (100%) diff --git a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx index 9d4e3273f4a7..8aa8fbfca1fc 100644 --- a/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx +++ b/apps/ledger-live-mobile/src/components/TabBar/TransferDrawer.tsx @@ -57,8 +57,7 @@ export default function TransferDrawer({ onClose }: ModalProps) { [onNavigate], ); const onReceiveFunds = useCallback( - () => - onNavigate(NavigatorName.ReceiveFunds), + () => onNavigate(NavigatorName.ReceiveFunds), [onNavigate], ); const onSwap = useCallback( @@ -115,7 +114,7 @@ export default function TransferDrawer({ onClose }: ModalProps) { }} title={t("transfer.receive.title")} description={t("transfer.receive.description")} - onPress={accountsCount > 0 ? onReceiveFunds : null} + onPress={onReceiveFunds} Icon={Icons.ArrowBottomMedium} disabled={readOnlyModeEnabled} /> diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index 0b332d3d2aff..c3685bdd6ec6 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -96,7 +96,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { }); } else { navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { - currency: currency.parentCurrency, + currency, createTokenAccount: true }); } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index a946776f44d0..f85f96d78858 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -98,7 +98,10 @@ function AddAccountsAccounts({ }, []); const startSubscription = useCallback(() => { - const bridge = getCurrencyBridge(currency); + const c = currency.type === "TokenCurrency" + ? currency.parentCurrency + : currency; + const bridge = getCurrencyBridge(c); const syncConfig = { paginationConfig: { operation: 0, @@ -108,9 +111,9 @@ function AddAccountsAccounts({ // will be set to false if an existing account is found scanSubscription.current = concat( - from(prepareCurrency(currency)).pipe(ignoreElements()), + from(prepareCurrency(c)).pipe(ignoreElements()), bridge.scanAccounts({ - currency, + currency: c, deviceId, syncConfig, }), diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.js b/apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.tsx similarity index 100% rename from apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.js rename to apps/ledger-live-mobile/src/screens/ReceiveFunds/NotSyncedWarning.tsx From eb218f3f9ecf4045446c64938bc134835e4fc08c Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Mon, 27 Jun 2022 14:00:51 +0200 Subject: [PATCH 31/83] LLM - Receive Flow - add accounts step fix some ts and lint issues --- .../src/components/LText/index.tsx | 11 +- .../screens/ReceiveFunds/02-AddAccount.tsx | 278 +++++++----------- 2 files changed, 122 insertions(+), 167 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/LText/index.tsx b/apps/ledger-live-mobile/src/components/LText/index.tsx index 727d8e0d797a..34b5a2810c37 100644 --- a/apps/ledger-live-mobile/src/components/LText/index.tsx +++ b/apps/ledger-live-mobile/src/components/LText/index.tsx @@ -1,18 +1,22 @@ import React, { useMemo, memo } from "react"; import { Text } from "@ledgerhq/native-ui"; +import { BaseTextProps } from "@ledgerhq/native-ui/components/Text"; import { FontWeightTypes } from "@ledgerhq/native-ui/components/Text/getTextStyle"; import getFontStyle from "./getFontStyle"; export { getFontStyle }; -export type Opts = { +export type Opts = BaseTextProps & { bold?: boolean; semiBold?: boolean; secondary?: boolean; monospace?: boolean; color?: string; bg?: string; + fontSize?: string; children?: React.ReactNode; + variant?: string; + fontFamily?: string; }; export type Res = { @@ -31,7 +35,10 @@ export type Res = { | "900"; }; -const inferFontWeight = ({ semiBold, bold }: Opts): FontWeightTypes => { +const inferFontWeight = ({ + semiBold, + bold, +}: Partial): FontWeightTypes => { if (bold) { return "bold"; } diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index f85f96d78858..f1dd57465223 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -1,67 +1,39 @@ -import React, { - PureComponent, - useEffect, - useCallback, - useState, - useRef, - memo, - useMemo, -} from "react"; -import { StyleSheet, SafeAreaView, FlatList } from "react-native"; +import React, { useEffect, useCallback, useState, useRef, memo } from "react"; +import { FlatList } from "react-native"; import { concat, from } from "rxjs"; import { ignoreElements } from "rxjs/operators"; -import { connect, useDispatch } from "react-redux"; -import { compose } from "redux"; +import { useDispatch } from "react-redux"; +import { useTranslation } from "react-i18next"; import { - isAccountEmpty, - groupAddAccounts, -} from "@ledgerhq/live-common/lib/account"; -import type { AddAccountSupportLink } from "@ledgerhq/live-common/lib/account/addAccounts"; -import { createStructuredSelector } from "reselect"; -import uniq from "lodash/uniq"; -import { Trans, useTranslation } from "react-i18next"; -import type { CryptoCurrency, Account, Currency, AccountLike } from "@ledgerhq/live-common/lib/types"; + CryptoCurrency, + Account, + Currency, + AccountLike, + TokenCurrency, +} from "@ledgerhq/live-common/lib/types"; import { getCurrencyBridge } from "@ledgerhq/live-common/lib/bridge"; -import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; +import { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; -import type { DerivationMode } from "@ledgerhq/live-common/lib/derivation"; - -import { useTheme } from "@react-navigation/native"; import { Flex, InfiniteLoader } from "@ledgerhq/native-ui"; import { replaceAccounts } from "../../actions/accounts"; -import { accountsSelector } from "../../reducers/accounts"; import logger from "../../logger"; -import { withTheme } from "../../colors"; import { ScreenName } from "../../const"; import { TrackScreen } from "../../analytics"; import Button from "../../components/Button"; import PreventNativeBack from "../../components/PreventNativeBack"; -import SelectableAccountsList from "../../components/SelectableAccountsList"; -import LiveLogo from "../../icons/LiveLogoIcon"; -import IconPause from "../../icons/Pause"; -import ExternalLink from "../../icons/ExternalLink"; -import Chevron from "../../icons/Chevron"; -import Info from "../../icons/Info"; -import Spinning from "../../components/Spinning"; import LText from "../../components/LText"; import RetryButton from "../../components/RetryButton"; import CancelButton from "../../components/CancelButton"; import GenericErrorBottomModal from "../../components/GenericErrorBottomModal"; -import NavigationScrollView from "../../components/NavigationScrollView"; import { prepareCurrency } from "../../bridge/cache"; -import { blacklistedTokenIdsSelector } from "../../reducers/settings"; -import BottomModal from "../../components/BottomModal"; -import { urls } from "../../config/urls"; import AccountCard from "../../components/AccountCard"; type RouteParams = { - currency: CryptoCurrency, - device: Device, - onSuccess?: (params?: any) => void, + currency: CryptoCurrency | TokenCurrency; + device: Device; + onSuccess?: (params?: any) => void; }; -type OwnProps = {}; - type Props = { navigation: any; route: { params: RouteParams }; @@ -69,27 +41,20 @@ type Props = { colors: any; }; - - -function AddAccountsAccounts({ - navigation, - route, -}: Props) { - const { colors } = useTheme(); +function AddAccountsAccounts({ navigation, route }: Props) { const dispatch = useDispatch(); - const {t} = useTranslation(); + const { t } = useTranslation(); const [scanning, setScanning] = useState(true); const [error, setError] = useState(null); - const [scannedAccounts, setScannedAccounts] = useState([]); + const [scannedAccounts, setScannedAccounts] = useState([]); const [cancelled, setCancelled] = useState(false); - const scanSubscription = useRef(); + const scanSubscription = useRef(); const { currency, device: { deviceId }, - device } = route.params || {}; useEffect(() => { @@ -98,9 +63,8 @@ function AddAccountsAccounts({ }, []); const startSubscription = useCallback(() => { - const c = currency.type === "TokenCurrency" - ? currency.parentCurrency - : currency; + const c = + currency.type === "TokenCurrency" ? currency.parentCurrency : currency; const bridge = getCurrencyBridge(c); const syncConfig = { paginationConfig: { @@ -119,7 +83,7 @@ function AddAccountsAccounts({ }), ).subscribe({ next: ({ account }) => { - setScannedAccounts((accs) => [...accs, account]) + setScannedAccounts((accs: Account[]) => [...accs, account]); }, complete: () => setScanning(false), error: error => { @@ -137,7 +101,7 @@ function AddAccountsAccounts({ startSubscription(); }, []); - const stopSubscription = useCallback((syncUI?: boolean = true) => { + const stopSubscription = useCallback((syncUI: boolean = true) => { if (scanSubscription.current) { scanSubscription.current.unsubscribe(); scanSubscription.current = null; @@ -160,8 +124,17 @@ function AddAccountsAccounts({ const selectAccount = useCallback( (account: Account) => { - dispatch(replaceAccounts({ scannedAccounts, selectedIds: [account.id], renamings: {}})); - navigation.navigate(ScreenName.ReceiveConfirmation, {...route.params, accountId: account.id }); + dispatch( + replaceAccounts({ + scannedAccounts, + selectedIds: [account.id], + renamings: {}, + }), + ); + navigation.navigate(ScreenName.ReceiveConfirmation, { + ...route.params, + accountId: account.id, + }); }, [dispatch, navigation, route.params, scannedAccounts], ); @@ -175,131 +148,106 @@ function AddAccountsAccounts({ [selectAccount], ); - const renderHeader = useCallback(() => - - {t("transfer.receive.selectAccount.title")} - {t("transfer.receive.selectAccount.subtitle", {currencyTicker: currency.ticker})} - - , [currency.ticker, t]) + const renderHeader = useCallback( + () => ( + + + {t("transfer.receive.selectAccount.title")} + + + {t("transfer.receive.selectAccount.subtitle", { + currencyTicker: currency.ticker, + })} + + + ), + [currency.ticker, t], + ); const keyExtractor = useCallback(item => item?.id, []); return ( - + <> - {scanning ? : ( - - )} + {scanning ? ( + + ) : ( + + )} - - + + } /> - + ); } -function ScanLoading({ currency, scannedAccounts, stopSubscription }: {currency: Currency, scannedAccounts: Account[], stopSubscription: () => void}) { +function ScanLoading({ + currency, + scannedAccounts, + stopSubscription, +}: { + currency: Currency; + scannedAccounts: Account[]; + stopSubscription: () => void; +}) { const { t } = useTranslation(); - return ( - <> - - - {t("transfer.receive.addAccount.title")} - {t("transfer.receive.addAccount.subtitle", {currencyTicker: currency?.ticker})} - - - { - scannedAccounts?.length > 0 ? <> - {t("transfer.receive.addAccount.foundAccounts", {count: scannedAccounts?.length})} - - : null - } - - - ); - } - -const styles = StyleSheet.create({ - root: { - flex: 1, - }, - paddingHorizontal: { - paddingHorizontal: 16, - }, - inner: { - paddingTop: 24, - }, - innerContent: { - paddingBottom: 24, - }, - descText: { - paddingHorizontal: 16, - marginBottom: 16, - textAlign: "center", - }, - scanLoadingRoot: { - flexDirection: "row", - marginHorizontal: 16, - marginBottom: 16, - alignItems: "center", - justifyContent: "center", - height: 40, - borderWidth: 1, - borderStyle: "dashed", - borderRadius: 4, - }, - scanLoadingText: { - fontSize: 14, - marginLeft: 8, - }, - footer: { - borderTopWidth: 1, - padding: 16, - }, - addAccountsError: { - marginHorizontal: 16, - marginBottom: 16, - }, - button: { - flex: 1, - marginHorizontal: 8, - }, - buttonRight: { - marginLeft: 8, - }, - smallMarginBottom: { marginBottom: 8 }, - moreAddressTypesContainer: { paddingHorizontal: 16, marginBottom: 32 }, - subtitle: { fontSize: 14 }, - title: { fontSize: 16 }, - modalTitle: { fontSize: 20 }, - modal: { paddingHorizontal: 24 }, - modalContainer: { - marginTop: 24, - marginBottom: 16, - alignItems: "center", - justifyContent: "center", - }, - modalRow: { marginVertical: 16 }, -}); + return ( + <> + + + + {t("transfer.receive.addAccount.title")} + + + {t("transfer.receive.addAccount.subtitle", { + currencyTicker: currency?.ticker, + })} + + + + {scannedAccounts?.length > 0 ? ( + <> + + {t("transfer.receive.addAccount.foundAccounts", { + count: scannedAccounts?.length, + })} + + + + ) : null} + + + ); +} -export default AddAccountsAccounts; +export default memo(AddAccountsAccounts); From 5b61757b18ad899296a917f2fdb2d2dd28251bd3 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Fri, 1 Jul 2022 09:57:31 +0200 Subject: [PATCH 32/83] replace receive flow navigator --- .../RootNavigator/BaseNavigator.tsx | 3 +- .../NewReceiveFundsNavigator.tsx | 119 ------------------ .../RootNavigator/ReceiveFundsNavigator.tsx | 94 +++++++++----- 3 files changed, 64 insertions(+), 152 deletions(-) delete mode 100644 apps/ledger-live-mobile/src/components/RootNavigator/NewReceiveFundsNavigator.tsx diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx index aca54a36659c..d4277e1ef0d7 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx @@ -26,7 +26,6 @@ import { ErrorHeaderInfo } from "./BaseOnboardingNavigator"; import SettingsNavigator from "./SettingsNavigator"; import BuyDeviceNavigator from "./BuyDeviceNavigator"; import ReceiveFundsNavigator from "./ReceiveFundsNavigator"; -import NewReceiveFundsNavigator from "./NewReceiveFundsNavigator"; import SendFundsNavigator from "./SendFundsNavigator"; import SignMessageNavigator from "./SignMessageNavigator"; import SignTransactionNavigator from "./SignTransactionNavigator"; @@ -151,7 +150,7 @@ export default function BaseNavigator() { /> getStackNavigatorConfig(colors, true), - [colors], - ); - return ( - - {/* Select Crypto (see : apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.js) */} - - - {/* Select Account */} - - - {/* Select Account */} - ( - - ), - }} - /> - - {/* Select Account */} - - - {/* Select / Connect Device */} - ( - - ), - }} - /> - {/* Select / Connect Device */} - - {/* Add account(s) automatically */} - {/* Receive Address */} - - {/* Receive Address Device Verification */} - - ); -} - -const Stack = createStackNavigator(); diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 63ab0a32433c..b22211709a4c 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -2,27 +2,28 @@ import React, { useMemo } from "react"; import { Platform } from "react-native"; import { createStackNavigator } from "@react-navigation/stack"; -import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; +import { useTranslation } from "react-i18next"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; -import ReceiveConnectDevice from "../../screens/ReceiveFunds/02-ConnectDevice"; -import ReceiveSelectAccount from "../../screens/SelectAccount"; +import ReceiveConnectDevice from "../../screens/ReceiveFunds/03a-ConnectDevice"; +import ReceiveVerifyAddress from "../../screens/ReceiveFunds/03b-VerifyAddress"; +import ReceiveSelectCrypto from "../../screens/ReceiveFunds/01-SelectCrypto"; + +import ReceiveAddAccountSelectDevice from "../../screens/ReceiveFunds/02-AddAccountSelectDevice"; +import ReceiveSelectAccount from "../../screens/ReceiveFunds/02-SelectAccount"; +import ReceiveAddAccount from "../../screens/ReceiveFunds/02-AddAccount"; + import { getStackNavigatorConfig } from "../../navigation/navigatorConfig"; import StepHeader from "../StepHeader"; -import { useNoNanoBuyNanoWallScreenOptions } from "../../context/NoNanoBuyNanoWall"; - -const totalSteps = "3"; export default function ReceiveFundsNavigator() { - const { t } = useTranslation(); const { colors } = useTheme(); + const { t } = useTranslation(); const stackNavigationConfig = useMemo( () => getStackNavigatorConfig(colors, true), [colors], ); - const noNanoBuyNanoWallScreenOptions = useNoNanoBuyNanoWallScreenOptions(); - return ( + {/* Select Crypto (see : apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.js) */} + + + {/* Select Account */} + + {/* Select Account */} + ( ), }} - initialParams={{ - next: ScreenName.ReceiveConnectDevice, - category: "ReceiveFunds", + /> + + {/* Select Account */} + + + {/* Select / Connect Device */} ({ + options={{ headerTitle: () => ( ), - })} + }} /> + {/* Select / Connect Device */} + + {/* Add account(s) automatically */} + {/* Receive Address */} ( - - ), + headerTitle: "", }} /> + {/* Receive Address Device Verification */} ); } From d6750221bb89affc29248cb08e253121fe5d14fb Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Fri, 1 Jul 2022 10:54:13 +0200 Subject: [PATCH 33/83] LIVE-2795-Hide "continue without my device" --- .../src/screens/ReceiveFunds/03a-ConnectDevice.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx index ab2b981f8629..58025f9e777c 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx @@ -128,8 +128,6 @@ export default function ConnectDevice({ navigation, route }: Props) { Date: Tue, 5 Jul 2022 13:18:12 +0200 Subject: [PATCH 34/83] LIVE-2878 - Fix blockain synchro screen --- apps/ledger-live-mobile/src/locales/en/common.json | 4 ++-- .../src/screens/ReceiveFunds/02-AddAccount.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index f30df41b43bd..57c8a75fd6d1 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2169,8 +2169,8 @@ "subtitle": "Your {{currencyTicker}} will be deposited into this account." }, "addAccount": { - "title": "Blockchain synchronization", - "subtitle": "We are verifying if you already have an {{currencyTicker}} account on blockchain.", + "title": "Searching the blockchain", + "subtitle": "Checking to see if you already own {{currencyTicker}} accounts.", "foundAccounts": "{{count}} accounts found", "stopSynchronization": "Stop synchronization" }, diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index f1dd57465223..ea6a7c1aed93 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -217,7 +217,7 @@ function ScanLoading({ <> - + {t("transfer.receive.addAccount.title")} From 10ec659362e5177d4865471f8483b0714e75d31e Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 5 Jul 2022 13:22:46 +0200 Subject: [PATCH 35/83] LIVE-2880 - fix color naming prop --- .../src/screens/ReceiveFunds/02-AddAccount.tsx | 2 +- .../src/screens/ReceiveFunds/02-SelectAccount.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index ea6a7c1aed93..e5574335cf74 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -154,7 +154,7 @@ function AddAccountsAccounts({ navigation, route }: Props) { {t("transfer.receive.selectAccount.title")} - + {t("transfer.receive.selectAccount.subtitle", { currencyTicker: currency.ticker, })} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 68ef547e87e8..4038dafa6908 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -88,7 +88,7 @@ function ReceiveSelectAccount({ navigation, route }: Props) { {t("transfer.receive.selectAccount.title")} - + {t("transfer.receive.selectAccount.subtitle", { currencyTicker: currency.ticker, })} From 942defc55940c986075f0a343718e91652838214 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 5 Jul 2022 15:58:37 +0200 Subject: [PATCH 36/83] LIVE-2825 - UI polish --- .../src/components/CopyLink.js | 84 ------------------- .../src/locales/en/common.json | 2 +- .../screens/ReceiveFunds/03-Confirmation.tsx | 10 +-- 3 files changed, 6 insertions(+), 90 deletions(-) delete mode 100644 apps/ledger-live-mobile/src/components/CopyLink.js diff --git a/apps/ledger-live-mobile/src/components/CopyLink.js b/apps/ledger-live-mobile/src/components/CopyLink.js deleted file mode 100644 index 7e83cca06f04..000000000000 --- a/apps/ledger-live-mobile/src/components/CopyLink.js +++ /dev/null @@ -1,84 +0,0 @@ -// @flow - -import React, { PureComponent } from "react"; -import { StyleSheet } from "react-native"; -import Clipboard from "@react-native-community/clipboard"; -import { Icons, Text } from "@ledgerhq/native-ui"; -import Touchable from "./Touchable"; -import { withTheme } from "../colors"; - -type Props = { - style?: *, - children: string | React$Element<*>, - string: string, // String to be copied - replacement?: string | React$Element<*>, // String to display in place of children on copy - colors: *, -}; - -type State = { - copied: boolean, -}; - -class CopyLink extends PureComponent { - state = { - copied: false, - }; - - timeout = null; - - onPress = () => { - const { string } = this.props; - - Clipboard.setString(string); - - this.setState({ copied: true }); - - this.timeout = setTimeout(() => { - this.setState({ copied: false }); - }, 3000); - }; - - render() { - const { style, children, replacement } = this.props; - const { copied } = this.state; - return ( - - - - {copied && replacement ? replacement : children} - - - ); - } - - componentWillUnmount() { - if (this.timeout) { - clearTimeout(this.timeout); - } - } -} - -export default withTheme(CopyLink); - -const styles = StyleSheet.create({ - linkContainer: { - alignItems: "center", - justifyContent: "center", - flexDirection: "row", - }, - linkText: { - marginLeft: 6, - }, -}); diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index 57c8a75fd6d1..f8f87c193613 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -2207,7 +2207,7 @@ "toastMessages": { "accountImported": "We've imported a {{currencyTicker}} account for you. ", "why": "Tell me why.", - "addressVerified": "Your address is now verified" + "addressVerified": "Your address is verified" }, "additionalInfoModal": { "title": "Why we imported an account?", diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 5d26e096d97d..98c2b7788e34 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -17,6 +17,8 @@ import { } from "@ledgerhq/live-common/lib/account"; import { useTheme } from "styled-components/native"; import { Flex, Text, Icons, Button, Notification } from "@ledgerhq/native-ui"; +import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import CurrencyIcon from "../../components/CurrencyIcon"; @@ -24,8 +26,6 @@ import CopyLink from "../../components/CopyLink"; import NavigationScrollView from "../../components/NavigationScrollView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; @@ -124,7 +124,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { if (!account || !currency || !mainAccount) return null; return ( - + @@ -203,8 +203,8 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { + m={6} + > {isToastDisplayed ? ( Date: Wed, 6 Jul 2022 08:51:34 +0200 Subject: [PATCH 37/83] LIVE-2828 - make the parent accounts visible on QA too --- .../src/screens/ReceiveFunds/02-SelectAccount.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 4038dafa6908..4e28428a4b81 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -68,8 +68,8 @@ function ReceiveSelectAccount({ navigation, route }: Props) { {account.parentAccount.name} + (account.parentAccount || account.token?.parentCurrency) ? ( + {(account.parentAccount || account.token.parentCurrency).name} ) : null } onPress={() => selectAccount(account)} From 91526f59e2827caa59dd601424ed5e71befd4ce1 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 6 Jul 2022 14:34:27 +0200 Subject: [PATCH 38/83] ConnectDevice not skippable by default --- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 5 +++-- .../src/screens/ReceiveFunds/03a-ConnectDevice.tsx | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 98c2b7788e34..b0b6ec190bfd 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -80,11 +80,12 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, [setIsAddionalInfoModalOpen]); const onRetry = useCallback(() => { + const params = {...route.params, notSkippable: true} if (isModalOpened) { setIsModalOpened(false); - onModalHide.current = () => navigation.navigate(ScreenName.ReceiveConnectDevice, route.params); + onModalHide.current = () => navigation.navigate(ScreenName.ReceiveConnectDevice, params); } else { - navigation.navigate(ScreenName.ReceiveConnectDevice, route.params); + navigation.navigate(ScreenName.ReceiveConnectDevice, params); } }, [isModalOpened, navigation, route.params]) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx index 3ef3c0d51d8f..ee0d9b3ee4b4 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx @@ -23,7 +23,6 @@ import ReadOnlyWarning from "./ReadOnlyWarning"; import NotSyncedWarning from "./NotSyncedWarning"; import GenericErrorView from "../../components/GenericErrorView"; import DeviceActionModal from "../../components/DeviceActionModal"; -import { renderVerifyAddress } from "../../components/DeviceAction/rendering"; import SkipSelectDevice from "../SkipSelectDevice"; type Props = { @@ -35,6 +34,7 @@ type RouteParams = { account?: AccountLike, accountId: string, parentId?: string, + notSkippable?: boolean, title: string, appName?: string, onSuccess?: () => void, @@ -128,6 +128,7 @@ export default function ConnectDevice({ navigation, route }: Props) { Date: Tue, 12 Jul 2022 18:08:49 +0200 Subject: [PATCH 39/83] bugfix/LIVE-2836-fix-ratings-drawer-conflict-with-receive-flow done --- .../src/components/RootNavigator/ReceiveFundsNavigator.tsx | 1 + apps/ledger-live-mobile/src/reducers/ratings.js | 2 +- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index b22211709a4c..8c07ef6c0e7f 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -109,6 +109,7 @@ export default function ReceiveFundsNavigator() { component={ReceiveConfirmation} options={{ headerTitle: "", + headerLeft: null, }} /> {/* Receive Address Device Verification */} diff --git a/apps/ledger-live-mobile/src/reducers/ratings.js b/apps/ledger-live-mobile/src/reducers/ratings.js index aa296417cc08..f912e370f93e 100644 --- a/apps/ledger-live-mobile/src/reducers/ratings.js +++ b/apps/ledger-live-mobile/src/reducers/ratings.js @@ -30,7 +30,7 @@ const handlers: Object = { ...state, isRatingsModalOpen, }), - RATINGS_SET_CURRENT_ROUTE: ( + RATINGS_SET_CURRENT_ROUTE_NAME: ( state: RatingsState, { currentRouteName }: { currentRouteName?: string }, ) => ({ diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index b0b6ec190bfd..2353becd91b8 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -28,6 +28,7 @@ import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; +import PreventNativeBack from "../../components/PreventNativeBack"; type Props = { account?: (TokenAccount | Account), @@ -126,6 +127,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { return ( + From 8253bf88b2323b76e0def1702fb6289e86f66ad7 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 12 Jul 2022 19:41:24 +0200 Subject: [PATCH 40/83] cherry pick route hooks --- apps/ledger-live-mobile/src/helpers/routeHooks.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/ledger-live-mobile/src/helpers/routeHooks.ts diff --git a/apps/ledger-live-mobile/src/helpers/routeHooks.ts b/apps/ledger-live-mobile/src/helpers/routeHooks.ts new file mode 100644 index 000000000000..2b89706e3fde --- /dev/null +++ b/apps/ledger-live-mobile/src/helpers/routeHooks.ts @@ -0,0 +1,11 @@ +import { useNavigationState } from "@react-navigation/native"; + +function usePreviousRouteName() { + return useNavigationState(state => state.routes[state.index - 1]?.name); +} + +function useCurrentRouteName() { + return useNavigationState(state => state.routes[state.index]?.name); +} + +export { usePreviousRouteName, useCurrentRouteName }; From 2fa72a8f967174e9923885deebf750074bb98534 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 12 Jul 2022 19:42:55 +0200 Subject: [PATCH 41/83] select crypto analytics --- .../src/components/FilteredSearchBar.tsx | 16 ++++++++++++++-- .../RootNavigator/ReceiveFundsNavigator.tsx | 14 +++++++++++++- .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 12 ++++++++---- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx index 2e42e9a44088..e0612602b8cf 100644 --- a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx +++ b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx @@ -1,9 +1,13 @@ -import React, { ReactNode, useState, memo } from "react"; +import React, { ReactNode, useState, memo, useCallback } from "react"; import { SearchInput, Flex } from "@ledgerhq/native-ui"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; +import { useRoute } from "@react-navigation/native"; +import { useDebounce } from "@ledgerhq/live-common/lib/hooks/useDebounce"; import Search from "./Search"; +import { track } from "../analytics"; +import { ScreenName } from "../const"; type Props = { initialQuery?: string; @@ -25,13 +29,21 @@ const FilteredSearchBar = ({ const { t } = useTranslation(); const { colors } = useTheme(); const [query, setQuery] = useState(initialQuery || ""); + const route = useRoute(); + + const onChange = useDebounce((newQuery: string) => { + setQuery(newQuery); + if (route.name === ScreenName.ReceiveSelectCrypto) { + track("search_clicked", { input: newQuery, screen: route.name }); + } + }, 200); return ( <> getStackNavigatorConfig(colors, true), [colors], ); + + const onSelectCryptoClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveSelectCrypto, + }); + }, []); + return ( , }} /> diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index c3685bdd6ec6..a2ced0adbadd 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -16,13 +16,15 @@ import { import {Flex } from "@ledgerhq/native-ui"; import { useSelector } from "react-redux"; import { Account, TokenAccount } from "@ledgerhq/live-common/src/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { useRoute } from "@react-navigation/native"; import { ScreenName } from "../../const"; -import { TrackScreen } from "../../analytics"; +import { track, TrackScreen } from "../../analytics"; import FilteredSearchBar from "../../components/FilteredSearchBar"; import CurrencyRow from "../../components/CurrencyRow"; import LText from "../../components/LText"; import { flattenAccountsSelector } from "../../reducers/accounts"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; const SEARCH_KEYS = ["name", "ticker"]; @@ -51,6 +53,7 @@ const findAccountByCurrency = (accounts: (TokenAccount | Account)[], currency: C export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const {t } = useTranslation(); + const routerRoute = useRoute() const { filterCurrencyIds = [] } = route.params || {}; const cryptoCurrencies = useMemo( () => @@ -68,7 +71,8 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const sortedCryptoCurrencies = useCurrenciesByMarketcap(cryptoCurrencies); const onPressItem = useCallback((currency: CryptoCurrency | TokenCurrency) => { - + track('currency_clicked', {screen: routerRoute.name, currency: currency.name}) + const accs = findAccountByCurrency(accounts, currency); if(accs.length > 1) { navigation.navigate(ScreenName.ReceiveSelectAccount, { @@ -123,7 +127,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { return ( <> - + {t("transfer.receive.selectCrypto.title")} Date: Tue, 12 Jul 2022 19:43:06 +0200 Subject: [PATCH 42/83] connect device analytics --- .../RootNavigator/ReceiveFundsNavigator.tsx | 16 ++++++++++++++++ .../src/components/SelectDevice/index.tsx | 6 ++++++ .../screens/ReceiveFunds/03a-ConnectDevice.tsx | 6 ++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 2023f0fb1ee6..f9b3696b9512 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -35,6 +35,20 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onConnectDeviceClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveConnectDevice, + }); + }, []); + + const onConnectDeviceBack = useCallback(() => { + track("button_clicked", { + button: "Back arrow", + screen: ScreenName.ReceiveConnectDevice, + }); + }, []); + return ( ), + headerRight: , + headerLeft: , }} /> {/* Select / Connect Device */} diff --git a/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx b/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx index d00af38a5af2..a5958c5dc876 100644 --- a/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx +++ b/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx @@ -5,6 +5,7 @@ import { useSelector, useDispatch } from "react-redux"; import { Trans } from "react-i18next"; import { useNavigation, + useRoute, useTheme as useNavTheme, } from "@react-navigation/native"; import { @@ -56,6 +57,7 @@ export default function SelectDevice({ const navigation = useNavigation(); const knownDevices = useSelector(knownDevicesSelector); const dispatch = useDispatch(); + const route = useRoute(); const handleOnSelect = useCallback( deviceInfo => { @@ -93,6 +95,10 @@ export default function SelectDevice({ const [devices, setDevices] = useState([]); const onPairNewDevice = useCallback(() => { + track("button_clicked", { + button: "Pair with bluetooth", + screen: route.name, + }); NativeModules.BluetoothHelperModule.prompt() .then(() => // @ts-expect-error navigation issue diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx index ee0d9b3ee4b4..6dbcdb85d7ef 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx @@ -13,6 +13,7 @@ import type { AccountLike } from "@ledgerhq/live-common/types/index"; import { createAction } from "@ledgerhq/live-common/hw/actions/app"; import connectApp from "@ledgerhq/live-common/hw/connectApp"; +import { useRoute } from "@react-navigation/native"; import { accountScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; import { TrackScreen } from "../../analytics"; @@ -48,6 +49,7 @@ export default function ConnectDevice({ navigation, route }: Props) { const { account, parentAccount } = useSelector(accountScreenSelector(route)); const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector); const [device, setDevice] = useState(); + const routerRoute = useRoute() useEffect(() => { const readOnlyTitle = "transfer.receive.titleReadOnly"; @@ -118,8 +120,8 @@ export default function ConnectDevice({ navigation, route }: Props) { <> Date: Wed, 13 Jul 2022 08:35:06 +0200 Subject: [PATCH 43/83] analytics select account --- .../components/RootNavigator/ReceiveFundsNavigator.tsx | 8 ++++++++ .../src/screens/ReceiveFunds/02-SelectAccount.tsx | 9 +++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index f9b3696b9512..3a1f2bf5a379 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -35,6 +35,13 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onSelectAccountClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveSelectAccount, + }); + }, []); + const onConnectDeviceClose = useCallback(() => { track("button_clicked", { button: "Close 'x'", @@ -73,6 +80,7 @@ export default function ReceiveFundsNavigator() { component={ReceiveSelectAccount} options={{ headerTitle: "", + headerRight: , }} /> diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 4e28428a4b81..69dd6e3a0000 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -8,9 +8,11 @@ import type { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/lib/account"; import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; -import { TrackScreen } from "../../analytics"; +import { track, TrackScreen } from "../../analytics"; import AccountCard from "../../components/AccountCard"; import LText from "../../components/LText"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; +import { useRoute } from "@react-navigation/native"; type Props = { navigation: any; @@ -18,7 +20,9 @@ type Props = { }; function ReceiveSelectAccount({ navigation, route }: Props) { + const lastRoute = usePreviousRouteName() const currency = route.params?.currency; + const routerRoute = useRoute() const { t } = useTranslation(); const accounts = useSelector( @@ -53,6 +57,7 @@ function ReceiveSelectAccount({ navigation, route }: Props) { const selectAccount = useCallback( (account: AccountLike) => { + track("account_clicked", { currency: currency.name, screen: routerRoute.name} navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, accountId: account?.parentId || account.id, @@ -83,7 +88,7 @@ function ReceiveSelectAccount({ navigation, route }: Props) { return aggregatedAccounts.length > 1 ? ( <> - + {t("transfer.receive.selectAccount.title")} From 1155839f87e4c26f3b2c8c6cff5afcde166591aa Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 13 Jul 2022 08:44:53 +0200 Subject: [PATCH 44/83] analytics initMessage --- .../ReceiveSecurityModal/InitMessage.tsx | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx index 9b37aa42b05a..12ff2d1a177d 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx @@ -3,6 +3,9 @@ import { TouchableOpacity } from "react-native"; import { Trans } from "react-i18next"; import styled from "styled-components/native"; import { Flex, Text, Button } from "@ledgerhq/native-ui"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../../analytics"; +import { usePreviousRouteName } from "../../../helpers/routeHooks"; const NotNowButton = styled(TouchableOpacity)` align-items: center; @@ -16,12 +19,33 @@ type Props = { }; const InitMessage = ({ setStep, onVerifyAddress }: Props) => { + const route = useRoute(); + const onDontVerify = useCallback(() => { + track("button_clicked", { + button: "Reveal my address without verifying", + screen: route.name, + drawer: "initMessage", + }); setStep("confirmUnverified"); - }, [setStep]); + }, [setStep, route]); + const handleVerifyAddress = useCallback(() => { + track("button_clicked", { + button: "Verify my address", + screen: route.name, + drawer: "initMessage", + }); + onVerifyAddress(); + }, [route, onVerifyAddress]); return ( + { - From 53c307436c599bc9b2e2bb86e418a5bdc99bee73 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 13 Jul 2022 08:51:49 +0200 Subject: [PATCH 45/83] analytics confirmUnverified --- .../ConfirmUnverified.tsx | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx index 8b74166bdc65..570b8c8cd5af 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx @@ -3,6 +3,9 @@ import { TouchableOpacity } from "react-native"; import { Trans } from "react-i18next"; import styled from "styled-components/native"; import { Flex, Text, Button, Checkbox } from "@ledgerhq/native-ui"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../../analytics"; +import { usePreviousRouteName } from "../../../helpers/routeHooks"; type Props = { closeModal: Function; @@ -15,23 +18,45 @@ const ConfirmUnverified = ({ setStep, setShouldNotRemindUserAgain, }: Props) => { + const route = useRoute(); const [doNotRemindUserAgain, setDoNotRemindUserAgain] = useState(false); const toggleDoNotRemindUserAgain = useCallback(() => { + track("button_clicked", { + button: "Do not remind me", + screen: route.name, + drawer: "confirmUnverified", + }); setDoNotRemindUserAgain(!doNotRemindUserAgain); - }, [doNotRemindUserAgain]); + }, [doNotRemindUserAgain, route]); const onGoBack = useCallback(() => { setStep("initMessage"); - }, [setStep]); + track("button_clicked", { + button: "No", + screen: route.name, + drawer: "confirmUnverified", + }); + }, [setStep, route]); const onCloseModal = useCallback(() => { + track("button_clicked", { + button: "Yes", + screen: route.name, + drawer: "confirmUnverified", + }); closeModal(); if (doNotRemindUserAgain) { setShouldNotRemindUserAgain(); } - }, [closeModal, doNotRemindUserAgain, setShouldNotRemindUserAgain]); + }, [closeModal, doNotRemindUserAgain, setShouldNotRemindUserAgain, route]); return ( + Date: Wed, 13 Jul 2022 09:00:38 +0200 Subject: [PATCH 46/83] analytics verify address --- .../RootNavigator/ReceiveFundsNavigator.tsx | 9 ++++++++- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 11 +++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 3a1f2bf5a379..17d1dd66f2f1 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -56,6 +56,13 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onVerifyAddressClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveVerifyAddress, + }); + }, []); + return ( , }} /> {/* Add account(s) automatically */} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index a6a0bc9bcb32..237a7f2d2672 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -18,8 +18,12 @@ import { import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; import type { DeviceModelId } from "@ledgerhq/devices"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; -import { useTheme } from "styled-components/native"; +import styled, { useTheme } from "styled-components/native"; import { Flex, Link as TextLink } from "@ledgerhq/native-ui"; +import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { track, TrackScreen } from "../../analytics"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import PreventNativeBack from "../../components/PreventNativeBack"; @@ -33,15 +37,12 @@ import { rejectionOp } from "../../logic/debugReject"; import GenericErrorView from "../../components/GenericErrorView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import LText from "../../components/LText"; import Button from "../../components/Button"; import Animation from "../../components/Animation"; import getDeviceAnimation from "../../components/DeviceAction/getDeviceAnimation"; -import styled from "styled-components/native"; import Illustration from "../../images/illustration/Illustration"; import { urls } from "../../config/urls"; @@ -85,6 +86,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const { t } = useTranslation(); const [verified, setVerified] = useState(false); const [error, setError] = useState(null); + const lastRoute = usePreviousRouteName(); const onModalClose = useCallback(() => { setError(null) @@ -172,6 +174,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { : + {t("transfer.receive.verifyAddress.title")} {t("transfer.receive.verifyAddress.subtitle")} From 1e309a250c8a473b36a175c50b0cd4e749fa8b57 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 13 Jul 2022 09:16:04 +0200 Subject: [PATCH 47/83] analytics confirmation --- .../src/components/CopyLink.tsx | 5 +-- .../RootNavigator/ReceiveFundsNavigator.tsx | 8 +++++ .../screens/ReceiveFunds/03-Confirmation.tsx | 34 ++++++++++++++++--- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/CopyLink.tsx b/apps/ledger-live-mobile/src/components/CopyLink.tsx index 5724dc970412..6190f90e447f 100644 --- a/apps/ledger-live-mobile/src/components/CopyLink.tsx +++ b/apps/ledger-live-mobile/src/components/CopyLink.tsx @@ -19,6 +19,7 @@ type Props = { */ replacement?: string | React.ReactNode; colors: any; + onCopy?: () => void; }; type State = { @@ -33,12 +34,12 @@ class CopyLink extends PureComponent { timeout = null; onPress = () => { - const { string } = this.props; + const { string, onCopy } = this.props; Clipboard.setString(string); this.setState({ copied: true }); - + onCopy && onCopy(); this.timeout = setTimeout(() => { this.setState({ copied: false }); }, 3000); diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 17d1dd66f2f1..b315ac16c5f9 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -63,6 +63,13 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onConfirmationClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveConfirmation, + }); + }, []); + return ( , }} /> {/* Receive Address Device Verification */} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index b0b6ec190bfd..f171106b9445 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -19,6 +19,7 @@ import { useTheme } from "styled-components/native"; import { Flex, Text, Icons, Button, Notification } from "@ledgerhq/native-ui"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { useRoute } from "@react-navigation/native"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import CurrencyIcon from "../../components/CurrencyIcon"; @@ -28,6 +29,8 @@ import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; +import { track, TrackScreen } from "../../analytics"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; type Props = { account?: (TokenAccount | Account), @@ -62,7 +65,9 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { const onModalHide = useRef(() => {}); const [isAddionalInfoModalOpen, setIsAddionalInfoModalOpen] = useState(false); const dispatch = useDispatch(); - + const lastRoute = usePreviousRouteName() + const routerRoute = useRoute(); + const hideToast = useCallback(() => { setIsToastDisplayed(false); }, []); @@ -71,15 +76,23 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, []); const openAdditionalInfoModal = useCallback(() => { + track("notification_clicked", { + button: "Imported and created account", + screen: routerRoute.name + }) setIsAddionalInfoModalOpen(true); hideToast(); - }, [setIsAddionalInfoModalOpen, hideToast]); + }, [setIsAddionalInfoModalOpen, hideToast, routerRoute.name]); const closeAdditionalInfoModal = useCallback(() => { setIsAddionalInfoModalOpen(false); }, [setIsAddionalInfoModalOpen]); const onRetry = useCallback(() => { + track("button_clicked", { + button: "Verify your address", + screen: routerRoute.name + }) const params = {...route.params, notSkippable: true} if (isModalOpened) { setIsModalOpened(false); @@ -87,7 +100,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { } else { navigation.navigate(ScreenName.ReceiveConnectDevice, params); } - }, [isModalOpened, navigation, route.params]) + }, [isModalOpened, navigation, route.params, routerRoute]) const { width } = getWindowDimensions(); const QRSize = Math.round(width / 1.8 - 16); @@ -117,16 +130,28 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, [verified]) const onShare = useCallback(() => { + track("button_clicked", { + button: "Share", + screen: routerRoute.name + }) if (mainAccount?.freshAddress) { Share.share({ message: mainAccount?.freshAddress }); } - }, [mainAccount?.freshAddress]); + }, [mainAccount?.freshAddress, routerRoute.name]); + + const onCopy = useCallback(() => { + track("button_clicked", { + button: "Copy", + screen: routerRoute.name + }) + }, [routerRoute.name]) if (!account || !currency || !mainAccount) return null; return ( + {t("transfer.receive.receiveConfirmation.title", { currencyTicker: currency.ticker })} @@ -192,6 +217,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { {mainAccount.freshAddress} } > From 277cdfcfc99ec26ac993c4a6fe37d9e144be4403 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 01:35:34 +0200 Subject: [PATCH 48/83] additional info analytics --- .../ReceiveFunds/AdditionalInfoModal.tsx | 97 ++++++++++++------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx index eb12c4001ed7..91ad04fbdc20 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx @@ -1,43 +1,72 @@ -import React from "react"; +import React, { useCallback } from "react"; import { Trans } from "react-i18next"; import { BottomDrawer, Flex, Text, Button } from "@ledgerhq/native-ui"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../analytics"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; -const AdditionalInfoModal = ({ - isOpen, - onClose, - currencyTicker, -}: { +type Props = { isOpen: boolean; onClose: () => void; currencyTicker: string; -}) => ( - - - - - - { + const route = useRoute(); + + const onUnderstood = useCallback(() => { + track("button_clicked", { + button: "Ok, got it", + screen: route.name, + drawer: "AdditionalInfoModal", + }); + onClose(); + }, [onClose, route.name]); + + const handleClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: route.name, + drawer: "AdditionalInfoModal", + }); + onClose(); + }, [onClose, route.name]); + + return ( + + - - - - - -); + + + + + + + + + + + ); +}; export default AdditionalInfoModal; From 43e565cf2a84121b75a1884feacf372c6e252f1b Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 01:48:56 +0200 Subject: [PATCH 49/83] User verifies address successfully analytics --- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 5 ++++- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index f171106b9445..b4f1ce65104b 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -127,7 +127,10 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { useEffect(() => { setIsVerifiedToastDisplayed(verified) - }, [verified]) + if(verified){ + track("Verification Success", { currency: currency.name }) + } + }, [verified, currency.name]) const onShare = useCallback(() => { track("button_clicked", { diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 237a7f2d2672..da4fa21a181e 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -36,7 +36,6 @@ import logger from "../../logger"; import { rejectionOp } from "../../logic/debugReject"; import GenericErrorView from "../../components/GenericErrorView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; -import AdditionalInfoModal from "./AdditionalInfoModal"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import LText from "../../components/LText"; From af7d2d65199a38f12a1c4f2a6b62b438476d3a13 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 01:52:42 +0200 Subject: [PATCH 50/83] remove unused --- .../ReceiveFunds/03b-VerifyAddress.tsx | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index da4fa21a181e..1f1cace13d02 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -1,9 +1,8 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; import { of } from "rxjs"; import { delay } from "rxjs/operators"; -import { TouchableOpacity, TouchableWithoutFeedback, Share, Linking } from "react-native"; -import { useDispatch, useSelector } from "react-redux"; -import QRCode from "react-native-qrcode-svg"; +import { TouchableOpacity, Linking } from "react-native"; +import { useSelector } from "react-redux"; import { useTranslation, Trans } from "react-i18next"; import type { Account, @@ -13,30 +12,19 @@ import type { import { getMainAccount, getAccountCurrency, - getAccountName, } from "@ledgerhq/live-common/lib/account"; import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; import type { DeviceModelId } from "@ledgerhq/devices"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import styled, { useTheme } from "styled-components/native"; -import { Flex, Link as TextLink } from "@ledgerhq/native-ui"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; -import { track, TrackScreen } from "../../analytics"; +import { Flex } from "@ledgerhq/native-ui"; +import { TrackScreen } from "../../analytics"; import { usePreviousRouteName } from "../../helpers/routeHooks"; -import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import PreventNativeBack from "../../components/PreventNativeBack"; -import BottomModal from "../../components/BottomModal"; -import CurrencyIcon from "../../components/CurrencyIcon"; -import CopyLink from "../../components/CopyLink"; -import NavigationScrollView from "../../components/NavigationScrollView"; import SkipLock from "../../components/behaviour/SkipLock"; import logger from "../../logger"; import { rejectionOp } from "../../logic/debugReject"; -import GenericErrorView from "../../components/GenericErrorView"; -import ReceiveSecurityModal from "./ReceiveSecurityModal"; -import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import LText from "../../components/LText"; import Button from "../../components/Button"; From fb75f72b35594cf5dd0a5e847b8f84f463da3dd5 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 02:13:03 +0200 Subject: [PATCH 51/83] verify adress analytics --- .../ReceiveFunds/03b-VerifyAddress.tsx | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 1f1cace13d02..cfce7a2e1fcb 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -18,7 +18,8 @@ import type { DeviceModelId } from "@ledgerhq/devices"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import styled, { useTheme } from "styled-components/native"; import { Flex } from "@ledgerhq/native-ui"; -import { TrackScreen } from "../../analytics"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../analytics"; import { usePreviousRouteName } from "../../helpers/routeHooks"; import { accountScreenSelector } from "../../reducers/accounts"; import PreventNativeBack from "../../components/PreventNativeBack"; @@ -73,6 +74,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const { t } = useTranslation(); const [verified, setVerified] = useState(false); const [error, setError] = useState(null); + const routerRoute = useRoute(); const lastRoute = usePreviousRouteName(); const onModalClose = useCallback(() => { @@ -116,19 +118,32 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const currency = route.params?.currency || (account && getAccountCurrency(account)); const onRetry = useCallback(() => { + track("button_clicked", { + button: "Retry", + screen: routerRoute.name + }) onModalClose(); if (device) { verifyOnDevice(device); } - },[device, onModalClose, verifyOnDevice]); + },[device, onModalClose, routerRoute.name, verifyOnDevice]); const goBack = useCallback(() => { + track("button_clicked", { + button: "Cancel", + screen: routerRoute.name + }) navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, verified: false }); - }, [navigation, route.params]); + }, [navigation, route.params, routerRoute.name]); const redirectToSupport = useCallback(() => { + track("message_clicked", { + message: "contact us asap", + screen: routerRoute.name, + url: urls.receiveVerifyAddress + }) Linking.openURL(urls.receiveVerifyAddress); - }, []); + }, [routerRoute.name]); useEffect(() => { if (device) { @@ -143,6 +158,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { { error ? <> + Date: Tue, 19 Jul 2022 09:38:58 +0200 Subject: [PATCH 52/83] refactoring onClose event --- .../RootNavigator/ReceiveFundsNavigator.tsx | 51 +++++-------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index b315ac16c5f9..457490679805 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -5,6 +5,7 @@ import { createStackNavigator } from "@react-navigation/stack"; import { useTheme } from "styled-components/native"; import { useTranslation } from "react-i18next"; import { HeaderBackButton } from "@react-navigation/elements"; +import { useRoute } from "@react-navigation/native"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/03a-ConnectDevice"; @@ -23,31 +24,22 @@ import { track } from "../../analytics"; export default function ReceiveFundsNavigator() { const { colors } = useTheme(); const { t } = useTranslation(); - const stackNavigationConfig = useMemo( - () => getStackNavigatorConfig(colors, true), - [colors], - ); + const route = useRoute(); - const onSelectCryptoClose = useCallback(() => { + const onClose = useCallback(() => { track("button_clicked", { button: "Close 'x'", - screen: ScreenName.ReceiveSelectCrypto, + screen: route.name, }); - }, []); + }, [route]); - const onSelectAccountClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveSelectAccount, - }); - }, []); - - const onConnectDeviceClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveConnectDevice, - }); - }, []); + const stackNavigationConfig = useMemo( + () => ({ + ...getStackNavigatorConfig(colors, true), + headerRight: () => , + }), + [colors, onClose], + ); const onConnectDeviceBack = useCallback(() => { track("button_clicked", { @@ -56,20 +48,6 @@ export default function ReceiveFundsNavigator() { }); }, []); - const onVerifyAddressClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveVerifyAddress, - }); - }, []); - - const onConfirmationClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveConfirmation, - }); - }, []); - return ( , }} /> @@ -94,7 +71,6 @@ export default function ReceiveFundsNavigator() { component={ReceiveSelectAccount} options={{ headerTitle: "", - headerRight: , }} /> @@ -138,7 +114,6 @@ export default function ReceiveFundsNavigator() { title={t("transfer.receive.stepperHeader.connectDevice")} /> ), - headerRight: , headerLeft: , }} /> @@ -149,7 +124,6 @@ export default function ReceiveFundsNavigator() { options={{ headerTitle: "", headerLeft: null, - headerRight: , }} /> {/* Add account(s) automatically */} @@ -159,7 +133,6 @@ export default function ReceiveFundsNavigator() { component={ReceiveConfirmation} options={{ headerTitle: "", - headerRight: , }} /> {/* Receive Address Device Verification */} From 8b789571d20ef8fdb5f10efd05ba0c38db298921 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 09:43:13 +0200 Subject: [PATCH 53/83] last route as variable --- .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 3 ++- .../src/screens/ReceiveFunds/AdditionalInfoModal.tsx | 3 ++- .../ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx | 3 ++- .../screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index a2ced0adbadd..bd550fe1aa61 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -55,6 +55,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const {t } = useTranslation(); const routerRoute = useRoute() const { filterCurrencyIds = [] } = route.params || {}; + const lastRoute = usePreviousRouteName() const cryptoCurrencies = useMemo( () => listSupportedCurrencies() @@ -127,7 +128,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { return ( <> - + {t("transfer.receive.selectCrypto.title")} { const route = useRoute(); + const lastRoute = usePreviousRouteName(); const onUnderstood = useCallback(() => { track("button_clicked", { @@ -37,7 +38,7 @@ const AdditionalInfoModal = ({ isOpen, onClose, currencyTicker }: Props) => { { const route = useRoute(); const [doNotRemindUserAgain, setDoNotRemindUserAgain] = useState(false); + const lastRoute = usePreviousRouteName(); const toggleDoNotRemindUserAgain = useCallback(() => { track("button_clicked", { button: "Do not remind me", @@ -55,7 +56,7 @@ const ConfirmUnverified = ({ category="ReceiveFunds" name="No Verification Confirmation" type="drawer" - source={usePreviousRouteName()} + source={lastRoute} /> { const route = useRoute(); + const lastRoute = usePreviousRouteName(); const onDontVerify = useCallback(() => { track("button_clicked", { @@ -43,7 +44,7 @@ const InitMessage = ({ setStep, onVerifyAddress }: Props) => { Date: Tue, 19 Jul 2022 10:01:51 +0200 Subject: [PATCH 54/83] fix source empty parameter --- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index cfce7a2e1fcb..5b93dfce2c08 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -158,7 +158,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { { error ? <> - + Date: Wed, 20 Jul 2022 08:58:42 +0200 Subject: [PATCH 55/83] remove debounce --- .../src/components/FilteredSearchBar.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx index e0612602b8cf..e216a3e5a202 100644 --- a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx +++ b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx @@ -4,7 +4,6 @@ import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import { useRoute } from "@react-navigation/native"; -import { useDebounce } from "@ledgerhq/live-common/lib/hooks/useDebounce"; import Search from "./Search"; import { track } from "../analytics"; import { ScreenName } from "../const"; @@ -31,12 +30,15 @@ const FilteredSearchBar = ({ const [query, setQuery] = useState(initialQuery || ""); const route = useRoute(); - const onChange = useDebounce((newQuery: string) => { - setQuery(newQuery); - if (route.name === ScreenName.ReceiveSelectCrypto) { - track("search_clicked", { input: newQuery, screen: route.name }); - } - }, 200); + const onChange = useCallback( + (newQuery: string) => { + setQuery(newQuery); + if (route.name === ScreenName.ReceiveSelectCrypto) { + track("search_clicked", { input: newQuery, screen: route.name }); + } + }, + [route.name], + ); return ( <> From a53863d3c1e118d2e88c478d251d429d37d9033f Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 20 Jul 2022 09:12:40 +0200 Subject: [PATCH 56/83] fix header left --- .../src/components/RootNavigator/ReceiveFundsNavigator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 7f215623e113..96ec939a74d1 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -114,7 +114,7 @@ export default function ReceiveFundsNavigator() { title={t("transfer.receive.stepperHeader.connectDevice")} /> ), - headerLeft: , + headerLeft: () => , }} /> {/* Select / Connect Device */} From 0748c7a6907253c1b0e6dd7554fdc1c5a0e1b38b Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 12 Jul 2022 19:42:55 +0200 Subject: [PATCH 57/83] select crypto analytics --- .../src/components/FilteredSearchBar.tsx | 16 ++++++++++++++-- .../RootNavigator/ReceiveFundsNavigator.tsx | 14 +++++++++++++- .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 12 ++++++++---- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx index 2e42e9a44088..e0612602b8cf 100644 --- a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx +++ b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx @@ -1,9 +1,13 @@ -import React, { ReactNode, useState, memo } from "react"; +import React, { ReactNode, useState, memo, useCallback } from "react"; import { SearchInput, Flex } from "@ledgerhq/native-ui"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; +import { useRoute } from "@react-navigation/native"; +import { useDebounce } from "@ledgerhq/live-common/lib/hooks/useDebounce"; import Search from "./Search"; +import { track } from "../analytics"; +import { ScreenName } from "../const"; type Props = { initialQuery?: string; @@ -25,13 +29,21 @@ const FilteredSearchBar = ({ const { t } = useTranslation(); const { colors } = useTheme(); const [query, setQuery] = useState(initialQuery || ""); + const route = useRoute(); + + const onChange = useDebounce((newQuery: string) => { + setQuery(newQuery); + if (route.name === ScreenName.ReceiveSelectCrypto) { + track("search_clicked", { input: newQuery, screen: route.name }); + } + }, 200); return ( <> getStackNavigatorConfig(colors, true), [colors], ); + + const onSelectCryptoClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveSelectCrypto, + }); + }, []); + return ( , }} /> diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index c3685bdd6ec6..a2ced0adbadd 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -16,13 +16,15 @@ import { import {Flex } from "@ledgerhq/native-ui"; import { useSelector } from "react-redux"; import { Account, TokenAccount } from "@ledgerhq/live-common/src/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { useRoute } from "@react-navigation/native"; import { ScreenName } from "../../const"; -import { TrackScreen } from "../../analytics"; +import { track, TrackScreen } from "../../analytics"; import FilteredSearchBar from "../../components/FilteredSearchBar"; import CurrencyRow from "../../components/CurrencyRow"; import LText from "../../components/LText"; import { flattenAccountsSelector } from "../../reducers/accounts"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; const SEARCH_KEYS = ["name", "ticker"]; @@ -51,6 +53,7 @@ const findAccountByCurrency = (accounts: (TokenAccount | Account)[], currency: C export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const {t } = useTranslation(); + const routerRoute = useRoute() const { filterCurrencyIds = [] } = route.params || {}; const cryptoCurrencies = useMemo( () => @@ -68,7 +71,8 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const sortedCryptoCurrencies = useCurrenciesByMarketcap(cryptoCurrencies); const onPressItem = useCallback((currency: CryptoCurrency | TokenCurrency) => { - + track('currency_clicked', {screen: routerRoute.name, currency: currency.name}) + const accs = findAccountByCurrency(accounts, currency); if(accs.length > 1) { navigation.navigate(ScreenName.ReceiveSelectAccount, { @@ -123,7 +127,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { return ( <> - + {t("transfer.receive.selectCrypto.title")} Date: Tue, 12 Jul 2022 19:43:06 +0200 Subject: [PATCH 58/83] connect device analytics --- .../RootNavigator/ReceiveFundsNavigator.tsx | 16 ++++++++++++++++ .../src/components/SelectDevice/index.tsx | 6 ++++++ .../screens/ReceiveFunds/03a-ConnectDevice.tsx | 6 ++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 5818ff365534..75f6f6dbdce7 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -35,6 +35,20 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onConnectDeviceClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveConnectDevice, + }); + }, []); + + const onConnectDeviceBack = useCallback(() => { + track("button_clicked", { + button: "Back arrow", + screen: ScreenName.ReceiveConnectDevice, + }); + }, []); + return ( ), + headerRight: , + headerLeft: , }} /> {/* Select / Connect Device */} diff --git a/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx b/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx index d00af38a5af2..a5958c5dc876 100644 --- a/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx +++ b/apps/ledger-live-mobile/src/components/SelectDevice/index.tsx @@ -5,6 +5,7 @@ import { useSelector, useDispatch } from "react-redux"; import { Trans } from "react-i18next"; import { useNavigation, + useRoute, useTheme as useNavTheme, } from "@react-navigation/native"; import { @@ -56,6 +57,7 @@ export default function SelectDevice({ const navigation = useNavigation(); const knownDevices = useSelector(knownDevicesSelector); const dispatch = useDispatch(); + const route = useRoute(); const handleOnSelect = useCallback( deviceInfo => { @@ -93,6 +95,10 @@ export default function SelectDevice({ const [devices, setDevices] = useState([]); const onPairNewDevice = useCallback(() => { + track("button_clicked", { + button: "Pair with bluetooth", + screen: route.name, + }); NativeModules.BluetoothHelperModule.prompt() .then(() => // @ts-expect-error navigation issue diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx index ee0d9b3ee4b4..6dbcdb85d7ef 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx @@ -13,6 +13,7 @@ import type { AccountLike } from "@ledgerhq/live-common/types/index"; import { createAction } from "@ledgerhq/live-common/hw/actions/app"; import connectApp from "@ledgerhq/live-common/hw/connectApp"; +import { useRoute } from "@react-navigation/native"; import { accountScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; import { TrackScreen } from "../../analytics"; @@ -48,6 +49,7 @@ export default function ConnectDevice({ navigation, route }: Props) { const { account, parentAccount } = useSelector(accountScreenSelector(route)); const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector); const [device, setDevice] = useState(); + const routerRoute = useRoute() useEffect(() => { const readOnlyTitle = "transfer.receive.titleReadOnly"; @@ -118,8 +120,8 @@ export default function ConnectDevice({ navigation, route }: Props) { <> Date: Wed, 13 Jul 2022 08:35:06 +0200 Subject: [PATCH 59/83] analytics select account --- .../components/RootNavigator/ReceiveFundsNavigator.tsx | 8 ++++++++ .../src/screens/ReceiveFunds/02-SelectAccount.tsx | 9 +++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 75f6f6dbdce7..9bb2fc57e17a 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -35,6 +35,13 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onSelectAccountClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveSelectAccount, + }); + }, []); + const onConnectDeviceClose = useCallback(() => { track("button_clicked", { button: "Close 'x'", @@ -73,6 +80,7 @@ export default function ReceiveFundsNavigator() { component={ReceiveSelectAccount} options={{ headerTitle: "", + headerRight: , }} /> diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 4e28428a4b81..69dd6e3a0000 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -8,9 +8,11 @@ import type { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/lib/account"; import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; -import { TrackScreen } from "../../analytics"; +import { track, TrackScreen } from "../../analytics"; import AccountCard from "../../components/AccountCard"; import LText from "../../components/LText"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; +import { useRoute } from "@react-navigation/native"; type Props = { navigation: any; @@ -18,7 +20,9 @@ type Props = { }; function ReceiveSelectAccount({ navigation, route }: Props) { + const lastRoute = usePreviousRouteName() const currency = route.params?.currency; + const routerRoute = useRoute() const { t } = useTranslation(); const accounts = useSelector( @@ -53,6 +57,7 @@ function ReceiveSelectAccount({ navigation, route }: Props) { const selectAccount = useCallback( (account: AccountLike) => { + track("account_clicked", { currency: currency.name, screen: routerRoute.name} navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, accountId: account?.parentId || account.id, @@ -83,7 +88,7 @@ function ReceiveSelectAccount({ navigation, route }: Props) { return aggregatedAccounts.length > 1 ? ( <> - + {t("transfer.receive.selectAccount.title")} From 9177d54200e2e4ba57a109e9b7d3150e0bdab22d Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 13 Jul 2022 08:44:53 +0200 Subject: [PATCH 60/83] analytics initMessage --- .../ReceiveSecurityModal/InitMessage.tsx | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx index 9b37aa42b05a..12ff2d1a177d 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx @@ -3,6 +3,9 @@ import { TouchableOpacity } from "react-native"; import { Trans } from "react-i18next"; import styled from "styled-components/native"; import { Flex, Text, Button } from "@ledgerhq/native-ui"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../../analytics"; +import { usePreviousRouteName } from "../../../helpers/routeHooks"; const NotNowButton = styled(TouchableOpacity)` align-items: center; @@ -16,12 +19,33 @@ type Props = { }; const InitMessage = ({ setStep, onVerifyAddress }: Props) => { + const route = useRoute(); + const onDontVerify = useCallback(() => { + track("button_clicked", { + button: "Reveal my address without verifying", + screen: route.name, + drawer: "initMessage", + }); setStep("confirmUnverified"); - }, [setStep]); + }, [setStep, route]); + const handleVerifyAddress = useCallback(() => { + track("button_clicked", { + button: "Verify my address", + screen: route.name, + drawer: "initMessage", + }); + onVerifyAddress(); + }, [route, onVerifyAddress]); return ( + { - From 4843627c56df70d288c1e83ee5c0e75ff2621e1e Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 13 Jul 2022 08:51:49 +0200 Subject: [PATCH 61/83] analytics confirmUnverified --- .../ConfirmUnverified.tsx | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx index 8b74166bdc65..570b8c8cd5af 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx @@ -3,6 +3,9 @@ import { TouchableOpacity } from "react-native"; import { Trans } from "react-i18next"; import styled from "styled-components/native"; import { Flex, Text, Button, Checkbox } from "@ledgerhq/native-ui"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../../analytics"; +import { usePreviousRouteName } from "../../../helpers/routeHooks"; type Props = { closeModal: Function; @@ -15,23 +18,45 @@ const ConfirmUnverified = ({ setStep, setShouldNotRemindUserAgain, }: Props) => { + const route = useRoute(); const [doNotRemindUserAgain, setDoNotRemindUserAgain] = useState(false); const toggleDoNotRemindUserAgain = useCallback(() => { + track("button_clicked", { + button: "Do not remind me", + screen: route.name, + drawer: "confirmUnverified", + }); setDoNotRemindUserAgain(!doNotRemindUserAgain); - }, [doNotRemindUserAgain]); + }, [doNotRemindUserAgain, route]); const onGoBack = useCallback(() => { setStep("initMessage"); - }, [setStep]); + track("button_clicked", { + button: "No", + screen: route.name, + drawer: "confirmUnverified", + }); + }, [setStep, route]); const onCloseModal = useCallback(() => { + track("button_clicked", { + button: "Yes", + screen: route.name, + drawer: "confirmUnverified", + }); closeModal(); if (doNotRemindUserAgain) { setShouldNotRemindUserAgain(); } - }, [closeModal, doNotRemindUserAgain, setShouldNotRemindUserAgain]); + }, [closeModal, doNotRemindUserAgain, setShouldNotRemindUserAgain, route]); return ( + Date: Wed, 13 Jul 2022 09:00:38 +0200 Subject: [PATCH 62/83] analytics verify address --- .../RootNavigator/ReceiveFundsNavigator.tsx | 9 ++++++++- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 11 +++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 9bb2fc57e17a..53363c848084 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -56,6 +56,13 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onVerifyAddressClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveVerifyAddress, + }); + }, []); + return ( , }} /> {/* Add account(s) automatically */} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index a6a0bc9bcb32..237a7f2d2672 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -18,8 +18,12 @@ import { import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; import type { DeviceModelId } from "@ledgerhq/devices"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; -import { useTheme } from "styled-components/native"; +import styled, { useTheme } from "styled-components/native"; import { Flex, Link as TextLink } from "@ledgerhq/native-ui"; +import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; +import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { track, TrackScreen } from "../../analytics"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import PreventNativeBack from "../../components/PreventNativeBack"; @@ -33,15 +37,12 @@ import { rejectionOp } from "../../logic/debugReject"; import GenericErrorView from "../../components/GenericErrorView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; import AdditionalInfoModal from "./AdditionalInfoModal"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import LText from "../../components/LText"; import Button from "../../components/Button"; import Animation from "../../components/Animation"; import getDeviceAnimation from "../../components/DeviceAction/getDeviceAnimation"; -import styled from "styled-components/native"; import Illustration from "../../images/illustration/Illustration"; import { urls } from "../../config/urls"; @@ -85,6 +86,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const { t } = useTranslation(); const [verified, setVerified] = useState(false); const [error, setError] = useState(null); + const lastRoute = usePreviousRouteName(); const onModalClose = useCallback(() => { setError(null) @@ -172,6 +174,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { : + {t("transfer.receive.verifyAddress.title")} {t("transfer.receive.verifyAddress.subtitle")} From 26774ea9b677fbc22b0ff02a92679a03aa8b4c13 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 13 Jul 2022 09:16:04 +0200 Subject: [PATCH 63/83] analytics confirmation --- .../src/components/CopyLink.tsx | 5 +-- .../RootNavigator/ReceiveFundsNavigator.tsx | 8 +++++ .../screens/ReceiveFunds/03-Confirmation.tsx | 34 ++++++++++++++++--- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/CopyLink.tsx b/apps/ledger-live-mobile/src/components/CopyLink.tsx index 5724dc970412..6190f90e447f 100644 --- a/apps/ledger-live-mobile/src/components/CopyLink.tsx +++ b/apps/ledger-live-mobile/src/components/CopyLink.tsx @@ -19,6 +19,7 @@ type Props = { */ replacement?: string | React.ReactNode; colors: any; + onCopy?: () => void; }; type State = { @@ -33,12 +34,12 @@ class CopyLink extends PureComponent { timeout = null; onPress = () => { - const { string } = this.props; + const { string, onCopy } = this.props; Clipboard.setString(string); this.setState({ copied: true }); - + onCopy && onCopy(); this.timeout = setTimeout(() => { this.setState({ copied: false }); }, 3000); diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 53363c848084..346ebf3b3c7e 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -63,6 +63,13 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onConfirmationClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: ScreenName.ReceiveConfirmation, + }); + }, []); + return ( , }} /> {/* Receive Address Device Verification */} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 2353becd91b8..134619dd7c33 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -19,6 +19,7 @@ import { useTheme } from "styled-components/native"; import { Flex, Text, Icons, Button, Notification } from "@ledgerhq/native-ui"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; +import { useRoute } from "@react-navigation/native"; import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import CurrencyIcon from "../../components/CurrencyIcon"; @@ -29,6 +30,8 @@ import AdditionalInfoModal from "./AdditionalInfoModal"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import PreventNativeBack from "../../components/PreventNativeBack"; +import { track, TrackScreen } from "../../analytics"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; type Props = { account?: (TokenAccount | Account), @@ -63,7 +66,9 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { const onModalHide = useRef(() => {}); const [isAddionalInfoModalOpen, setIsAddionalInfoModalOpen] = useState(false); const dispatch = useDispatch(); - + const lastRoute = usePreviousRouteName() + const routerRoute = useRoute(); + const hideToast = useCallback(() => { setIsToastDisplayed(false); }, []); @@ -72,15 +77,23 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, []); const openAdditionalInfoModal = useCallback(() => { + track("notification_clicked", { + button: "Imported and created account", + screen: routerRoute.name + }) setIsAddionalInfoModalOpen(true); hideToast(); - }, [setIsAddionalInfoModalOpen, hideToast]); + }, [setIsAddionalInfoModalOpen, hideToast, routerRoute.name]); const closeAdditionalInfoModal = useCallback(() => { setIsAddionalInfoModalOpen(false); }, [setIsAddionalInfoModalOpen]); const onRetry = useCallback(() => { + track("button_clicked", { + button: "Verify your address", + screen: routerRoute.name + }) const params = {...route.params, notSkippable: true} if (isModalOpened) { setIsModalOpened(false); @@ -88,7 +101,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { } else { navigation.navigate(ScreenName.ReceiveConnectDevice, params); } - }, [isModalOpened, navigation, route.params]) + }, [isModalOpened, navigation, route.params, routerRoute]) const { width } = getWindowDimensions(); const QRSize = Math.round(width / 1.8 - 16); @@ -118,10 +131,21 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { }, [verified]) const onShare = useCallback(() => { + track("button_clicked", { + button: "Share", + screen: routerRoute.name + }) if (mainAccount?.freshAddress) { Share.share({ message: mainAccount?.freshAddress }); } - }, [mainAccount?.freshAddress]); + }, [mainAccount?.freshAddress, routerRoute.name]); + + const onCopy = useCallback(() => { + track("button_clicked", { + button: "Copy", + screen: routerRoute.name + }) + }, [routerRoute.name]) if (!account || !currency || !mainAccount) return null; @@ -129,6 +153,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { + {t("transfer.receive.receiveConfirmation.title", { currencyTicker: currency.ticker })} @@ -194,6 +219,7 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { {mainAccount.freshAddress} } > From ed5df7e3728caca338309772a16d65a6b9a3b843 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 01:35:34 +0200 Subject: [PATCH 64/83] additional info analytics --- .../ReceiveFunds/AdditionalInfoModal.tsx | 97 ++++++++++++------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx index eb12c4001ed7..91ad04fbdc20 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/AdditionalInfoModal.tsx @@ -1,43 +1,72 @@ -import React from "react"; +import React, { useCallback } from "react"; import { Trans } from "react-i18next"; import { BottomDrawer, Flex, Text, Button } from "@ledgerhq/native-ui"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../analytics"; +import { usePreviousRouteName } from "../../helpers/routeHooks"; -const AdditionalInfoModal = ({ - isOpen, - onClose, - currencyTicker, -}: { +type Props = { isOpen: boolean; onClose: () => void; currencyTicker: string; -}) => ( - - - - - - { + const route = useRoute(); + + const onUnderstood = useCallback(() => { + track("button_clicked", { + button: "Ok, got it", + screen: route.name, + drawer: "AdditionalInfoModal", + }); + onClose(); + }, [onClose, route.name]); + + const handleClose = useCallback(() => { + track("button_clicked", { + button: "Close 'x'", + screen: route.name, + drawer: "AdditionalInfoModal", + }); + onClose(); + }, [onClose, route.name]); + + return ( + + - - - - - -); + + + + + + + + + + + ); +}; export default AdditionalInfoModal; From 9a5e339a55c39fa0e5787bd74b29538837fb3089 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 01:48:56 +0200 Subject: [PATCH 65/83] User verifies address successfully analytics --- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 5 ++++- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 134619dd7c33..60399df44c78 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -128,7 +128,10 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { useEffect(() => { setIsVerifiedToastDisplayed(verified) - }, [verified]) + if(verified){ + track("Verification Success", { currency: currency.name }) + } + }, [verified, currency.name]) const onShare = useCallback(() => { track("button_clicked", { diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 237a7f2d2672..da4fa21a181e 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -36,7 +36,6 @@ import logger from "../../logger"; import { rejectionOp } from "../../logic/debugReject"; import GenericErrorView from "../../components/GenericErrorView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; -import AdditionalInfoModal from "./AdditionalInfoModal"; import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import LText from "../../components/LText"; From 490a3818b3e820cb57a6827b35b0182e38354fa4 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 01:52:42 +0200 Subject: [PATCH 66/83] remove unused --- .../ReceiveFunds/03b-VerifyAddress.tsx | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index da4fa21a181e..1f1cace13d02 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -1,9 +1,8 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; import { of } from "rxjs"; import { delay } from "rxjs/operators"; -import { TouchableOpacity, TouchableWithoutFeedback, Share, Linking } from "react-native"; -import { useDispatch, useSelector } from "react-redux"; -import QRCode from "react-native-qrcode-svg"; +import { TouchableOpacity, Linking } from "react-native"; +import { useSelector } from "react-redux"; import { useTranslation, Trans } from "react-i18next"; import type { Account, @@ -13,30 +12,19 @@ import type { import { getMainAccount, getAccountCurrency, - getAccountName, } from "@ledgerhq/live-common/lib/account"; import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge"; import type { DeviceModelId } from "@ledgerhq/devices"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import styled, { useTheme } from "styled-components/native"; -import { Flex, Link as TextLink } from "@ledgerhq/native-ui"; -import { CryptoCurrency, TokenCurrency } from "@ledgerhq/live-common/src/types"; -import { makeEmptyTokenAccount } from "@ledgerhq/live-common/src/account"; -import { track, TrackScreen } from "../../analytics"; +import { Flex } from "@ledgerhq/native-ui"; +import { TrackScreen } from "../../analytics"; import { usePreviousRouteName } from "../../helpers/routeHooks"; -import getWindowDimensions from "../../logic/getWindowDimensions"; import { accountScreenSelector } from "../../reducers/accounts"; import PreventNativeBack from "../../components/PreventNativeBack"; -import BottomModal from "../../components/BottomModal"; -import CurrencyIcon from "../../components/CurrencyIcon"; -import CopyLink from "../../components/CopyLink"; -import NavigationScrollView from "../../components/NavigationScrollView"; import SkipLock from "../../components/behaviour/SkipLock"; import logger from "../../logger"; import { rejectionOp } from "../../logic/debugReject"; -import GenericErrorView from "../../components/GenericErrorView"; -import ReceiveSecurityModal from "./ReceiveSecurityModal"; -import { replaceAccounts } from "../../actions/accounts"; import { ScreenName } from "../../const"; import LText from "../../components/LText"; import Button from "../../components/Button"; From 5e78f7eca9bf152aec2f052f6b46c32f7f59bc6c Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 02:13:03 +0200 Subject: [PATCH 67/83] verify adress analytics --- .../ReceiveFunds/03b-VerifyAddress.tsx | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 1f1cace13d02..cfce7a2e1fcb 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -18,7 +18,8 @@ import type { DeviceModelId } from "@ledgerhq/devices"; import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types"; import styled, { useTheme } from "styled-components/native"; import { Flex } from "@ledgerhq/native-ui"; -import { TrackScreen } from "../../analytics"; +import { useRoute } from "@react-navigation/native"; +import { track, TrackScreen } from "../../analytics"; import { usePreviousRouteName } from "../../helpers/routeHooks"; import { accountScreenSelector } from "../../reducers/accounts"; import PreventNativeBack from "../../components/PreventNativeBack"; @@ -73,6 +74,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const { t } = useTranslation(); const [verified, setVerified] = useState(false); const [error, setError] = useState(null); + const routerRoute = useRoute(); const lastRoute = usePreviousRouteName(); const onModalClose = useCallback(() => { @@ -116,19 +118,32 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const currency = route.params?.currency || (account && getAccountCurrency(account)); const onRetry = useCallback(() => { + track("button_clicked", { + button: "Retry", + screen: routerRoute.name + }) onModalClose(); if (device) { verifyOnDevice(device); } - },[device, onModalClose, verifyOnDevice]); + },[device, onModalClose, routerRoute.name, verifyOnDevice]); const goBack = useCallback(() => { + track("button_clicked", { + button: "Cancel", + screen: routerRoute.name + }) navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, verified: false }); - }, [navigation, route.params]); + }, [navigation, route.params, routerRoute.name]); const redirectToSupport = useCallback(() => { + track("message_clicked", { + message: "contact us asap", + screen: routerRoute.name, + url: urls.receiveVerifyAddress + }) Linking.openURL(urls.receiveVerifyAddress); - }, []); + }, [routerRoute.name]); useEffect(() => { if (device) { @@ -143,6 +158,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { { error ? <> + Date: Tue, 19 Jul 2022 09:38:58 +0200 Subject: [PATCH 68/83] refactoring onClose event --- .../RootNavigator/ReceiveFundsNavigator.tsx | 50 +++++-------------- 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 346ebf3b3c7e..86b1b1ac24e1 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -5,6 +5,7 @@ import { createStackNavigator } from "@react-navigation/stack"; import { useTheme } from "styled-components/native"; import { useTranslation } from "react-i18next"; import { HeaderBackButton } from "@react-navigation/elements"; +import { useRoute } from "@react-navigation/native"; import { ScreenName } from "../../const"; import ReceiveConfirmation from "../../screens/ReceiveFunds/03-Confirmation"; import ReceiveConnectDevice from "../../screens/ReceiveFunds/03a-ConnectDevice"; @@ -23,31 +24,22 @@ import { track } from "../../analytics"; export default function ReceiveFundsNavigator() { const { colors } = useTheme(); const { t } = useTranslation(); - const stackNavigationConfig = useMemo( - () => getStackNavigatorConfig(colors, true), - [colors], - ); + const route = useRoute(); - const onSelectCryptoClose = useCallback(() => { + const onClose = useCallback(() => { track("button_clicked", { button: "Close 'x'", - screen: ScreenName.ReceiveSelectCrypto, + screen: route.name, }); - }, []); + }, [route]); - const onSelectAccountClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveSelectAccount, - }); - }, []); - - const onConnectDeviceClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveConnectDevice, - }); - }, []); + const stackNavigationConfig = useMemo( + () => ({ + ...getStackNavigatorConfig(colors, true), + headerRight: () => , + }), + [colors, onClose], + ); const onConnectDeviceBack = useCallback(() => { track("button_clicked", { @@ -56,20 +48,6 @@ export default function ReceiveFundsNavigator() { }); }, []); - const onVerifyAddressClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveVerifyAddress, - }); - }, []); - - const onConfirmationClose = useCallback(() => { - track("button_clicked", { - button: "Close 'x'", - screen: ScreenName.ReceiveConfirmation, - }); - }, []); - return ( , }} /> @@ -94,7 +71,6 @@ export default function ReceiveFundsNavigator() { component={ReceiveSelectAccount} options={{ headerTitle: "", - headerRight: , }} /> @@ -138,7 +114,6 @@ export default function ReceiveFundsNavigator() { title={t("transfer.receive.stepperHeader.connectDevice")} /> ), - headerRight: , headerLeft: , }} /> @@ -149,7 +124,6 @@ export default function ReceiveFundsNavigator() { options={{ headerTitle: "", headerLeft: null, - headerRight: , }} /> {/* Add account(s) automatically */} From 1f68089b1e59be8236c7fca0aa3052d942ba82e9 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Tue, 19 Jul 2022 09:43:13 +0200 Subject: [PATCH 69/83] last route as variable --- .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 3 ++- .../src/screens/ReceiveFunds/AdditionalInfoModal.tsx | 3 ++- .../ReceiveFunds/ReceiveSecurityModal/ConfirmUnverified.tsx | 3 ++- .../screens/ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index a2ced0adbadd..bd550fe1aa61 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -55,6 +55,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const {t } = useTranslation(); const routerRoute = useRoute() const { filterCurrencyIds = [] } = route.params || {}; + const lastRoute = usePreviousRouteName() const cryptoCurrencies = useMemo( () => listSupportedCurrencies() @@ -127,7 +128,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { return ( <> - + {t("transfer.receive.selectCrypto.title")} { const route = useRoute(); + const lastRoute = usePreviousRouteName(); const onUnderstood = useCallback(() => { track("button_clicked", { @@ -37,7 +38,7 @@ const AdditionalInfoModal = ({ isOpen, onClose, currencyTicker }: Props) => { { const route = useRoute(); const [doNotRemindUserAgain, setDoNotRemindUserAgain] = useState(false); + const lastRoute = usePreviousRouteName(); const toggleDoNotRemindUserAgain = useCallback(() => { track("button_clicked", { button: "Do not remind me", @@ -55,7 +56,7 @@ const ConfirmUnverified = ({ category="ReceiveFunds" name="No Verification Confirmation" type="drawer" - source={usePreviousRouteName()} + source={lastRoute} /> { const route = useRoute(); + const lastRoute = usePreviousRouteName(); const onDontVerify = useCallback(() => { track("button_clicked", { @@ -43,7 +44,7 @@ const InitMessage = ({ setStep, onVerifyAddress }: Props) => { Date: Tue, 19 Jul 2022 10:01:51 +0200 Subject: [PATCH 70/83] fix source empty parameter --- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index cfce7a2e1fcb..5b93dfce2c08 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -158,7 +158,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { { error ? <> - + Date: Wed, 20 Jul 2022 08:58:42 +0200 Subject: [PATCH 71/83] remove debounce --- .../src/components/FilteredSearchBar.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx index e0612602b8cf..e216a3e5a202 100644 --- a/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx +++ b/apps/ledger-live-mobile/src/components/FilteredSearchBar.tsx @@ -4,7 +4,6 @@ import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import { useRoute } from "@react-navigation/native"; -import { useDebounce } from "@ledgerhq/live-common/lib/hooks/useDebounce"; import Search from "./Search"; import { track } from "../analytics"; import { ScreenName } from "../const"; @@ -31,12 +30,15 @@ const FilteredSearchBar = ({ const [query, setQuery] = useState(initialQuery || ""); const route = useRoute(); - const onChange = useDebounce((newQuery: string) => { - setQuery(newQuery); - if (route.name === ScreenName.ReceiveSelectCrypto) { - track("search_clicked", { input: newQuery, screen: route.name }); - } - }, 200); + const onChange = useCallback( + (newQuery: string) => { + setQuery(newQuery); + if (route.name === ScreenName.ReceiveSelectCrypto) { + track("search_clicked", { input: newQuery, screen: route.name }); + } + }, + [route.name], + ); return ( <> From da3ac6c9fe7fe2e5a1a29e8a5135261589556db8 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Wed, 20 Jul 2022 09:12:40 +0200 Subject: [PATCH 72/83] fix header left --- .../src/components/RootNavigator/ReceiveFundsNavigator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index 86b1b1ac24e1..c6fbba70fc1f 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -114,7 +114,7 @@ export default function ReceiveFundsNavigator() { title={t("transfer.receive.stepperHeader.connectDevice")} /> ), - headerLeft: , + headerLeft: () => , }} /> {/* Select / Connect Device */} From c204d434f3742620520b441462daa304ec083d16 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Thu, 21 Jul 2022 09:58:10 +0200 Subject: [PATCH 73/83] fix double import --- .../src/screens/ReceiveFunds/02-SelectAccount.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 36f96b0b5fe2..eaefe801fbae 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -6,7 +6,7 @@ import { Flex } from "@ledgerhq/native-ui"; import { useTranslation } from "react-i18next"; import type { AccountLike, Currency } from "@ledgerhq/live-common/lib/types"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/lib/account"; -import { useRoute , useRoute } from "@react-navigation/native"; +import { useRoute } from "@react-navigation/native"; import { flattenAccountsByCryptoCurrencyScreenSelector } from "../../reducers/accounts"; import { ScreenName } from "../../const"; import { track, TrackScreen } from "../../analytics"; From 7ba404acf23a1ee5ff1c550eb88b6853782af7b6 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Thu, 21 Jul 2022 14:23:55 +0200 Subject: [PATCH 74/83] fix merge issue --- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index ad98d050fddf..4e9ee5bf4d5a 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -32,8 +32,6 @@ import { ScreenName } from "../../const"; import { track, TrackScreen } from "../../analytics"; import { usePreviousRouteName } from "../../helpers/routeHooks"; import PreventNativeBack from "../../components/PreventNativeBack"; -import { track, TrackScreen } from "../../analytics"; -import { usePreviousRouteName } from "../../helpers/routeHooks"; type Props = { account?: (TokenAccount | Account), From 815ba6b0f27cdd08d491314374d3ad7859e56193 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Thu, 21 Jul 2022 15:33:34 +0200 Subject: [PATCH 75/83] LIVE-2910 LIVE-3038 LIVE-3040 LLM - ReceiveFlow - fixes crashes and ux issues --- .../RootNavigator/ReceiveFundsNavigator.tsx | 33 ++++++++++++++++--- .../src/const/navigation.js | 1 + .../src/screens/Account/hooks/useActions.tsx | 2 +- .../src/screens/Onboarding/steps/welcome.tsx | 7 +--- .../screens/ReceiveFunds/02-SelectAccount.tsx | 24 ++++++++++---- .../ReceiveFunds/03b-VerifyAddress.tsx | 2 +- 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx index c6fbba70fc1f..02670b7f3bd7 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/ReceiveFundsNavigator.tsx @@ -48,6 +48,20 @@ export default function ReceiveFundsNavigator() { }); }, []); + const onConfirmationClose = useCallback(() => { + track("button_clicked", { + button: "HeaderRight Close", + screen: ScreenName.ReceiveConfirmation, + }); + }, []); + + const onVerificationConfirmationClose = useCallback(() => { + track("button_clicked", { + button: "HeaderRight Close", + screen: ScreenName.ReceiveVerificationConfirmation, + }); + }, []); + return ( null, headerTitle: "", }} /> @@ -123,7 +137,7 @@ export default function ReceiveFundsNavigator() { component={ReceiveVerifyAddress} options={{ headerTitle: "", - headerLeft: null, + headerLeft: () => null, }} /> {/* Add account(s) automatically */} @@ -133,11 +147,22 @@ export default function ReceiveFundsNavigator() { component={ReceiveConfirmation} options={{ headerTitle: "", - headerLeft: null, - headerRight: , + headerLeft: () => null, + headerRight: () => , }} /> {/* Receive Address Device Verification */} + null, + headerRight: () => ( + + ), + }} + /> ); } diff --git a/apps/ledger-live-mobile/src/const/navigation.js b/apps/ledger-live-mobile/src/const/navigation.js index 565d2054231c..6a29160276c5 100644 --- a/apps/ledger-live-mobile/src/const/navigation.js +++ b/apps/ledger-live-mobile/src/const/navigation.js @@ -104,6 +104,7 @@ export const ScreenName = { RateProviderSettings: "RateProviderSettings", ReceiveConfirmation: "ReceiveConfirmation", + ReceiveVerificationConfirmation: "ReceiveVerificationConfirmation", ReceiveConnectDevice: "ReceiveConnectDevice", ReceiveVerifyAddress: "ReceiveVerifyAddress", ReceiveSelectCrypto: "ReceiveSelectCrypto", diff --git a/apps/ledger-live-mobile/src/screens/Account/hooks/useActions.tsx b/apps/ledger-live-mobile/src/screens/Account/hooks/useActions.tsx index fae0d84b4c13..20f39132a71f 100644 --- a/apps/ledger-live-mobile/src/screens/Account/hooks/useActions.tsx +++ b/apps/ledger-live-mobile/src/screens/Account/hooks/useActions.tsx @@ -68,7 +68,7 @@ export default function useActions({ account, parentAccount, colors }: Props) { navigationParams: [ NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, }, ], label: , diff --git a/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx b/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx index 2c5ec274ff71..085d26e889b6 100644 --- a/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx +++ b/apps/ledger-live-mobile/src/screens/Onboarding/steps/welcome.tsx @@ -89,12 +89,7 @@ function OnboardingStepWelcome({ navigation }: any) { resizeMode={"cover"} /> )} - + { - track("account_clicked", { currency: currency.name, screen: routerRoute.name}) + track("account_clicked", { + currency: currency.name, + screen: routerRoute.name, + }); navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, accountId: account?.parentId || account.id, @@ -73,8 +76,10 @@ function ReceiveSelectAccount({ navigation, route }: Props) { {(account.parentAccount || account.token.parentCurrency).name} + account.parentAccount || account.token?.parentCurrency ? ( + + {(account.parentAccount || account.token.parentCurrency).name} + ) : null } onPress={() => selectAccount(account)} @@ -88,7 +93,12 @@ function ReceiveSelectAccount({ navigation, route }: Props) { return aggregatedAccounts.length > 1 ? ( <> - + {t("transfer.receive.selectAccount.title")} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 5b93dfce2c08..967131a87374 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -100,7 +100,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { complete: () => { if (onSuccess) onSuccess(mainAccount.freshAddress) - else navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, verified: true }); + else navigation.navigate(ScreenName.ReceiveVerificationConfirmation, { ...route.params, verified: true }); }, error: error => { if (error && error.name !== "UserRefusedAddress") { From e15767a6779376a6b7f350cf127a8a8e2df9ed41 Mon Sep 17 00:00:00 2001 From: ThomasLaforge Date: Fri, 22 Jul 2022 18:58:41 +0200 Subject: [PATCH 76/83] fix analytics --- apps/ledger-live-mobile/src/components/CopyLink.tsx | 1 - .../src/screens/ReceiveFunds/01-SelectCrypto.tsx | 2 +- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 2 +- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 2 +- .../src/screens/ReceiveFunds/AdditionalInfoModal.tsx | 2 +- .../ReceiveFunds/ReceiveSecurityModal/InitMessage.tsx | 6 +++--- 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/ledger-live-mobile/src/components/CopyLink.tsx b/apps/ledger-live-mobile/src/components/CopyLink.tsx index 6190f90e447f..5642cf8108e2 100644 --- a/apps/ledger-live-mobile/src/components/CopyLink.tsx +++ b/apps/ledger-live-mobile/src/components/CopyLink.tsx @@ -50,7 +50,6 @@ class CopyLink extends PureComponent { const { copied } = this.state; return ( diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index bd550fe1aa61..fe11ae8af50e 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -128,7 +128,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { return ( <> - + {t("transfer.receive.selectCrypto.title")} - + {t("transfer.receive.receiveConfirmation.title", { currencyTicker: currency.ticker })} diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 967131a87374..8f2d116eaafd 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -158,7 +158,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { { error ? <> - + { return ( { track("button_clicked", { button: "Reveal my address without verifying", screen: route.name, - drawer: "initMessage", + drawer: "Verification Security Disclaimer", }); setStep("confirmUnverified"); }, [setStep, route]); @@ -35,14 +35,14 @@ const InitMessage = ({ setStep, onVerifyAddress }: Props) => { track("button_clicked", { button: "Verify my address", screen: route.name, - drawer: "initMessage", + drawer: "Verification Security Disclaimer", }); onVerifyAddress(); }, [route, onVerifyAddress]); return ( Date: Mon, 25 Jul 2022 14:19:19 +0200 Subject: [PATCH 77/83] LIVE-3094 - LLM - receive flow links issue --- .../src/families/algorand/Rewards/ClaimRewardsFlow/01-Info.js | 2 +- .../src/families/tezos/DelegationDetailsModal.js | 2 +- .../src/screens/Account/EmptyStateAccount.tsx | 2 +- .../src/screens/Account/NftCollectionsList.tsx | 4 ++-- .../src/screens/Account/SubAccountsList.tsx | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Info.js b/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Info.js index 3082d2151d69..83c9ddfe5b09 100644 --- a/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Info.js +++ b/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Info.js @@ -34,7 +34,7 @@ export default function ClaimRewardsStarted({ navigation, route }: Props) { const onNext = useCallback(() => { navigation.pop(); navigation.navigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, params: route.params, }); }, [navigation, route.params]); diff --git a/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.js b/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.js index 0240ca5d2ad7..79af7634fd0e 100644 --- a/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.js +++ b/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.js @@ -178,7 +178,7 @@ export default function DelegationDetailsModal({ const onReceive = useCallback(() => { navigation.navigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, params: { accountId, parentId, diff --git a/apps/ledger-live-mobile/src/screens/Account/EmptyStateAccount.tsx b/apps/ledger-live-mobile/src/screens/Account/EmptyStateAccount.tsx index e0242af08115..d535c81aca5a 100644 --- a/apps/ledger-live-mobile/src/screens/Account/EmptyStateAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/Account/EmptyStateAccount.tsx @@ -54,7 +54,7 @@ function EmptyStateAccount({ const goToReceiveFunds = useCallback(() => { navigation.navigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, params: { accountId: account.id, parentId: parentAccount && parentAccount.id, diff --git a/apps/ledger-live-mobile/src/screens/Account/NftCollectionsList.tsx b/apps/ledger-live-mobile/src/screens/Account/NftCollectionsList.tsx index dc44c72afa57..f9c9a80b1785 100644 --- a/apps/ledger-live-mobile/src/screens/Account/NftCollectionsList.tsx +++ b/apps/ledger-live-mobile/src/screens/Account/NftCollectionsList.tsx @@ -67,7 +67,7 @@ export default function NftCollectionsList({ account }: Props) { const navigateToReceive = useCallback( () => navigation.navigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, params: { accountId: account.id, }, @@ -93,7 +93,7 @@ export default function NftCollectionsList({ account }: Props) { const navigateToReceiveConnectDevice = useCallback(() => { navigation.navigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, params: { accountId: account.id, }, diff --git a/apps/ledger-live-mobile/src/screens/Account/SubAccountsList.tsx b/apps/ledger-live-mobile/src/screens/Account/SubAccountsList.tsx index 9293ce62f950..7ab592e735fc 100644 --- a/apps/ledger-live-mobile/src/screens/Account/SubAccountsList.tsx +++ b/apps/ledger-live-mobile/src/screens/Account/SubAccountsList.tsx @@ -83,7 +83,7 @@ export default function SubAccountsList({ const navigateToReceiveConnectDevice = useCallback(() => { navigation.navigate(NavigatorName.ReceiveFunds, { - screen: ScreenName.ReceiveConnectDevice, + screen: ScreenName.ReceiveConfirmation, params: { accountId, }, From 2ed1e628af07bc2302ea92efee39faddc0fe638e Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Tue, 26 Jul 2022 14:10:37 +0200 Subject: [PATCH 78/83] LIVE-3100 - LLM - Receive flow fix double token creation issue --- .../src/screens/ReceiveFunds/03b-VerifyAddress.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index 8f2d116eaafd..bb3b51527829 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -100,7 +100,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { complete: () => { if (onSuccess) onSuccess(mainAccount.freshAddress) - else navigation.navigate(ScreenName.ReceiveVerificationConfirmation, { ...route.params, verified: true }); + else navigation.navigate(ScreenName.ReceiveVerificationConfirmation, { ...route.params, verified: true, createTokenAccount: false }); }, error: error => { if (error && error.name !== "UserRefusedAddress") { From fc61a44443905f54a29bdc98ad78818439be2fab Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Tue, 26 Jul 2022 15:05:29 +0200 Subject: [PATCH 79/83] LIVE-2828 - LLM - Receive flow fix add token account select issue --- .../screens/ReceiveFunds/01-SelectCrypto.tsx | 2 +- .../screens/ReceiveFunds/02-AddAccount.tsx | 37 +++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index fe11ae8af50e..0f8b1d89456e 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -111,7 +111,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { }); } - }, [accounts, navigation]); + }, [accounts, navigation, routerRoute.name]); const renderList = useCallback((items: any) => ( { - setScannedAccounts((accs: Account[]) => [...accs, account]); + if (currency.type === "TokenCurrency") { + const pa = account; + + if (!pa.subAccounts.find(a => a.token.id === currency.id)) { + const tokenAcc = makeEmptyTokenAccount(pa, currency); + tokenAcc.parentAccount = pa; + pa.subAccounts.push(tokenAcc); + } + + setScannedAccounts((accs: Account[]) => [...accs, pa]); + } else { + setScannedAccounts((accs: Account[]) => [...accs, account]); + } }, complete: () => setScanning(false), error: error => { @@ -140,12 +154,21 @@ function AddAccountsAccounts({ navigation, route }: Props) { ); const renderItem = useCallback( - ({ item: account }: { item: Account }) => ( - - selectAccount(account)} /> - - ), - [selectAccount], + ({ item: account }: { item: Account }) => { + const acc = + currency.type === "TokenCurrency" + ? account.subAccounts.find( + (a: TokenAccount) => a.token.id === currency.id, + ) + : account; + + return ( + + selectAccount(account)} /> + + ); + }, + [currency.id, currency.type, selectAccount], ); const renderHeader = useCallback( From 029584e07649533d40350dce91799ee611cff922 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Tue, 26 Jul 2022 15:59:04 +0200 Subject: [PATCH 80/83] LIVE-3100 - LLM - Receive flow fix double tokens add issue --- .../src/screens/ReceiveFunds/03-Confirmation.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 814bfc724387..7655644b1b52 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -111,12 +111,14 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { useEffect(() => { if(route.params?.createTokenAccount && !hasAddedTokenAccount) { const newMainAccount = mainAccount; - const emptyTokenAccount = makeEmptyTokenAccount(newMainAccount, currency); - newMainAccount.subAccounts = [...newMainAccount.subAccounts, emptyTokenAccount]; + if(!newMainAccount.subAccounts.find((acc: TokenAccount) => acc?.token?.id === currency.id)) { + const emptyTokenAccount = makeEmptyTokenAccount(newMainAccount, currency); + newMainAccount.subAccounts = [...newMainAccount.subAccounts, emptyTokenAccount]; - dispatch(replaceAccounts({ scannedAccounts: [newMainAccount], selectedIds: [newMainAccount.id], renamings: {}})); - setIsToastDisplayed(true); - setHasAddedTokenAccount(true); + dispatch(replaceAccounts({ scannedAccounts: [newMainAccount], selectedIds: [newMainAccount.id], renamings: {}})); + setIsToastDisplayed(true); + setHasAddedTokenAccount(true); + } } }, [currency, route.params?.createTokenAccount, mainAccount, dispatch, hasAddedTokenAccount]) From b7bacdb128410ce8285907e1dcde249a26c1f0a4 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Tue, 26 Jul 2022 17:06:59 +0200 Subject: [PATCH 81/83] LIVE-2828 - LLM - Receive flow add parent account to token when adding them --- .../src/screens/ReceiveFunds/02-AddAccount.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index b3dbbddc04c2..9065db5da8fc 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -164,7 +164,17 @@ function AddAccountsAccounts({ navigation, route }: Props) { return ( - selectAccount(account)} /> + selectAccount(account)} + AccountSubTitle={ + acc.parentAccount || acc.token?.parentCurrency ? ( + + {(acc.parentAccount || acc.token.parentCurrency).name} + + ) : null + } + /> ); }, From e448c55c4ddbd3c52b0f3432e073c33d0c4b7e02 Mon Sep 17 00:00:00 2001 From: LFBarreto Date: Tue, 26 Jul 2022 18:19:01 +0200 Subject: [PATCH 82/83] LIVE-606 - LLM - Receive flow - review cleanup --- .../src/components/ReceiveAccountCard.tsx | 109 ------------------ .../screens/ReceiveFunds/01-SelectCrypto.tsx | 18 +-- .../screens/ReceiveFunds/02-AddAccount.tsx | 17 ++- .../screens/ReceiveFunds/03-Confirmation.tsx | 3 +- .../ReceiveFunds/03a-ConnectDevice.tsx | 2 - .../ReceiveFunds/03b-VerifyAddress.tsx | 4 +- 6 files changed, 24 insertions(+), 129 deletions(-) delete mode 100644 apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx diff --git a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx b/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx deleted file mode 100644 index d64959062121..000000000000 --- a/apps/ledger-live-mobile/src/components/ReceiveAccountCard.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import React from "react"; -import { - getAccountName, - getAccountSpendableBalance, -} from "@ledgerhq/live-common/lib/account"; -import { - getAccountCurrency, - getAccountUnit, -} from "@ledgerhq/live-common/lib/account/helpers"; -import { getTagDerivationMode } from "@ledgerhq/live-common/lib/derivation"; -import { Account, CryptoCurrency } from "@ledgerhq/live-common/lib/types"; -import { Flex, Text } from "@ledgerhq/native-ui"; -import { useTheme } from "styled-components/native"; -import { TouchableOpacity } from "react-native-gesture-handler"; - -import Card, { Props as CardProps } from "./Card"; -import CurrencyIcon from "./CurrencyIcon"; -import CurrencyUnitValue from "./CurrencyUnitValue"; - -const Tag = ({ children, ...props }: { children: string }) => ( - - - {children} - - -); - -export type Props = CardProps & { - account: Account; - style?: any; - disabled?: boolean; - useFullBalance?: boolean; - AccountSubTitle?: React.ReactNode; -}; - -const AccountCard = ({ - onPress, - account, - style, - disabled, - useFullBalance, - AccountSubTitle, - ...props -}: Props) => { - const { colors } = useTheme(); - const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); - const tag = getTagDerivationMode( - currency as CryptoCurrency, - account.derivationMode, - ); - - return ( - - - - - - - {getAccountName(account)} - - {AccountSubTitle} - - {tag && {tag}} - - - - - - - - - ); -}; - -export default AccountCard; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx index 0f8b1d89456e..e3fbf04a9d66 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/01-SelectCrypto.tsx @@ -54,7 +54,7 @@ const findAccountByCurrency = (accounts: (TokenAccount | Account)[], currency: C export default function AddAccountsSelectCrypto({ navigation, route }: Props) { const {t } = useTranslation(); const routerRoute = useRoute() - const { filterCurrencyIds = [] } = route.params || {}; + const filterCurrencyIds = useMemo(() => route.params?.filterCurrencyIds || [], [route.params?.filterCurrencyIds]); const lastRoute = usePreviousRouteName() const cryptoCurrencies = useMemo( () => @@ -75,37 +75,37 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) { track('currency_clicked', {screen: routerRoute.name, currency: currency.name}) const accs = findAccountByCurrency(accounts, currency); - if(accs.length > 1) { + if(accs.length > 1) { // if we found one or more accounts of the given currency we select account navigation.navigate(ScreenName.ReceiveSelectAccount, { currency - }); - } else if(accs.length === 1) { + }); + } else if(accs.length === 1) { // if we found only one account of the given currency we go straight to QR code navigation.navigate(ScreenName.ReceiveConfirmation, { accountId: accs[0].id, parentId: accs[0]?.parentId, }); - } else if (currency.type === "TokenCurrency") { + } else if (currency.type === "TokenCurrency") { // cases for token currencies const parentAccounts = findAccountByCurrency(accounts, currency.parentCurrency); - if (parentAccounts.length > 1) { + if (parentAccounts.length > 1) { // if we found one or more accounts of the parent currency we select account navigation.navigate(ScreenName.ReceiveSelectAccount, { currency, createTokenAccount: true }); - } else if (parentAccounts.length === 1) { + } else if (parentAccounts.length === 1) { // if we found only one account of the parent currency we go straight to QR code navigation.navigate(ScreenName.ReceiveConfirmation, { accountId: parentAccounts[0].id, currency, createTokenAccount: true }); - } else { + } else { // if we didn't find any account of the parent currency we add and create one navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { currency, createTokenAccount: true }); } - } else { + } else { // else we create a currency account navigation.navigate(ScreenName.ReceiveAddAccountSelectDevice, { currency, }); diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index 9065db5da8fc..301f39dfb9b0 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -75,7 +75,7 @@ function AddAccountsAccounts({ navigation, route }: Props) { blacklistedTokenIds: [], }; // will be set to false if an existing account is found - + // @TODO observable similar to the one in AddAccounts Flow maybe refactor both in single workflow scanSubscription.current = concat( from(prepareCurrency(c)).pipe(ignoreElements()), bridge.scanAccounts({ @@ -84,19 +84,24 @@ function AddAccountsAccounts({ navigation, route }: Props) { syncConfig, }), ).subscribe({ - next: ({ account }) => { + next: ({ account }: { account: Account }) => { if (currency.type === "TokenCurrency") { - const pa = account; + // handle token accounts cases where we want to create empty new token accounts + const pa = { ...account }; - if (!pa.subAccounts.find(a => a.token.id === currency.id)) { + if ( + !pa.subAccounts.find( + (a: { token: { id: any } }) => a.token.id === currency.id, + ) // in case we dont already have one we create an empty token account + ) { const tokenAcc = makeEmptyTokenAccount(pa, currency); tokenAcc.parentAccount = pa; pa.subAccounts.push(tokenAcc); } - setScannedAccounts((accs: Account[]) => [...accs, pa]); + setScannedAccounts((accs: Account[]) => [...accs, pa]); // add the account with the newly added token account to the list of scanned accounts } else { - setScannedAccounts((accs: Account[]) => [...accs, account]); + setScannedAccounts((accs: Account[]) => [...accs, account]); // add the account to the list of scanned accounts } }, complete: () => setScanning(false), diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index 7655644b1b52..0ce1fe23beb5 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -110,11 +110,12 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { useEffect(() => { if(route.params?.createTokenAccount && !hasAddedTokenAccount) { - const newMainAccount = mainAccount; + const newMainAccount = {...mainAccount}; if(!newMainAccount.subAccounts.find((acc: TokenAccount) => acc?.token?.id === currency.id)) { const emptyTokenAccount = makeEmptyTokenAccount(newMainAccount, currency); newMainAccount.subAccounts = [...newMainAccount.subAccounts, emptyTokenAccount]; + // @TODO create a new action for adding a single account at a time instead of replacing dispatch(replaceAccounts({ scannedAccounts: [newMainAccount], selectedIds: [newMainAccount.id], renamings: {}})); setIsToastDisplayed(true); setHasAddedTokenAccount(true); diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx index 6dbcdb85d7ef..205a8388f23f 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03a-ConnectDevice.tsx @@ -6,7 +6,6 @@ import { useTranslation } from "react-i18next"; import { getMainAccount, getReceiveFlowError, - getAccountCurrency, } from "@ledgerhq/live-common/account/index"; import type { Device } from "@ledgerhq/live-common/hw/actions/types"; import type { AccountLike } from "@ledgerhq/live-common/types/index"; @@ -102,7 +101,6 @@ export default function ConnectDevice({ navigation, route }: Props) { } const mainAccount = getMainAccount(account, parentAccount); - const currency = getAccountCurrency(account); const tokenCurrency = account && account.type === "TokenAccount" && account.token; diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx index bb3b51527829..46fa698a5087 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03b-VerifyAddress.tsx @@ -8,6 +8,7 @@ import type { Account, TokenAccount, AccountLike, + Currency, } from "@ledgerhq/live-common/lib/types"; import { getMainAccount, @@ -72,7 +73,6 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { const { type } = useTheme(); const { account, parentAccount } = useSelector(accountScreenSelector(route)); const { t } = useTranslation(); - const [verified, setVerified] = useState(false); const [error, setError] = useState(null); const routerRoute = useRoute(); const lastRoute = usePreviousRouteName(); @@ -102,7 +102,7 @@ export default function ReceiveVerifyAddress({ navigation, route }: Props) { onSuccess(mainAccount.freshAddress) else navigation.navigate(ScreenName.ReceiveVerificationConfirmation, { ...route.params, verified: true, createTokenAccount: false }); }, - error: error => { + error: (error: any) => { if (error && error.name !== "UserRefusedAddress") { logger.critical(error); } From 1a64f6a04c2705179cd3378a9f06401f82a13db9 Mon Sep 17 00:00:00 2001 From: Team Live Date: Thu, 28 Jul 2022 17:24:26 +0000 Subject: [PATCH 83/83] :rocket: release prerelease [LLD(2.45.1-next.1), LLM(3.5.0-next.14)] --- .changeset/pre.json | 1 + apps/ledger-live-mobile/CHANGELOG.md | 7 +++++++ apps/ledger-live-mobile/package.json | 2 +- libs/ui/packages/native/CHANGELOG.md | 6 ++++++ libs/ui/packages/native/package.json | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 5276c1b33762..4ae35d4fbbcd 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -97,6 +97,7 @@ "slow-trainers-fry", "spicy-eyes-decide", "thick-ligers-fail", + "warm-months-attend", "weak-queens-shout", "wild-spies-cry2", "witty-numbers-design", diff --git a/apps/ledger-live-mobile/CHANGELOG.md b/apps/ledger-live-mobile/CHANGELOG.md index 39dddadd44b7..44f35d60711b 100644 --- a/apps/ledger-live-mobile/CHANGELOG.md +++ b/apps/ledger-live-mobile/CHANGELOG.md @@ -1,5 +1,12 @@ # live-mobile +## 3.5.0-next.14 + +### Patch Changes + +- Updated dependencies [[`858898d63`](https://github.com/LedgerHQ/ledger-live/commit/858898d63b3d70dc0be4cefbeaba5770c389660b)]: + - @ledgerhq/native-ui@0.8.3-next.0 + ## 3.5.0-next.13 ### Patch Changes diff --git a/apps/ledger-live-mobile/package.json b/apps/ledger-live-mobile/package.json index 3c011fce6b50..3741bd43943d 100644 --- a/apps/ledger-live-mobile/package.json +++ b/apps/ledger-live-mobile/package.json @@ -3,7 +3,7 @@ "node": ">=14" }, "name": "live-mobile", - "version": "3.5.0-next.13", + "version": "3.5.0-next.14", "private": true, "scripts": { "postinstall": "bash ./scripts/post.sh", diff --git a/libs/ui/packages/native/CHANGELOG.md b/libs/ui/packages/native/CHANGELOG.md index 552aba6078af..2bffe99b793c 100644 --- a/libs/ui/packages/native/CHANGELOG.md +++ b/libs/ui/packages/native/CHANGELOG.md @@ -1,5 +1,11 @@ # @ledgerhq/native-ui +## 0.8.3-next.0 + +### Patch Changes + +- [#440](https://github.com/LedgerHQ/ledger-live/pull/440) [`858898d63`](https://github.com/LedgerHQ/ledger-live/commit/858898d63b3d70dc0be4cefbeaba5770c389660b) Thanks [@cgrellard-ledger](https://github.com/cgrellard-ledger)! - UI - native - notifications component styles extended + ## 0.8.2 ### Patch Changes diff --git a/libs/ui/packages/native/package.json b/libs/ui/packages/native/package.json index 1fb614aa9514..8ca7ddbd8586 100644 --- a/libs/ui/packages/native/package.json +++ b/libs/ui/packages/native/package.json @@ -1,6 +1,6 @@ { "name": "@ledgerhq/native-ui", - "version": "0.8.2", + "version": "0.8.3-next.0", "description": "Ledger Live - Mobile UI", "repository": { "type": "git",