import { NativeStackScreenProps } from '@react-navigation/native-stack' import React, { useLayoutEffect, useState } from 'react' import { useAsync } from 'react-async-hook' import { useTranslation } from 'react-i18next' import { ActivityIndicator, StyleSheet, View } from 'react-native' import { e164NumberSelector } from 'src/account/selectors' import { showError } from 'src/alert/actions' import AppAnalytics from 'src/analytics/AppAnalytics' import { FiatExchangeEvents } from 'src/analytics/Events' import { ErrorMessages } from 'src/app/ErrorMessages' import { phoneNumberVerifiedSelector } from 'src/app/selectors' import BackButton from 'src/components/BackButton' import Button, { BtnSizes } from 'src/components/Button' import WebView from 'src/components/WebView' import { DEEP_LINK_URL_SCHEME, SIMPLEX_FEES_URL } from 'src/config' import ReviewFees from 'src/fiatExchanges/ReviewFees' import { fetchSimplexPaymentData } from 'src/fiatExchanges/utils' import i18n from 'src/i18n' import { getLocalCurrencyCode } from 'src/localCurrency/selectors' import { HeaderTitleWithBalance, emptyHeader } from 'src/navigator/Headers' import { Screens } from 'src/navigator/Screens' import { StackParamList } from 'src/navigator/types' import { userLocationDataSelector } from 'src/networkInfo/selectors' import { useDispatch, useSelector } from 'src/redux/hooks' import colors from 'src/styles/colors' import { useTokenInfo } from 'src/tokens/hooks' import { resolveCurrency } from 'src/utils/currencies' import { navigateToURI } from 'src/utils/linking' import { currentAccountSelector } from 'src/web3/selectors' type RouteProps = NativeStackScreenProps type Props = RouteProps function SimplexScreen({ route, navigation }: Props) { const [loadSimplexCheckout, setLoadSimplexCheckout] = useState(false) const [redirected, setRedirected] = useState(false) const { t } = useTranslation() const { simplexQuote, tokenId } = route.params const account = useSelector(currentAccountSelector) const e164PhoneNumber = useSelector(e164NumberSelector) const phoneNumberConfirmed = useSelector(phoneNumberVerifiedSelector) const localCurrency = useSelector(getLocalCurrencyCode) const { ipAddress: userIpAddress } = useSelector(userLocationDataSelector) const dispatch = useDispatch() const tokenInfo = useTokenInfo(tokenId) if (!tokenInfo) { throw new Error(`Token info not found for token ID ${tokenId}`) } const symbol = tokenInfo.symbol const feeIsWaived = simplexQuote.fiat_money.total_amount - simplexQuote.fiat_money.base_amount <= 0 const onNavigationStateChange = ({ url }: any) => { if (url?.includes('/payments/new')) { setRedirected(true) } else if (url?.startsWith(`${DEEP_LINK_URL_SCHEME}://wallet`)) { navigateToURI(url) } } const onButtonPress = () => { AppAnalytics.track(FiatExchangeEvents.cico_simplex_open_webview, { amount: simplexQuote.digital_money.amount, cryptoCurrency: symbol, feeInFiat: simplexQuote.fiat_money.total_amount - simplexQuote.fiat_money.base_amount, fiatCurrency: simplexQuote.fiat_money.currency, }) setLoadSimplexCheckout(true) navigation.setOptions({ ...emptyHeader, headerLeft: () => , headerTitle: 'Simplex', }) } useLayoutEffect(() => { const token = resolveCurrency(simplexQuote.digital_money.currency) navigation.setOptions({ ...emptyHeader, headerLeft: () => , headerTitle: () => , }) }, []) const asyncSimplexPaymentData = useAsync(async () => { if (!account || !userIpAddress) { return } try { const simplexPaymentData = fetchSimplexPaymentData( account, e164PhoneNumber, phoneNumberConfirmed, simplexQuote, userIpAddress ) return simplexPaymentData } catch (error) { dispatch(showError(ErrorMessages.SIMPLEX_PURCHASE_FETCH_FAILED)) } }, []) const simplexPaymentRequest = asyncSimplexPaymentData?.result return ( {loadSimplexCheckout && simplexPaymentRequest && !redirected && ( )} {!loadSimplexCheckout || !simplexPaymentRequest ? (