"use client";
import { useMemo } from "react";
import type { ThirdwebClient } from "../../../../../client/client.js";
import type { SupportedFiatCurrency } from "../../../../../pay/convert/type.js";
import { checksumAddress } from "../../../../../utils/address.js";
import { formatNumber } from "../../../../../utils/formatNumber.js";
import { toTokens } from "../../../../../utils/units.js";
import {
iconSize,
radius,
spacing,
} from "../../../../core/design-system/index.js";
import { useBuyWithFiatQuotesForProviders } from "../../../../core/hooks/pay/useBuyWithFiatQuotesForProviders.js";
import { formatCurrencyAmount } from "../../ConnectWallet/screens/formatTokenBalance.js";
import { Container } from "../../components/basic.js";
import { Button } from "../../components/buttons.js";
import { Img } from "../../components/Img.js";
import { Spacer } from "../../components/Spacer.js";
import { Spinner } from "../../components/Spinner.js";
import { Text } from "../../components/text.js";
interface FiatProviderSelectionProps {
client: ThirdwebClient;
onProviderSelected: (provider: "coinbase" | "stripe" | "transak") => void;
toChainId: number;
toTokenAddress: string;
toAddress: string;
toAmount?: string;
currency?: SupportedFiatCurrency;
country: string | undefined;
}
const PROVIDERS = [
{
description: "Fast and secure payments",
iconUri: "https://i.ibb.co/LDJ3Rk2t/Frame-5.png",
id: "coinbase" as const,
name: "Coinbase",
},
{
description: "Trusted payment processing",
iconUri: "https://i.ibb.co/CpgQC2Lf/images-3.png",
id: "stripe" as const,
name: "Stripe",
},
{
description: "Global payment solution",
iconUri: "https://i.ibb.co/Xx2r882p/Transak-official-symbol-1.png",
id: "transak" as const,
name: "Transak",
},
];
export function FiatProviderSelection({
onProviderSelected,
client,
toChainId,
toTokenAddress,
toAddress,
toAmount,
currency,
country,
}: FiatProviderSelectionProps) {
// Fetch quotes for all providers
const quoteQueries = useBuyWithFiatQuotesForProviders({
amount: toAmount || "0",
chainId: toChainId,
client,
currency: currency || "USD",
receiver: checksumAddress(toAddress),
tokenAddress: checksumAddress(toTokenAddress),
country,
});
const quotes = useMemo(() => {
return quoteQueries.map((q) => q.data).filter((q) => !!q);
}, [quoteQueries]);
const isPending = quoteQueries.some((q) => q.isLoading);
if (quoteQueries.every((q) => q.isError)) {
return (
No quotes available
);
}
// TODO: add a "remember my choice" checkbox
return (
{!isPending ? (
quotes
.sort((a, b) => a.currencyAmount - b.currencyAmount)
.map((quote) => {
const provider = PROVIDERS.find(
(p) => p.id === quote.intent.onramp,
);
if (!provider) {
return null;
}
return (
);
})
) : (
Searching Providers
Searching for the best providers for this payment
)}
);
}