UNPKG

@daimo/pay

Version:

Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.

606 lines (603 loc) 25.9 kB
import { jsx } from 'react/jsx-runtime'; import { useWallet } from '@solana/wallet-adapter-react'; import { useRef, useEffect } from 'react'; import { useAccount, useConnect } from 'wagmi'; import { ExternalPaymentOptions, DepositAddressPaymentOptions } from '@daimo/pay-common'; import { ROUTES } from '../../constants/routes.js'; import { getAppName } from '../../defaultConfig.js'; import { useChainIsSupported } from '../../hooks/useChainIsSupported.js'; import { useConnector } from '../../hooks/useConnectors.js'; import { useDaimoPay } from '../../hooks/useDaimoPay.js'; import useIsMobile from '../../hooks/useIsMobile.js'; import { usePayContext } from '../../hooks/usePayContext.js'; import { useWallet as useWallet$1, isExternalWallet } from '../../wallets/useWallets.js'; import { walletConfigs } from '../../wallets/walletConfigs.js'; import Modal from '../Common/Modal/index.js'; import { DaimoPayThemeProvider } from '../DaimoPayThemeProvider/DaimoPayThemeProvider.js'; import About from '../Pages/About/index.js'; import Confirmation from '../Pages/Confirmation/index.js'; import Wallets from '../Pages/Connectors/index.js'; import ErrorPage from '../Pages/Error/index.js'; import MobileConnectors from '../Pages/MobileConnectors/index.js'; import Introduction from '../Pages/Onboarding/index.js'; import PayWithToken from '../Pages/PayWithToken/index.js'; import SelectAmount from '../Pages/SelectAmount/index.js'; import SelectDepositAddressAmount from '../Pages/SelectDepositAddressAmount/index.js'; import SelectDepositAddressChain from '../Pages/SelectDepositAddressChain/index.js'; import SelectExchange from '../Pages/SelectExchange/index.js'; import SelectExternalAmount from '../Pages/SelectExternalAmount/index.js'; import SelectMethod from '../Pages/SelectMethod/index.js'; import SelectToken from '../Pages/SelectToken/index.js'; import SelectWalletAmount from '../Pages/SelectWalletAmount/index.js'; import SelectWalletChain from '../Pages/SelectWalletChain/index.js'; import SelectZKP from '../Pages/SelectZKP/index.js'; import ConnectSolana from '../Pages/Solana/ConnectorSolana/index.js'; import PayWithSolanaToken from '../Pages/Solana/PayWithSolanaToken/index.js'; import SelectSolanaAmount from '../Pages/Solana/SelectSolanaAmount/index.js'; import SwitchNetworks from '../Pages/SwitchNetworks/index.js'; import WaitingDepositAddress, { beforeLeave } from '../Pages/WaitingDepositAddress/index.js'; import WaitingExternal from '../Pages/WaitingExternal/index.js'; import WaitingWallet from '../Pages/WaitingWallet/index.js'; import ConnectUsing from './ConnectUsing.js'; function isWalletOption(option) { return Object.keys(walletConfigs).some((id) => { walletConfigs[id].name === option; }); } const DaimoPayModal = ({ mode, theme, customTheme, lang, disableMobileInjector }) => { const context = usePayContext(); const { setMode, setTheme, setCustomTheme, setLang, setDisableMobileInjector } = context; const paymentState = context.paymentState; const { generatePreviewOrder, isDepositFlow, setPaymentWaitingMessage, setSelectedExternalOption, setSelectedTokenOption, setSelectedSolanaTokenOption, setSelectedDepositAddressOption, setSelectedWallet } = paymentState; const daimo = useDaimoPay(); const { paymentState: paymentFsmState, order } = daimo; const { isConnected: isEthConnected, connector, chain, address } = useAccount(); const { connected: isSolanaConnected } = useWallet(); const chainIsSupported = useChainIsSupported(chain?.id); const pendingWallet = useWallet$1(context.pendingConnectorId || ""); const prioritizedWalletId = paymentState.buttonProps?.prioritizedWalletId; const prioritizedConnector = useConnector(prioritizedWalletId ?? ""); const { connect } = useConnect(); const hasHandledInitialOpen = useRef(false); const closeable = !(context.options?.enforceSupportedChains && isEthConnected && !chainIsSupported); const showBackButton = closeable && context.route !== context.uniquePaymentMethodPage && context.route !== ROUTES.SELECT_METHOD && context.route !== ROUTES.CONFIRMATION && context.route !== ROUTES.SELECT_TOKEN && context.route !== ROUTES.ERROR && paymentFsmState !== "error" && paymentFsmState !== "warning"; const onBack = () => { const meta = { event: "click-back" }; if (context.route === ROUTES.CONNECTORS) { context.setRoute(context.uniquePaymentMethodPage, meta); } else if (context.route === ROUTES.SELECT_AMOUNT) { setSelectedTokenOption(void 0); context.setRoute(ROUTES.SELECT_TOKEN, meta); } else if (context.route === ROUTES.SELECT_EXTERNAL_AMOUNT) { setSelectedExternalOption(void 0); context.setRoute(context.uniquePaymentMethodPage, meta); } else if (context.route === ROUTES.SELECT_DEPOSIT_ADDRESS_AMOUNT) { const isTronTopLevel = paymentState.topOptionsOrder.includes("Tron"); const isTronSelected = paymentState.selectedDepositAddressOption?.id === DepositAddressPaymentOptions.TRON_USDT; if (isDepositFlow) { generatePreviewOrder(); } setSelectedDepositAddressOption(void 0); if (isTronTopLevel && isTronSelected) { context.setRoute(ROUTES.SELECT_METHOD, meta); } else { context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, meta); } } else if (context.route === ROUTES.WAITING_EXTERNAL) { setPaymentWaitingMessage(void 0); if (isDepositFlow) { generatePreviewOrder(); context.setRoute(ROUTES.SELECT_EXTERNAL_AMOUNT, meta); } else { setSelectedExternalOption(void 0); context.setRoute(context.uniquePaymentMethodPage, meta); } } else if (context.route === ROUTES.PAY_WITH_TOKEN) { if (isDepositFlow) { generatePreviewOrder(); context.setRoute(ROUTES.SELECT_AMOUNT, meta); } else { setSelectedTokenOption(void 0); context.setRoute(ROUTES.SELECT_TOKEN, meta); } } else if (context.route === ROUTES.MOBILECONNECTORS) { context.setRoute(ROUTES.CONNECTORS, meta); } else if (context.route === ROUTES.ONBOARDING) { context.setRoute(ROUTES.CONNECTORS, meta); } else if (context.route === ROUTES.WAITING_DEPOSIT_ADDRESS) { const isTronTopLevel = paymentState.topOptionsOrder.includes("Tron"); const isTronSelected = paymentState.selectedDepositAddressOption?.id === DepositAddressPaymentOptions.TRON_USDT; if (isDepositFlow) { generatePreviewOrder(); if (paymentState.selectedDepositAddressOption === void 0) { context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, meta); } else { context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_AMOUNT, meta); } } else { setSelectedDepositAddressOption(void 0); if (isTronTopLevel && isTronSelected) { context.setRoute(ROUTES.SELECT_METHOD, meta); } else { context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, meta); } } } else if (context.route === ROUTES.WAITING_WALLET) { if (isDepositFlow) { generatePreviewOrder(); context.setRoute(ROUTES.SELECT_WALLET_AMOUNT, meta); } else { setSelectedWallet(void 0); context.setRoute(ROUTES.CONNECTORS, meta); } } else if (context.route === ROUTES.SOLANA_SELECT_AMOUNT) { setSelectedSolanaTokenOption(void 0); context.setRoute(ROUTES.SELECT_TOKEN, meta); } else if (context.route === ROUTES.SOLANA_PAY_WITH_TOKEN) { if (isDepositFlow) { generatePreviewOrder(); context.setRoute(ROUTES.SOLANA_SELECT_AMOUNT, meta); } else { setSelectedSolanaTokenOption(void 0); context.setRoute(ROUTES.SELECT_TOKEN, meta); } } else if (context.route === ROUTES.CONNECT) { if (isDepositFlow && isExternalWallet(pendingWallet)) { generatePreviewOrder(); context.setRoute(ROUTES.SELECT_WALLET_AMOUNT, meta); } else { context.setRoute(context.uniquePaymentMethodPage, meta); } } else { context.setRoute(context.uniquePaymentMethodPage, meta); } }; const pages = { [ROUTES.SELECT_METHOD]: /* @__PURE__ */ jsx(SelectMethod, {}), [ROUTES.SELECT_TOKEN]: /* @__PURE__ */ jsx(SelectToken, {}), [ROUTES.SELECT_AMOUNT]: /* @__PURE__ */ jsx(SelectAmount, {}), [ROUTES.SELECT_EXTERNAL_AMOUNT]: /* @__PURE__ */ jsx(SelectExternalAmount, {}), [ROUTES.SELECT_EXCHANGE]: /* @__PURE__ */ jsx(SelectExchange, {}), [ROUTES.SELECT_DEPOSIT_ADDRESS_AMOUNT]: /* @__PURE__ */ jsx(SelectDepositAddressAmount, {}), [ROUTES.SELECT_WALLET_AMOUNT]: /* @__PURE__ */ jsx(SelectWalletAmount, {}), [ROUTES.SELECT_WALLET_CHAIN]: /* @__PURE__ */ jsx(SelectWalletChain, {}), [ROUTES.WAITING_EXTERNAL]: /* @__PURE__ */ jsx(WaitingExternal, {}), [ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN]: /* @__PURE__ */ jsx(SelectDepositAddressChain, {}), [ROUTES.WAITING_DEPOSIT_ADDRESS]: /* @__PURE__ */ jsx(WaitingDepositAddress, {}), [ROUTES.SELECT_ZKP2P]: /* @__PURE__ */ jsx(SelectZKP, {}), [ROUTES.WAITING_WALLET]: /* @__PURE__ */ jsx(WaitingWallet, {}), [ROUTES.CONFIRMATION]: /* @__PURE__ */ jsx(Confirmation, {}), [ROUTES.ERROR]: /* @__PURE__ */ jsx(ErrorPage, {}), [ROUTES.PAY_WITH_TOKEN]: /* @__PURE__ */ jsx(PayWithToken, {}), [ROUTES.SOLANA_CONNECTOR]: /* @__PURE__ */ jsx(ConnectSolana, {}), [ROUTES.SOLANA_SELECT_AMOUNT]: /* @__PURE__ */ jsx(SelectSolanaAmount, {}), [ROUTES.SOLANA_PAY_WITH_TOKEN]: /* @__PURE__ */ jsx(PayWithSolanaToken, {}), // Unused routes. Kept to minimize connectkit merge conflicts. [ROUTES.ONBOARDING]: /* @__PURE__ */ jsx(Introduction, {}), [ROUTES.ABOUT]: /* @__PURE__ */ jsx(About, {}), [ROUTES.CONNECTORS]: /* @__PURE__ */ jsx(Wallets, {}), [ROUTES.MOBILECONNECTORS]: /* @__PURE__ */ jsx(MobileConnectors, {}), [ROUTES.CONNECT]: /* @__PURE__ */ jsx(ConnectUsing, {}), [ROUTES.SWITCHNETWORKS]: /* @__PURE__ */ jsx(SwitchNetworks, {}) }; const leaveGuards = { [ROUTES.WAITING_DEPOSIT_ADDRESS]: () => beforeLeave(context.trpc, order?.id?.toString()) }; const guardedAction = async (action) => { const guard = leaveGuards[context.route]; if (!guard) { action(); return; } let canProceed = false; try { canProceed = await guard(); } catch (error) { console.error("error in leave guard:", error); return; } if (!canProceed) return; try { action(); } catch (error) { console.error("error performing guarded action:", error); return; } if (paymentFsmState === "warning") { try { daimo.dismissWarning(); } catch (error) { console.error("error dismissing warning:", error); } } }; function hide() { if (isDepositFlow) { generatePreviewOrder(); } context.setOpen(false, { event: "click-close" }); } const goToManualAddressScreen = (eventSuffix) => { if (paymentState.isDepositFlow) { context.setUniquePaymentMethodPage(ROUTES.SELECT_DEPOSIT_ADDRESS_AMOUNT); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_AMOUNT, { event: `unique_payment_option_deposit_${eventSuffix}` }); } else { context.setUniquePaymentMethodPage(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN); context.setRoute(ROUTES.WAITING_DEPOSIT_ADDRESS, { event: `unique_payment_option_${eventSuffix}` }); } }; const goToExternalScreen = (eventSuffix) => { if (paymentState.isDepositFlow) { context.setUniquePaymentMethodPage(ROUTES.SELECT_EXTERNAL_AMOUNT); context.setRoute(ROUTES.SELECT_EXTERNAL_AMOUNT, { event: `unique_payment_option_${eventSuffix}_deposit` }); } else { context.setUniquePaymentMethodPage(ROUTES.WAITING_EXTERNAL); context.setRoute(ROUTES.WAITING_EXTERNAL, { event: `unique_payment_option_${eventSuffix}` }); } }; const { isMobile } = useIsMobile(); useEffect(() => { if (!context.open) { hasHandledInitialOpen.current = false; return; } if (context.route !== ROUTES.SELECT_METHOD) return; const paymentOptions = paymentState.buttonProps?.paymentOptions; const hasUniqueOption = paymentOptions && paymentOptions.length === 1; if (hasUniqueOption) { const option = paymentOptions[0]; if (Array.isArray(option)) { context.setUniquePaymentMethodPage(ROUTES.CONNECTORS); context.setRoute(ROUTES.CONNECTORS, { event: "unique_payment_option_wallets" }); return; } switch (option) { case "Tron": const tronOption = paymentState.depositAddressOptions.options?.find( (option2) => option2.id === DepositAddressPaymentOptions.TRON_USDT ); if (tronOption) { setSelectedDepositAddressOption(tronOption); goToManualAddressScreen("tron"); } else if (!paymentState.depositAddressOptions.loading) { context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_tron_fallback" }); } break; case "AllExchanges": context.setUniquePaymentMethodPage(ROUTES.SELECT_EXCHANGE); context.setRoute(ROUTES.SELECT_EXCHANGE, { event: "unique_payment_option_all_exchanges" }); break; case "AllAddresses": context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_manual_address" }); break; case "Base": const baseOption = paymentState.depositAddressOptions.options?.find( (option2) => option2.id === DepositAddressPaymentOptions.BASE ); if (baseOption) { setSelectedDepositAddressOption(baseOption); goToManualAddressScreen("base"); } else if (!paymentState.depositAddressOptions.loading) { context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_base_fallback" }); } break; case "Arbitrum": const arbitrumOption = paymentState.depositAddressOptions.options?.find( (option2) => option2.id === DepositAddressPaymentOptions.ARBITRUM ); if (arbitrumOption) { setSelectedDepositAddressOption(arbitrumOption); goToManualAddressScreen("arbitrum"); } else if (!paymentState.depositAddressOptions.loading) { context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_arbitrum_fallback" }); } break; case "Optimism": const optimismOption = paymentState.depositAddressOptions.options?.find( (option2) => option2.id === DepositAddressPaymentOptions.OP_MAINNET ); if (optimismOption) { setSelectedDepositAddressOption(optimismOption); goToManualAddressScreen("optimism"); } else if (!paymentState.depositAddressOptions.loading) { context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_optimism_fallback" }); } break; case "Polygon": const polygonOption = paymentState.depositAddressOptions.options?.find( (option2) => option2.id === DepositAddressPaymentOptions.POLYGON ); if (polygonOption) { setSelectedDepositAddressOption(polygonOption); goToManualAddressScreen("polygon"); } else if (!paymentState.depositAddressOptions.loading) { context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_polygon_fallback" }); } break; case "Ethereum": const ethereumOption = paymentState.depositAddressOptions.options?.find( (option2) => option2.id === DepositAddressPaymentOptions.ETH_L1 ); if (ethereumOption) { setSelectedDepositAddressOption(ethereumOption); goToManualAddressScreen("ethereum"); } else if (!paymentState.depositAddressOptions.loading) { context.setUniquePaymentMethodPage( ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN ); context.setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN, { event: "unique_payment_option_ethereum_fallback" }); } break; case "Binance": const exchangeOptions = paymentState.externalPaymentOptions.options.get("exchange"); const binanceOption = exchangeOptions?.find( (option2) => option2.id === ExternalPaymentOptions.Binance ); if (binanceOption) { setSelectedExternalOption(binanceOption); goToExternalScreen("binance"); } else if (!paymentState.externalPaymentOptions.loading) { context.setUniquePaymentMethodPage(ROUTES.SELECT_EXCHANGE); context.setRoute(ROUTES.SELECT_EXCHANGE, { event: "unique_payment_option_binance_fallback" }); } break; case "Coinbase": const coinbaseExchangeOptions = paymentState.externalPaymentOptions.options.get("exchange"); const coinbaseOption = coinbaseExchangeOptions?.find( (option2) => option2.id === ExternalPaymentOptions.Coinbase ); if (coinbaseOption) { setSelectedExternalOption(coinbaseOption); goToExternalScreen("coinbase"); } else if (!paymentState.externalPaymentOptions.loading) { context.setUniquePaymentMethodPage(ROUTES.SELECT_EXCHANGE); context.setRoute(ROUTES.SELECT_EXCHANGE, { event: "unique_payment_option_coinbase_fallback" }); } break; case "Lemon": const lemonExternalOptions = paymentState.externalPaymentOptions.options.get("external"); const lemonOption = lemonExternalOptions?.find( (option2) => option2.id === ExternalPaymentOptions.Lemon ); if (lemonOption) { setSelectedExternalOption(lemonOption); goToExternalScreen("lemon"); } else if (!paymentState.externalPaymentOptions.loading) { console.warn( "[DaimoPayModal] Lemon not found in external payment options" ); context.setUniquePaymentMethodPage(ROUTES.SELECT_METHOD); context.setRoute(ROUTES.SELECT_METHOD, { event: "unique_payment_option_lemon_not_found" }); } break; case "AllWallets": context.setUniquePaymentMethodPage(ROUTES.CONNECTORS); context.setRoute(ROUTES.CONNECTORS, { event: "unique_payment_option_wallets" }); break; default: const singleOption = option; if (isWalletOption(singleOption)) { const walletId = Object.keys(walletConfigs).find((id) => { const wallet = walletConfigs[id]; const optionLower = singleOption.toLowerCase(); return wallet.name?.toLowerCase() === optionLower || wallet.shortName?.toLowerCase() === optionLower || wallet.name?.toLowerCase().includes(optionLower) || id.toLowerCase() === optionLower || id.toLowerCase().includes(optionLower); }); if (walletId) { const wallet = walletConfigs[walletId]; paymentState.setSelectedWallet(wallet); if (paymentState.isDepositFlow) { context.setUniquePaymentMethodPage(ROUTES.SELECT_WALLET_AMOUNT); context.setRoute(ROUTES.SELECT_WALLET_AMOUNT, { event: "single_option_wallet_deposit", wallet: singleOption }); } else if (!isMobile && wallet.getDaimoPayDeeplink) { context.setPendingConnectorId(walletId); context.setUniquePaymentMethodPage(ROUTES.CONNECT); context.setRoute(ROUTES.CONNECT, { event: "single_option_wallet_qr", wallet: singleOption }); } else if (isMobile && wallet.getDaimoPayDeeplink) { paymentState.openInWalletBrowser(wallet); } else { context.setRoute(ROUTES.CONNECTORS, { event: "single_option_wallet", wallet: singleOption }); } } else { context.setUniquePaymentMethodPage(ROUTES.SELECT_METHOD); } } else { context.setUniquePaymentMethodPage(ROUTES.SELECT_METHOD); } break; } } const isWalletsUniquePaymentOption = hasUniqueOption && (Array.isArray(paymentOptions[0]) || paymentOptions[0] === "AllWallets"); const evmOptionsCount = paymentState.walletPaymentOptions.options?.length ?? 0; const isEvmLoading = paymentState.walletPaymentOptions.isLoading; const solanaOptionsCount = paymentState.solanaPaymentOptions.options?.length ?? 0; const isSolanaLoading = paymentState.solanaPaymentOptions.isLoading; if ((!hasUniqueOption || isWalletsUniquePaymentOption) && isEthConnected && !isSolanaConnected && (!isMobile || !disableMobileInjector) && !isEvmLoading && evmOptionsCount > 0) { if (!hasHandledInitialOpen.current) { hasHandledInitialOpen.current = true; if (prioritizedWalletId && prioritizedConnector && connector?.id !== prioritizedWalletId) { connect({ connector: prioritizedConnector }); } } paymentState.setTokenMode("evm"); context.setRoute(ROUTES.SELECT_TOKEN, { event: "eth_connected_on_open", walletId: connector?.id, chainId: chain?.id, address }); } else if ((!hasUniqueOption || isWalletsUniquePaymentOption) && isSolanaConnected && !isEthConnected && !disableMobileInjector && !isSolanaLoading && solanaOptionsCount > 0) { hasHandledInitialOpen.current = true; paymentState.setTokenMode("solana"); context.setRoute(ROUTES.SELECT_TOKEN, { event: "solana_connected_on_open" }); } }, [ context.open, paymentState.walletPaymentOptions.options, paymentState.walletPaymentOptions.isLoading, paymentState.solanaPaymentOptions.options, paymentState.solanaPaymentOptions.isLoading, paymentState.externalPaymentOptions.options, paymentState.externalPaymentOptions.loading, paymentState.depositAddressOptions.options, paymentState.depositAddressOptions.loading, address, chain?.id, connector?.id, context.uniquePaymentMethodPage ]); useEffect(() => { if (context.route === ROUTES.CONNECT || context.route === ROUTES.CONNECTORS || context.route === ROUTES.MOBILECONNECTORS) { if (isEthConnected) { paymentState.setTokenMode("evm"); context.setRoute(ROUTES.SELECT_TOKEN, { event: "connected", walletId: connector?.id, chainId: chain?.id, address }); } } }, [isEthConnected, context.route, connector?.id, chain?.id, address]); useEffect(() => { if (!context.open) return; if (context.route !== ROUTES.SELECT_TOKEN) return; if (hasHandledInitialOpen.current) return; if (!isEthConnected) return; if (prioritizedWalletId && prioritizedConnector && connector?.id !== prioritizedWalletId) { hasHandledInitialOpen.current = true; connect({ connector: prioritizedConnector }); } }, [ context.open, context.route, isEthConnected, prioritizedWalletId, prioritizedConnector, connector?.id, connect ]); useEffect(() => setMode(mode), [mode, setMode]); useEffect(() => setTheme(theme), [theme, setTheme]); useEffect(() => setCustomTheme(customTheme), [customTheme, setCustomTheme]); useEffect(() => setLang(lang), [lang, setLang]); useEffect( () => setDisableMobileInjector(disableMobileInjector), [disableMobileInjector, setDisableMobileInjector] ); useEffect(() => { const appName = getAppName(); if (!appName || !context.open) return; const title = document.createElement("meta"); title.setAttribute("property", "og:title"); title.setAttribute("content", appName); document.head.prepend(title); return () => { try { document.head.removeChild(title); } catch { } }; }, [context.open]); return /* @__PURE__ */ jsx(DaimoPayThemeProvider, { theme, customTheme, mode, children: /* @__PURE__ */ jsx( Modal, { open: context.open, pages, pageId: context.route, onClose: closeable && paymentFsmState !== "warning" ? () => guardedAction(hide) : void 0, onInfo: void 0, onBack: showBackButton ? () => guardedAction(onBack) : void 0 } ) }); }; export { DaimoPayModal }; //# sourceMappingURL=index.js.map