import { useQuery } from "@tanstack/react-query";
import { useState } from "react";
import { trackPayEvent } from "../../../../analytics/track/pay.js";
import type { ThirdwebClient } from "../../../../client/client.js";
import type { SupportedFiatCurrency } from "../../../../pay/convert/type.js";
import type { WaitForReceiptOptions } from "../../../../transaction/actions/wait-for-tx-receipt.js";
import type { PreparedTransaction } from "../../../../transaction/prepare-transaction.js";
import { resolvePromisedValue } from "../../../../utils/promise/resolve-promised-value.js";
import { CustomThemeProvider } from "../../../core/design-system/CustomThemeProvider.js";
import type { Theme } from "../../../core/design-system/index.js";
import type { PayUIOptions } from "../../../core/hooks/connection/ConnectButtonProps.js";
import { useActiveAccount } from "../../../core/hooks/wallets/useActiveAccount.js";
import { useActiveWallet } from "../../../core/hooks/wallets/useActiveWallet.js";
import type { SupportedTokens } from "../../../core/utils/defaultTokens.js";
import { webWindowAdapter } from "../../adapters/WindowAdapter.js";
import { LoadingScreen } from "../../wallets/shared/LoadingScreen.js";
import { TransactionWidgetContentWrapper } from "../Bridge/TransactionWidget.js";
import { useConnectLocale } from "../ConnectWallet/locale/getConnectLocale.js";
import { Modal } from "../components/Modal.js";
import type { LocaleId } from "../types.js";
import { DepositScreen } from "./DepositScreen.js";
import { ExecutingTxScreen } from "./ExecutingScreen.js";
type ModalProps = {
title: string;
txId: string;
onComplete: () => void;
onClose: () => void;
client: ThirdwebClient;
localeId: LocaleId;
supportedTokens?: SupportedTokens;
theme: Theme | "light" | "dark";
tx: PreparedTransaction;
payOptions: PayUIOptions;
onTxSent: (data: WaitForReceiptOptions) => void;
modalMode: "buy" | "deposit";
country: string | undefined;
currency: SupportedFiatCurrency | undefined;
};
export function TransactionModal(props: ModalProps) {
const account = useActiveAccount();
const wallet = useActiveWallet();
useQuery({
enabled: !!wallet && !!account,
queryFn: async () => {
if (!account || !wallet) {
throw new Error(); // never happens, because enabled is false
}
trackPayEvent({
client: props.client,
event:
props.modalMode === "buy"
? "open_pay_transaction_modal"
: "open_pay_deposit_modal",
toChainId: props.tx.chain.id,
toToken: props.tx.erc20Value
? (await resolvePromisedValue(props.tx.erc20Value))?.tokenAddress
: undefined,
walletAddress: account.address,
walletType: wallet.id,
});
return null;
},
queryKey: ["transaction-modal-event", props.txId],
});
return (
{
if (!_open) {
props.onClose();
}
}}
size="compact"
>
);
}
function TransactionModalContent(props: ModalProps) {
if (props.modalMode === "deposit") {
return ;
}
return (
{
props.onTxSent(data);
}}
title={props.payOptions.metadata?.name}
description={props.payOptions.metadata?.description}
image={props.payOptions.metadata?.image}
paymentMethods={
props.payOptions.buyWithCrypto === false
? ["card"]
: props.payOptions.buyWithFiat === false
? ["crypto"]
: ["crypto", "card"]
}
showThirdwebBranding={props.payOptions.showThirdwebBranding}
supportedTokens={props.supportedTokens}
onError={undefined}
paymentLinkId={undefined}
buttonLabel={undefined}
purchaseData={undefined}
/>
);
}
function DepositAndExecuteTx(props: ModalProps) {
const localeQuery = useConnectLocale(props.localeId);
const [screen, setScreen] = useState<"deposit" | "execute-tx">("deposit");
if (!localeQuery.data) {
return ;
}
if (screen === "execute-tx") {
return (
{
setScreen("deposit");
}}
closeModal={props.onClose}
onTxSent={props.onTxSent}
tx={props.tx}
windowAdapter={webWindowAdapter}
/>
);
}
if (screen === "deposit") {
return (
{
setScreen("execute-tx");
}}
tx={props.tx}
/>
);
}
return null;
}