diff --git a/.changeset/modern-forks-invent.md b/.changeset/modern-forks-invent.md new file mode 100644 index 000000000000..4183f7941731 --- /dev/null +++ b/.changeset/modern-forks-invent.md @@ -0,0 +1,5 @@ +--- +"live-mobile": patch +--- + +bugfix crash case in ReceiveFunds/02-SelectAccount 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 6af84ef3d585..4b7224be2c17 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -4,7 +4,7 @@ import { useSelector } from "react-redux"; import { Button, Flex, Text } from "@ledgerhq/native-ui"; import { useTranslation } from "react-i18next"; -import { Account, AccountLike, SubAccount, TokenAccount } from "@ledgerhq/types-live"; +import { Account, SubAccount, TokenAccount } from "@ledgerhq/types-live"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/account/index"; import { flattenAccountsByCryptoCurrencyScreenSelector } from "~/reducers/accounts"; import { NavigatorName, ScreenName } from "~/const"; @@ -25,6 +25,8 @@ type SubAccountEnhanced = SubAccount & { triggerCreateAccount: boolean; }; +type AccountLikeEnhanced = SubAccountEnhanced | Account | TokenAccount; + type NavigationProps = BaseComposite< StackNavigatorProps >; @@ -54,21 +56,22 @@ function ReceiveSelectAccount({ const aggregatedAccounts = useMemo( () => currency && currency.type === "TokenCurrency" - ? parentAccounts!.reduce((accs, pa) => { - const tokenAccounts = (pa as Account).subAccounts - ? (pa as Account).subAccounts?.filter( - acc => acc.type === "TokenAccount" && acc.token.id === currency.id, - ) - : []; + ? parentAccounts!.reduce((accs, pa) => { + const tokenAccounts = + pa.type === "Account" && pa.subAccounts + ? pa.subAccounts?.filter( + acc => acc.type === "TokenAccount" && acc.token.id === currency.id, + ) + : []; if (tokenAccounts && tokenAccounts.length > 0) { accs.push(...tokenAccounts); - } else { - const tokenAcc = makeEmptyTokenAccount(pa as Account, currency); + } else if (pa.type === "Account") { + const tokenAcc = makeEmptyTokenAccount(pa, currency); const tokenA: SubAccountEnhanced = { ...tokenAcc, - parentAccount: pa as Account, + parentAccount: pa, triggerCreateAccount: true, }; @@ -82,7 +85,7 @@ function ReceiveSelectAccount({ ); const selectAccount = useCallback( - (account: AccountLike) => { + (account: AccountLikeEnhanced) => { if (currency) { track("account_clicked", { asset: currency.name, @@ -90,8 +93,8 @@ function ReceiveSelectAccount({ }); navigation.navigate(ScreenName.ReceiveConfirmation, { ...route.params, - accountId: (account as SubAccountEnhanced)?.parentId || account.id, - createTokenAccount: (account as SubAccountEnhanced)?.triggerCreateAccount, + accountId: (account.type !== "Account" && account?.parentId) || account.id, + createTokenAccount: "triggerCreateAccount" in account && account?.triggerCreateAccount, }); } }, @@ -101,21 +104,12 @@ function ReceiveSelectAccount({ const walletState = useSelector(walletSelector); const renderItem = useCallback( - ({ item }: ListRenderItemInfo) => ( + ({ item }: ListRenderItemInfo) => ( - {accountNameWithDefaultSelector( - walletState, - ((item as SubAccountEnhanced).parentAccount as Account) || - (item as TokenAccount).token.parentCurrency, - )} - - ) : null + {accountNameWithDefaultSelector(walletState, item)} } onPress={() => selectAccount(item)} /> @@ -144,7 +138,7 @@ function ReceiveSelectAccount({ } }, [currency, navigationAccount]); - const keyExtractor = useCallback((item: AccountLike) => item?.id, []); + const keyExtractor = useCallback((item: AccountLikeEnhanced) => item?.id, []); return currency && aggregatedAccounts && aggregatedAccounts.length > 0 ? ( <>