diff --git a/packages/mobile/src/core/CustomizeWallet/CustomizeWallet.tsx b/packages/mobile/src/core/CustomizeWallet/CustomizeWallet.tsx index a4c9029e5..a12a629a1 100644 --- a/packages/mobile/src/core/CustomizeWallet/CustomizeWallet.tsx +++ b/packages/mobile/src/core/CustomizeWallet/CustomizeWallet.tsx @@ -14,6 +14,7 @@ import { TouchableOpacity, View, WalletColor, + WalletIcon, getWalletColorHex, isAndroid, ns, @@ -29,7 +30,7 @@ import React, { useRef, useState, } from 'react'; -import { Keyboard, LayoutChangeEvent, Text as RNText } from 'react-native'; +import { Keyboard, LayoutChangeEvent } from 'react-native'; import { ScrollView } from 'react-native-gesture-handler'; import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated'; import { EmojiPicker } from './EmojiPicker'; @@ -163,7 +164,7 @@ export const CustomizeWallet: FC = memo((props) => { { backgroundColor: getWalletColorHex(selectedColor) }, ]} > - {emoji} + diff --git a/packages/mobile/src/core/CustomizeWallet/EmojiPicker/EmojiPicker.tsx b/packages/mobile/src/core/CustomizeWallet/EmojiPicker/EmojiPicker.tsx index 0d90f00f2..8a14f9842 100644 --- a/packages/mobile/src/core/CustomizeWallet/EmojiPicker/EmojiPicker.tsx +++ b/packages/mobile/src/core/CustomizeWallet/EmojiPicker/EmojiPicker.tsx @@ -1,8 +1,9 @@ import { isAndroid } from '$utils'; import { FlashList } from '@shopify/flash-list'; -import { Steezy, View, ns } from '@tonkeeper/uikit'; +import { Steezy, View, WalletIcon, ns } from '@tonkeeper/uikit'; +import { WALLET_ICONS } from '@tonkeeper/uikit/src/utils/walletIcons'; import React, { memo, useCallback } from 'react'; -import { Text, TouchableOpacity } from 'react-native'; +import { TouchableOpacity } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; interface Emoji { @@ -12,6 +13,11 @@ interface Emoji { const emojis: Emoji[] = require('./emojis.json'); +const items: Emoji[] = [ + ...WALLET_ICONS.map((value) => ({ emoji: value, name: value })), + ...emojis, +]; + interface EmojiPickerProps { onChange: (value: string) => void; } @@ -22,7 +28,7 @@ export const EmojiPicker: React.FC = memo(({ onChange }) => { return ( onChange(item.emoji)}> - {item.emoji} + ); @@ -33,7 +39,7 @@ export const EmojiPicker: React.FC = memo(({ onChange }) => { return ( item.name} renderItem={renderEmoji} diff --git a/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.style.ts b/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.style.ts index 0a2a7d642..87d40e452 100644 --- a/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.style.ts +++ b/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.style.ts @@ -9,38 +9,19 @@ export const LoaderWrap = styled.View` `; export const Header = styled.View` - flex-direction: row; - padding: ${ns(0)}px ${ns(16)}px ${ns(32)}px; + align-items: center; + padding-top: ${ns(48)}px; `; export const MerchantPhoto = styled(FastImage).attrs({ resizeMode: 'cover', })` - width: ${ns(72)}px; - height: ${ns(72)}px; - border-radius: ${ns(72 / 2)}px; + width: ${ns(96)}px; + height: ${ns(96)}px; + border-radius: ${ns(96 / 2)}px; background: ${({ theme }) => theme.colors.backgroundSecondary}; `; -export const MerchantInfoWrap = styled.View` - margin-left: ${ns(16)}px; - flex: 1; - align-items: flex-start; -`; - -export const MerchantInfo = styled.View` - height: ${ns(72)}px; - justify-content: center; -`; - -export const ProductNameWrapper = styled.View` - margin-top: ${ns(2)}px; -`; - -export const Content = styled.View` - padding-horizontal: ${ns(16)}px; -`; - export const ButtonWrap = styled.View` margin-top: ${ns(16)}px; flex: 0 0 auto; diff --git a/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.tsx b/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.tsx index 8f57058ef..9fa748ae4 100644 --- a/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.tsx +++ b/packages/mobile/src/core/ModalContainer/CreateSubscription/CreateSubscription.tsx @@ -1,19 +1,14 @@ -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { Alert, Linking } from 'react-native'; import { useDispatch, useSelector } from 'react-redux'; import TonWeb from 'tonweb'; import { getUnixTime } from 'date-fns'; import { CreateSubscriptionProps } from './CreateSubscription.interface'; import * as S from './CreateSubscription.style'; -import { Button, Icon, Loader, Text } from '$uikit'; -import { List } from '@tonkeeper/uikit'; +import { Button, Loader, Text } from '$uikit'; +import { List, Spacer } from '@tonkeeper/uikit'; import { SubscriptionModel } from '$store/models'; -import { - format, - formatSubscriptionPeriod, - toLocaleNumber, - triggerNotificationSuccess, -} from '$utils'; +import { format, formatSubscriptionPeriod, toLocaleNumber } from '$utils'; import { subscriptionsActions } from '$store/subscriptions'; import { CryptoCurrencies, Decimals } from '$shared/constants'; import { formatCryptoCurrency } from '$utils/currency'; @@ -29,6 +24,7 @@ import { SheetActions, useNavigation } from '@tonkeeper/router'; import { Modal, View } from '@tonkeeper/uikit'; import { config } from '$config'; import { tk } from '$wallet'; +import { ActionFooter, useActionFooter } from '../NFTOperations/NFTOperationFooter'; export const CreateSubscription: FC = ({ invoiceId = null, @@ -43,15 +39,13 @@ export const CreateSubscription: FC = ({ const { amount: balance } = useWalletInfo(); const [isLoading, setLoading] = useState(!isEdit); - const [failed, setFailed] = useState(0); const [fee, setFee] = useState( passedFee || (subscription && subscription.fee ? subscription.fee : '~'), ); const [info, setInfo] = useState(subscription); - const [isSending, setSending] = useState(false); - const [isSuccess, setSuccess] = useState(false); const [totalMoreThanBalance, setTotalMoreThanBalance] = React.useState(false); - const closeTimer = useRef(null); + + const { footerRef, onConfirm } = useActionFooter(); useEffect(() => { if (fee !== '~') { @@ -61,39 +55,6 @@ export const CreateSubscription: FC = ({ } }, [info, balance, fee]); - useEffect(() => { - if (isSuccess) { - triggerNotificationSuccess(); - closeTimer.current = setTimeout(() => { - nav.goBack(); - - if (!isEdit && !subscription) { - const returnUrl = info!.userReturnUrl; - Alert.alert( - t('subscription_back_to_merchant_title'), - t('subscription_back_to_merchant_caption'), - [ - { - text: t('cancel'), - style: 'cancel', - }, - { - text: t('subscription_back_to_merchant_button'), - onPress: () => { - Linking.openURL(returnUrl).catch((err) => { - console.log(err); - }); - }, - }, - ], - ); - } - }, 2500); - } - - return () => closeTimer.current && clearTimeout(closeTimer.current); - }, [isSuccess]); - const loadInfo = useCallback(() => { const host = config.get('subscriptionsHost', tk.wallet.isTestnet); network @@ -110,7 +71,7 @@ export const CreateSubscription: FC = ({ Toast.fail(e.message); nav.goBack(); }); - }, [invoiceId]); + }, [invoiceId, nav]); useEffect(() => { if (!isEdit) { @@ -169,22 +130,47 @@ export const CreateSubscription: FC = ({ return format((info.chargedAt + info.intervalSec) * 1000, 'EEE, MMM d'); }, [info]); - const handleSubscribe = useCallback(() => { - setSending(true); - dispatch( - subscriptionsActions.subscribe({ - subscription: info!, - onDone: () => { - setSuccess(true); - }, - onFail: () => { - setSending(false); - }, - }), - ); - }, [dispatch, info]); + const handleSubscribe = useCallback(async () => { + onConfirm(async ({ startLoading }) => { + startLoading(); + + await new Promise((resolve, reject) => { + dispatch( + subscriptionsActions.subscribe({ + subscription: info!, + onDone: () => { + resolve(); + + if (!isEdit && !subscription) { + const returnUrl = info!.userReturnUrl; + Alert.alert( + t('subscription_back_to_merchant_title'), + t('subscription_back_to_merchant_caption'), + [ + { + text: t('cancel'), + style: 'cancel', + }, + { + text: t('subscription_back_to_merchant_button'), + onPress: () => { + Linking.openURL(returnUrl).catch((err) => { + console.log(err); + }); + }, + }, + ], + ); + } + }, + onFail: reject, + }), + ); + }); + })(); + }, [dispatch, info, isEdit, onConfirm, subscription]); - const handleUnsubscribe = useCallback(() => { + const handleUnsubscribe = useCallback(async () => { Alert.alert( t('subscription_cancel_alert_title'), t('subscription_cancel_alert_caption', { @@ -199,23 +185,24 @@ export const CreateSubscription: FC = ({ text: t('subscription_cancel_alert_submit_btn'), style: 'destructive', onPress: () => { - setSending(true); - dispatch( - subscriptionsActions.unsubscribe({ - subscription: info!, - onDone: () => { - setSuccess(true); - }, - onFail: () => { - setSending(false); - }, - }), - ); + onConfirm(async ({ startLoading }) => { + startLoading(); + + await new Promise((resolve, reject) => { + dispatch( + subscriptionsActions.unsubscribe({ + subscription: info!, + onDone: resolve, + onFail: reject, + }), + ); + }); + })(); }, }, ], ); - }, [dispatch, info, nextBill, t]); + }, [dispatch, info, nextBill, onConfirm]); const isButtonShown = useMemo(() => { if (!info) { @@ -227,7 +214,7 @@ export const CreateSubscription: FC = ({ } return info.status === 'new' || info.isActive; - }, [info, isEdit, isSuccess, isSending]); + }, [info, isEdit]); const handleOpenMerchant = useCallback(() => { Linking.openURL(info!.returnUrl).catch((err) => { @@ -236,45 +223,32 @@ export const CreateSubscription: FC = ({ }, [info]); function renderButton() { - if (isSuccess) { - return ( - - - - - {t('subscription_sent')} - - - - ); - } - - if (isSending) { - return ( - - - - ); - } - if (isEdit || info?.isActive) { return ( - + ); } return ( - + redirectToActivity={false} + ref={footerRef} + /> ); } @@ -287,37 +261,33 @@ export const CreateSubscription: FC = ({ ); } - // ToDo: Сделать верстку, когда будет дизайн - if (failed) { - return Failed; - } - return ( <> - - - - {info.merchantName} - - - - {info.productName} - - - - {info.status === 'created' && ( + + + {info.merchantName} + + + + {info.productName} + + {info.status === 'created' && ( + <> + - )} - + + )} + = ({ /> )} - - {isButtonShown && {renderButton()}} - + {isButtonShown && renderButton()} ); } return ( - + {renderContent()} diff --git a/packages/mobile/src/core/ModalContainer/InsufficientFunds/InsufficientFunds.tsx b/packages/mobile/src/core/ModalContainer/InsufficientFunds/InsufficientFunds.tsx index 80b68734a..d32fa2722 100644 --- a/packages/mobile/src/core/ModalContainer/InsufficientFunds/InsufficientFunds.tsx +++ b/packages/mobile/src/core/ModalContainer/InsufficientFunds/InsufficientFunds.tsx @@ -1,6 +1,6 @@ import React, { memo, useCallback, useMemo } from 'react'; import { t } from '@tonkeeper/shared/i18n'; -import { Modal, Spacer } from '@tonkeeper/uikit'; +import { Modal, Spacer, WalletIcon } from '@tonkeeper/uikit'; import { openExploreTab, openRefillBatteryModal } from '$navigation'; import { SheetActions, useNavigation } from '@tonkeeper/router'; import { Button, Icon, Text } from '$uikit'; @@ -35,6 +35,7 @@ export interface InsufficientFundsParams { stakingFee?: string; fee?: string; isStakingDeposit?: boolean; + walletIdentifier?: string; } export const InsufficientFundsModal = memo((props) => { @@ -46,6 +47,7 @@ export const InsufficientFundsModal = memo((props) => { stakingFee, fee, isStakingDeposit, + walletIdentifier, } = props; const { balance: batteryBalance } = useBatteryBalance(); const nav = useNavigation(); @@ -120,6 +122,8 @@ export const InsufficientFundsModal = memo((props) => { ); }, [currency, fee, formattedAmount, formattedBalance, isStakingDeposit, stakingFee]); + const wallet = walletIdentifier ? tk.wallets.get(walletIdentifier)! : tk.wallet; + return ( @@ -128,7 +132,15 @@ export const InsufficientFundsModal = memo((props) => { - {t('txActions.signRaw.insufficientFunds.title')} + {tk.wallets.size > 1 ? ( + <> + {t('txActions.signRaw.insufficientFunds.title_multiwallet')}{' '} + {' '} + {wallet.config.name} + + ) : ( + t('txActions.signRaw.insufficientFunds.title') + )} {content} diff --git a/packages/mobile/src/core/ModalContainer/NFTOperations/Modals/SignRawModal.tsx b/packages/mobile/src/core/ModalContainer/NFTOperations/Modals/SignRawModal.tsx index 071b32479..1a7db0601 100644 --- a/packages/mobile/src/core/ModalContainer/NFTOperations/Modals/SignRawModal.tsx +++ b/packages/mobile/src/core/ModalContainer/NFTOperations/Modals/SignRawModal.tsx @@ -6,7 +6,16 @@ import { calculateMessageTransferAmount, delay } from '$utils'; import { debugLog } from '$utils/debugLog'; import { t } from '@tonkeeper/shared/i18n'; import { Toast } from '$store'; -import { List, Modal, Spacer, Steezy, Text, View } from '@tonkeeper/uikit'; +import { + List, + Modal, + Spacer, + Steezy, + Text, + View, + WalletIcon, + isAndroid, +} from '@tonkeeper/uikit'; import { push } from '$navigation/imperative'; import { SheetActions, useNavigation } from '@tonkeeper/router'; import { @@ -219,9 +228,11 @@ export const SignRawModal = memo((props) => { {t('confirmSendModal.wallet')} - - {wallet.config.emoji} - + {wallet.config.name} @@ -342,6 +353,7 @@ export const openSignRawModal = async ( return openInsufficientFundsModal({ totalAmount, balance: checkResult.balance, + walletIdentifier, }); } } @@ -392,6 +404,7 @@ const styles = Steezy.create({ subtitleContainer: { flexDirection: 'row', gap: 4, + alignItems: 'center', }, withBatteryContainer: { paddingHorizontal: 32, @@ -399,4 +412,8 @@ const styles = Steezy.create({ actionsList: { marginBottom: 0, }, + emoji: { + fontSize: isAndroid ? 17 : 20, + marginTop: isAndroid ? -1 : 1, + }, }); diff --git a/packages/mobile/src/core/ModalContainer/NFTOperations/NFTOperationFooter.tsx b/packages/mobile/src/core/ModalContainer/NFTOperations/NFTOperationFooter.tsx index 936bab614..2f623c90f 100644 --- a/packages/mobile/src/core/ModalContainer/NFTOperations/NFTOperationFooter.tsx +++ b/packages/mobile/src/core/ModalContainer/NFTOperations/NFTOperationFooter.tsx @@ -131,6 +131,7 @@ interface ActionFooterProps { responseOptions?: TxResponseOptions; withCloseButton?: boolean; confirmTitle?: string; + secondary?: boolean; onPressConfirm: () => Promise; onCloseModal?: () => void; disabled?: boolean; @@ -205,6 +206,7 @@ export const ActionFooter = React.forwardRef props.onPressConfirm()} + mode={props.secondary ? 'secondary' : 'primary'} > {props.confirmTitle ?? t('nft_confirm_operation')} diff --git a/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.style.ts b/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.style.ts index 485ca184c..39e786921 100644 --- a/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.style.ts +++ b/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.style.ts @@ -98,3 +98,9 @@ export const Icon = styled(FastImage).attrs({ export const ItemSkeleton = styled.View` align-self: flex-end; `; + +export const WalletNameRow = styled.View` + flex-direction: row; + align-items: center; + justify-content: flex-end; +`; diff --git a/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.tsx b/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.tsx index ba0a1e898..b8eff459b 100644 --- a/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.tsx +++ b/packages/mobile/src/core/NFTSend/steps/ConfirmStep/ConfirmStep.tsx @@ -21,6 +21,7 @@ import { truncateDecimal } from '$utils'; import { BatteryState } from '@tonkeeper/shared/utils/battery'; import { useBatteryState } from '@tonkeeper/shared/query/hooks/useBatteryState'; import { tk } from '$wallet'; +import { Steezy, WalletIcon, isAndroid } from '@tonkeeper/uikit'; interface Props extends StepComponentProps { recipient: SendRecipient | null; @@ -106,9 +107,15 @@ const ConfirmStepComponent: FC = (props) => { {t('send_screen_steps.comfirm.wallet')} - - {tk.wallet.config.emoji} {tk.wallet.config.name} - + + + + {tk.wallet.config.name} + @@ -219,3 +226,10 @@ const ConfirmStepComponent: FC = (props) => { }; export const ConfirmStep = memo(ConfirmStepComponent); + +const styles = Steezy.create({ + emoji: { + fontSize: isAndroid ? 17 : 20, + marginTop: isAndroid ? -1 : 1, + }, +}); diff --git a/packages/mobile/src/core/Send/steps/AddressStep/AddressStep.tsx b/packages/mobile/src/core/Send/steps/AddressStep/AddressStep.tsx index 770caa4e4..cad9853d0 100644 --- a/packages/mobile/src/core/Send/steps/AddressStep/AddressStep.tsx +++ b/packages/mobile/src/core/Send/steps/AddressStep/AddressStep.tsx @@ -100,7 +100,7 @@ const AddressStepComponent: FC = (props) => { return new TonWeb.Address(resolvedDomain.wallet.address).toString( true, true, - true, + false, ) as string; } diff --git a/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.style.ts b/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.style.ts index 6477a0a47..96de5f44f 100644 --- a/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.style.ts +++ b/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.style.ts @@ -104,3 +104,9 @@ export const WarningRow = styled.View` export const WarningIcon = styled.View` margin-top: ${ns(2)}px; `; + +export const WalletNameRow = styled.View` + flex-direction: row; + align-items: center; + justify-content: flex-end; +`; diff --git a/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.tsx b/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.tsx index c9478a2ae..0c3d9b829 100644 --- a/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.tsx +++ b/packages/mobile/src/core/Send/steps/ConfirmStep/ConfirmStep.tsx @@ -25,6 +25,7 @@ import { BatteryState } from '@tonkeeper/shared/utils/battery'; import { TokenType } from '$core/Send/Send.interface'; import { useBalancesState, useWallet } from '@tonkeeper/shared/hooks'; import { tk } from '$wallet'; +import { Steezy, WalletIcon, isAndroid } from '@tonkeeper/uikit'; const ConfirmStepComponent: FC = (props) => { const { @@ -226,9 +227,15 @@ const ConfirmStepComponent: FC = (props) => { {t('send_screen_steps.comfirm.wallet')} - - {tk.wallet.config.emoji} {tk.wallet.config.name} - + + + + {tk.wallet.config.name} + @@ -370,3 +377,10 @@ const ConfirmStepComponent: FC = (props) => { }; export const ConfirmStep = memo(ConfirmStepComponent); + +const styles = Steezy.create({ + emoji: { + fontSize: isAndroid ? 17 : 20, + marginTop: isAndroid ? -1 : 1, + }, +}); diff --git a/packages/mobile/src/core/Settings/Settings.tsx b/packages/mobile/src/core/Settings/Settings.tsx index da00ea3d4..b7bb8b85b 100644 --- a/packages/mobile/src/core/Settings/Settings.tsx +++ b/packages/mobile/src/core/Settings/Settings.tsx @@ -323,7 +323,7 @@ export const Settings: FC = () => { onPress={handleManageTokens} /> )} - {hasSubscriptions && ( + {!wallet.isWatchOnly && hasSubscriptions && ( = (props) => { {t('send_screen_steps.comfirm.wallet')} - - {tk.wallet.config.emoji} {tk.wallet.config.name} - + + + + {tk.wallet.config.name} + @@ -212,3 +219,10 @@ const ConfirmStepComponent: FC = (props) => { }; export const ConfirmStep = memo(ConfirmStepComponent); + +const styles = Steezy.create({ + emoji: { + fontSize: isAndroid ? 17 : 20, + marginTop: isAndroid ? -1 : 1, + }, +}); diff --git a/packages/mobile/src/navigation/MainStack/MainStack.tsx b/packages/mobile/src/navigation/MainStack/MainStack.tsx index c2a9f5106..dba6efb0a 100644 --- a/packages/mobile/src/navigation/MainStack/MainStack.tsx +++ b/packages/mobile/src/navigation/MainStack/MainStack.tsx @@ -157,6 +157,7 @@ export const MainStack: FC = () => { { {t('later')} } + hideBackButton /> diff --git a/packages/mobile/src/screens/ChooseWallets/ChooseWallets.tsx b/packages/mobile/src/screens/ChooseWallets/ChooseWallets.tsx index 59f73b1c1..71f0242b8 100644 --- a/packages/mobile/src/screens/ChooseWallets/ChooseWallets.tsx +++ b/packages/mobile/src/screens/ChooseWallets/ChooseWallets.tsx @@ -11,6 +11,7 @@ import { RouteProp } from '@react-navigation/native'; import { Address } from '@tonkeeper/shared/Address'; import { formatter } from '@tonkeeper/shared/formatter'; import { useImportWallet } from '$hooks/useImportWallet'; +import { DEFAULT_WALLET_VERSION } from '$wallet/constants'; export const ChooseWallets: FC<{ route: RouteProp; @@ -22,7 +23,10 @@ export const ChooseWallets: FC<{ const [selectedVersions, setSelectedVersions] = useState( walletsInfo - .filter((item) => item.balance > 0 || item.tokens) + .filter( + (item) => + item.balance > 0 || item.tokens || item.version === DEFAULT_WALLET_VERSION, + ) .map((item) => item.version), ); const [loading, setLoading] = useState(false); diff --git a/packages/mobile/src/screens/StartScreen/StartScreen.tsx b/packages/mobile/src/screens/StartScreen/StartScreen.tsx index 6431b3ca8..58cc6eecb 100644 --- a/packages/mobile/src/screens/StartScreen/StartScreen.tsx +++ b/packages/mobile/src/screens/StartScreen/StartScreen.tsx @@ -16,6 +16,9 @@ import { MainStackRouteNames } from '$navigation'; import { useDispatch } from 'react-redux'; import { walletActions } from '$store/wallet'; import { useNavigation } from '@tonkeeper/router'; +import { network } from '@tonkeeper/core'; +import { config } from '$config'; +import DeviceInfo from 'react-native-device-info'; const HEIGHT_RATIO = deviceHeight / 844; @@ -31,10 +34,30 @@ export const StartScreen = memo(() => { const logoShapesPosX = origShapesWidth / 2 - dimensions.width / 2; const logoShapesPosY = origShapesHeight / 2 - (origShapesHeight * ratioHeight) / 2; + const unsubscribeNotifications = useCallback(async () => { + // unsubscribe from all notifications, if app was reinstalled + try { + const deviceId = DeviceInfo.getUniqueId(); + const endpoint = `${config.get('tonapiIOEndpoint')}/unsubscribe`; + + await network.post(endpoint, { + params: { + device: deviceId, + }, + }); + } catch {} + }, []); + const handleCreatePress = useCallback(() => { dispatch(walletActions.generateVault()); + unsubscribeNotifications(); nav.navigate(MainStackRouteNames.CreateWalletStack); - }, [dispatch, nav]); + }, [dispatch, nav, unsubscribeNotifications]); + + const handleImportPress = useCallback(() => { + unsubscribeNotifications(); + nav.navigate(MainStackRouteNames.ImportWalletStack); + }, [nav, unsubscribeNotifications]); return ( @@ -79,7 +102,7 @@ export const StartScreen = memo(() => {