import { BottomSheetBackdrop, BottomSheetBackdropProps } from '@gorhom/bottom-sheet' import { NativeStackNavigationOptions, createNativeStackNavigator, } from '@react-navigation/native-stack' import { createBottomSheetNavigator } from '@th3rdwave/react-navigation-bottom-sheet' import * as React from 'react' import { Platform } from 'react-native' import AccountKeyEducation from 'src/account/AccountKeyEducation' import AccounSetupFailureScreen from 'src/account/AccountSetupFailureScreen' import GoldEducation from 'src/account/GoldEducation' import LegalSubmenu from 'src/account/LegalSubmenu' import Licenses from 'src/account/Licenses' import PreferencesSubmenu from 'src/account/PreferencesSubmenu' import Profile from 'src/account/Profile' import ProfileSubmenu from 'src/account/ProfileSubmenu' import SecuritySubmenu from 'src/account/SecuritySubmenu' import StoreWipeRecoveryScreen from 'src/account/StoreWipeRecoveryScreen' import Support from 'src/account/Support' import SupportContact from 'src/account/SupportContact' import AppLoading from 'src/app/AppLoading' import DebugImages from 'src/app/DebugImages' import ErrorScreen from 'src/app/ErrorScreen' import SanctionedCountryErrorScreen from 'src/app/SanctionedCountryErrorScreen' import UpgradeScreen from 'src/app/UpgradeScreen' import BackupComplete from 'src/backup/BackupComplete' import BackupIntroduction from 'src/backup/BackupIntroduction' import BackupPhrase, { navOptionsForBackupPhrase } from 'src/backup/BackupPhrase' import BackupQuiz, { navOptionsForQuiz } from 'src/backup/BackupQuiz' import DappShortcutTransactionRequest from 'src/dapps/DappShortcutTransactionRequest' import DappShortcutsRewards from 'src/dapps/DappShortcutsRewards' import DappsScreen from 'src/dapps/DappsScreen' import EarnConfirmationScreen from 'src/earn/EarnConfirmationScreen' import EarnEnterAmount from 'src/earn/EarnEnterAmount' import EarnHome from 'src/earn/EarnHome' import EarnInfoScreen from 'src/earn/EarnInfoScreen' import EarnPoolInfoScreen from 'src/earn/poolInfoScreen/EarnPoolInfoScreen' import BidaliScreen from 'src/fiatExchanges/BidaliScreen' import CashInSuccess from 'src/fiatExchanges/CashInSuccess' import ExchangeQR from 'src/fiatExchanges/ExchangeQR' import ExternalExchanges, { externalExchangesScreenOptions, } from 'src/fiatExchanges/ExternalExchanges' import FiatExchangeAmount from 'src/fiatExchanges/FiatExchangeAmount' import FiatExchangeCurrencyBottomSheet from 'src/fiatExchanges/FiatExchangeCurrencyBottomSheet' import SelectProviderScreen from 'src/fiatExchanges/SelectProvider' import SimplexScreen from 'src/fiatExchanges/SimplexScreen' import Spend, { spendScreenOptions } from 'src/fiatExchanges/Spend' import WithdrawSpend from 'src/fiatExchanges/WithdrawSpend' import FiatDetailsScreen from 'src/fiatconnect/FiatDetailsScreen' import KycLanding from 'src/fiatconnect/KycLanding' import FiatConnectLinkAccountScreen from 'src/fiatconnect/LinkAccountScreen' import FiatConnectRefetchQuoteScreen from 'src/fiatconnect/RefetchQuoteScreen' import FiatConnectReviewScreen from 'src/fiatconnect/ReviewScreen' import FiatConnectTransferStatusScreen from 'src/fiatconnect/TransferStatusScreen' import KycDenied from 'src/fiatconnect/kyc/KycDenied' import KycExpired from 'src/fiatconnect/kyc/KycExpired' import KycPending from 'src/fiatconnect/kyc/KycPending' import NotificationCenter from 'src/home/NotificationCenter' import { currentLanguageSelector } from 'src/i18n/selectors' import ImportWallet from 'src/import/ImportWallet' import Invite from 'src/invite/Invite' import JumpstartEnterAmount from 'src/jumpstart/JumpstartEnterAmount' import JumpstartSendConfirmation from 'src/jumpstart/JumpstartSendConfirmation' import JumpstartShareLink from 'src/jumpstart/JumpstartShareLink' import JumpstartTransactionDetailsScreen from 'src/jumpstart/JumpstartTransactionDetailsScreen' import KeylessBackupIntro from 'src/keylessBackup/KeylessBackupIntro' import KeylessBackupPhoneCodeInput from 'src/keylessBackup/KeylessBackupPhoneCodeInput' import KeylessBackupPhoneInput from 'src/keylessBackup/KeylessBackupPhoneInput' import KeylessBackupProgress from 'src/keylessBackup/KeylessBackupProgress' import LinkPhoneNumber from 'src/keylessBackup/LinkPhoneNumber' import SignInWithEmail from 'src/keylessBackup/SignInWithEmail' import WalletSecurityPrimer from 'src/keylessBackup/WalletSecurityPrimer' import { KeylessBackupFlow, KeylessBackupOrigin } from 'src/keylessBackup/types' import Language from 'src/language/Language' import SelectLocalCurrency from 'src/localCurrency/SelectLocalCurrency' import { emptyHeader, headerWithBackButton, noHeader, nuxNavigationOptions, } from 'src/navigator/Headers' import QRNavigator from 'src/navigator/QRNavigator' import { Screens } from 'src/navigator/Screens' import SettingsMenu from 'src/navigator/SettingsMenu' import TabNavigator from 'src/navigator/TabNavigator' import { getInitialRoute } from 'src/navigator/initialRoute' import { StackParamList } from 'src/navigator/types' import NftsInfoCarousel from 'src/nfts/NftsInfoCarousel' import ChooseYourAdventure from 'src/onboarding/ChooseYourAdventure' import EnableBiometry from 'src/onboarding/registration/EnableBiometry' import ImportSelect from 'src/onboarding/registration/ImportSelect' import OnboardingRecoveryPhrase from 'src/onboarding/registration/OnboardingRecoveryPhrase' import ProtectWallet from 'src/onboarding/registration/ProtectWallet' import RegulatoryTerms from 'src/onboarding/registration/RegulatoryTerms' import SelectCountry from 'src/onboarding/registration/SelectCountry' import OnboardingSuccessScreen from 'src/onboarding/success/OnboardingSuccessScreen' import Welcome from 'src/onboarding/welcome/Welcome' import PincodeEnter from 'src/pincode/PincodeEnter' import PincodeSet from 'src/pincode/PincodeSet' import PointsHome from 'src/points/PointsHome' import PointsIntro from 'src/points/PointsIntro' import { RootState } from 'src/redux/reducers' import { store } from 'src/redux/store' import SendConfirmation, { sendConfirmationScreenNavOptions } from 'src/send/SendConfirmation' import SendEnterAmount from 'src/send/SendEnterAmount' import SendSelectRecipient from 'src/send/SendSelectRecipient' import ValidateRecipientAccount, { validateRecipientAccountScreenNavOptions, } from 'src/send/ValidateRecipientAccount' import ValidateRecipientIntro, { validateRecipientIntroScreenNavOptions, } from 'src/send/ValidateRecipientIntro' import { getFeatureGate } from 'src/statsig' import { StatsigFeatureGates } from 'src/statsig/types' import styles from 'src/styles/styles' import variables from 'src/styles/variables' import SwapScreen from 'src/swap/SwapScreen' import SwapScreenV2 from 'src/swap/SwapScreenV2' import TokenDetailsScreen from 'src/tokens/TokenDetails' import TokenImportScreen from 'src/tokens/TokenImport' import TransactionDetailsScreen from 'src/transactions/feed/TransactionDetailsScreen' import Logger from 'src/utils/Logger' import { ExtractProps } from 'src/utils/typescript' import VerificationCodeInputScreen from 'src/verify/VerificationCodeInputScreen' import VerificationStartScreen from 'src/verify/VerificationStartScreen' import WalletConnectSessionsScreen from 'src/walletConnect/screens/Sessions' import WalletConnectRequest from 'src/walletConnect/screens/WalletConnectRequest' import WebViewScreen from 'src/webview/WebViewScreen' const TAG = 'Navigator' const Stack = createNativeStackNavigator() const ModalStack = createNativeStackNavigator() const RootStack = createBottomSheetNavigator() const commonScreens = (Navigator: typeof Stack) => { return ( <> ) } const verificationScreens = (Navigator: typeof Stack) => { return ( <> ) } const nuxScreens = (Navigator: typeof Stack) => ( <> ) const sendScreens = (Navigator: typeof Stack) => ( <> ) const consumerIncentivesScreens = (Navigator: typeof Stack) => ( <> ) const backupScreens = (Navigator: typeof Stack) => ( <> ) const settingsScreens = (Navigator: typeof Stack) => ( <> ) const generalScreens = (Navigator: typeof Stack) => ( <> ) const earnScreens = (Navigator: typeof Stack) => ( <> ) const swapScreens = (Navigator: typeof Stack) => { const showNewEnterAmountForSwap = getFeatureGate( StatsigFeatureGates.SHOW_NEW_ENTER_AMOUNT_FOR_SWAP ) return ( <> ) } const nftScreens = (Navigator: typeof Stack) => ( <> ) const assetScreens = (Navigator: typeof Stack) => ( <> ) const pointsScreens = (Navigator: typeof Stack) => ( <> ) const mapStateToProps = (state: RootState) => { return { language: currentLanguageSelector(state), acceptedTerms: state.account.acceptedTerms, pincodeType: state.account.pincodeType, lastOnboardingStepScreen: state.account.lastOnboardingStepScreen as keyof StackParamList, onboardingCompleted: state.account.onboardingCompleted, } } type InitialRouteName = ExtractProps['initialRouteName'] function MainStackScreen() { const [initialRouteName, setInitialRoute] = React.useState(undefined) React.useEffect(() => { const { language, acceptedTerms, pincodeType, onboardingCompleted, lastOnboardingStepScreen } = mapStateToProps(store.getState()) const initialRoute: InitialRouteName = getInitialRoute({ language, acceptedTerms, pincodeType, onboardingCompleted, lastOnboardingStepScreen, }) setInitialRoute(initialRoute) Logger.info(`${TAG}@MainStackScreen`, `Initial route: ${initialRoute}`) // Wait for next frame to avoid slight gap when hiding the // TODO: make this work with the expo splash screen // requestAnimationFrame(() => SplashScreen.hide()) }, []) if (!initialRouteName) { return } return ( {commonScreens(Stack)} {sendScreens(Stack)} {nuxScreens(Stack)} {verificationScreens(Stack)} {backupScreens(Stack)} {consumerIncentivesScreens(Stack)} {settingsScreens(Stack)} {generalScreens(Stack)} {swapScreens(Stack)} {earnScreens(Stack)} {nftScreens(Stack)} {assetScreens(Stack)} {pointsScreens(Stack)} ) } const modalAnimatedScreens = (Navigator: typeof Stack) => ( <> ) const mainScreenNavOptions = () => ({ headerShown: false, }) function nativeBottomSheets(BottomSheet: typeof RootStack) { // Note: scrolling views inside bottom sheet screens should use the relevant // components from gorhom/react-native-bottom-sheet instead of directly from // react-native return ( <> ) } function ModalStackScreen() { return ( {modalAnimatedScreens(ModalStack)} ) } function RootStackScreen() { const renderBackdrop = React.useCallback( (props: BottomSheetBackdropProps) => ( ), [] ) return ( {nativeBottomSheets(RootStack)} ) } export default RootStackScreen