@b3dotfun/sdk 0.0.16 → 0.0.17-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/anyspend/react/components/AnySpend.d.ts +5 -2
- package/dist/cjs/anyspend/react/components/AnySpend.js +264 -55
- package/dist/cjs/anyspend/react/components/AnySpendCustom.js +25 -29
- package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.d.ts +15 -0
- package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.js +49 -0
- package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +20 -0
- package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +118 -0
- package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.d.ts +15 -0
- package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +71 -0
- package/dist/cjs/anyspend/react/components/common/OrderDetails.d.ts +2 -0
- package/dist/cjs/anyspend/react/components/common/OrderDetails.js +41 -60
- package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.d.ts +18 -0
- package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +42 -0
- package/dist/cjs/anyspend/react/components/common/OrderStatus.js +28 -5
- package/dist/cjs/anyspend/react/components/common/OrderTokenAmountFiat.d.ts +13 -0
- package/dist/cjs/anyspend/react/components/common/OrderTokenAmountFiat.js +50 -0
- package/dist/cjs/anyspend/react/components/common/OrderTokenAmountNew.d.ts +16 -0
- package/dist/cjs/anyspend/react/components/common/OrderTokenAmountNew.js +63 -0
- package/dist/cjs/anyspend/react/components/common/PanelOnramp.d.ts +11 -1
- package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +53 -15
- package/dist/cjs/anyspend/react/components/common/PanelOnrampPayment.js +1 -12
- package/dist/cjs/anyspend/react/components/common/PaymentStripeWeb2.js +4 -12
- package/dist/cjs/anyspend/react/components/common/StepProgress.d.ts +11 -0
- package/dist/cjs/anyspend/react/components/common/StepProgress.js +22 -0
- package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.d.ts +16 -0
- package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.js +73 -0
- package/dist/cjs/anyspend/react/components/index.d.ts +3 -0
- package/dist/cjs/anyspend/react/components/index.js +7 -1
- package/dist/cjs/anyspend/react/components/webview/WebviewOnrampPayment.js +1 -10
- package/dist/cjs/anyspend/utils/format.d.ts +1 -0
- package/dist/cjs/anyspend/utils/format.js +23 -10
- package/dist/cjs/anyspend/utils/number.d.ts +7 -0
- package/dist/cjs/anyspend/utils/number.js +18 -0
- package/dist/esm/anyspend/react/components/AnySpend.d.ts +5 -2
- package/dist/esm/anyspend/react/components/AnySpend.js +266 -57
- package/dist/esm/anyspend/react/components/AnySpendCustom.js +27 -31
- package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.d.ts +15 -0
- package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.js +46 -0
- package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +20 -0
- package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +114 -0
- package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.d.ts +15 -0
- package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +67 -0
- package/dist/esm/anyspend/react/components/common/OrderDetails.d.ts +2 -0
- package/dist/esm/anyspend/react/components/common/OrderDetails.js +43 -62
- package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.d.ts +18 -0
- package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +36 -0
- package/dist/esm/anyspend/react/components/common/OrderStatus.js +27 -4
- package/dist/esm/anyspend/react/components/common/OrderTokenAmountFiat.d.ts +13 -0
- package/dist/esm/anyspend/react/components/common/OrderTokenAmountFiat.js +47 -0
- package/dist/esm/anyspend/react/components/common/OrderTokenAmountNew.d.ts +16 -0
- package/dist/esm/anyspend/react/components/common/OrderTokenAmountNew.js +60 -0
- package/dist/esm/anyspend/react/components/common/PanelOnramp.d.ts +11 -1
- package/dist/esm/anyspend/react/components/common/PanelOnramp.js +54 -16
- package/dist/esm/anyspend/react/components/common/PanelOnrampPayment.js +1 -12
- package/dist/esm/anyspend/react/components/common/PaymentStripeWeb2.js +7 -15
- package/dist/esm/anyspend/react/components/common/StepProgress.d.ts +11 -0
- package/dist/esm/anyspend/react/components/common/StepProgress.js +19 -0
- package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.d.ts +16 -0
- package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.js +70 -0
- package/dist/esm/anyspend/react/components/index.d.ts +3 -0
- package/dist/esm/anyspend/react/components/index.js +3 -0
- package/dist/esm/anyspend/react/components/webview/WebviewOnrampPayment.js +1 -10
- package/dist/esm/anyspend/utils/format.d.ts +1 -0
- package/dist/esm/anyspend/utils/format.js +23 -10
- package/dist/esm/anyspend/utils/number.d.ts +7 -0
- package/dist/esm/anyspend/utils/number.js +17 -0
- package/dist/styles/index.css +1 -1
- package/dist/types/anyspend/react/components/AnySpend.d.ts +5 -2
- package/dist/types/anyspend/react/components/common/ConnectWalletPayment.d.ts +15 -0
- package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +20 -0
- package/dist/types/anyspend/react/components/common/FiatPaymentMethod.d.ts +15 -0
- package/dist/types/anyspend/react/components/common/OrderDetails.d.ts +2 -0
- package/dist/types/anyspend/react/components/common/OrderDetailsCollapsible.d.ts +18 -0
- package/dist/types/anyspend/react/components/common/OrderTokenAmountFiat.d.ts +13 -0
- package/dist/types/anyspend/react/components/common/OrderTokenAmountNew.d.ts +16 -0
- package/dist/types/anyspend/react/components/common/PanelOnramp.d.ts +11 -1
- package/dist/types/anyspend/react/components/common/StepProgress.d.ts +11 -0
- package/dist/types/anyspend/react/components/common/TransferCryptoDetails.d.ts +16 -0
- package/dist/types/anyspend/react/components/index.d.ts +3 -0
- package/dist/types/anyspend/utils/format.d.ts +1 -0
- package/dist/types/anyspend/utils/number.d.ts +7 -0
- package/package.json +1 -1
- package/src/anyspend/react/components/AnySpend.tsx +535 -177
- package/src/anyspend/react/components/AnySpendCustom.tsx +33 -38
- package/src/anyspend/react/components/common/ConnectWalletPayment.tsx +124 -0
- package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +227 -0
- package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +173 -0
- package/src/anyspend/react/components/common/OrderDetails.tsx +123 -250
- package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +156 -0
- package/src/anyspend/react/components/common/OrderStatus.tsx +47 -24
- package/src/anyspend/react/components/common/OrderTokenAmountFiat.tsx +147 -0
- package/src/anyspend/react/components/common/OrderTokenAmountNew.tsx +215 -0
- package/src/anyspend/react/components/common/PanelOnramp.tsx +215 -62
- package/src/anyspend/react/components/common/PanelOnrampPayment.tsx +1 -14
- package/src/anyspend/react/components/common/PaymentStripeWeb2.tsx +42 -99
- package/src/anyspend/react/components/common/StepProgress.tsx +104 -0
- package/src/anyspend/react/components/common/TransferCryptoDetails.tsx +261 -0
- package/src/anyspend/react/components/index.ts +3 -0
- package/src/anyspend/react/components/webview/WebviewOnrampPayment.tsx +1 -11
- package/src/anyspend/utils/format.ts +24 -11
- package/src/anyspend/utils/number.ts +18 -0
- package/src/styles/index.css +30 -11
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { eqci, getDefaultToken } from "../../../anyspend/index.js";
|
|
2
|
+
import { eqci, getDefaultToken, roundUpUSDCBaseAmountToNearest } from "../../../anyspend/index.js";
|
|
3
3
|
import { RELAY_ETH_ADDRESS, USDC_BASE } from "../../../anyspend/constants/index.js";
|
|
4
4
|
import { useAnyspendCreateOnrampOrder, useAnyspendCreateOrder, useAnyspendOrderAndTransactions, useAnyspendQuote, useAnyspendTokenList, useGeoOnrampOptions, } from "../../../anyspend/react/index.js";
|
|
5
5
|
import { Badge, Button, Dialog, DialogContent, Input, ShinyButton, Skeleton, StyleRoot, Tabs, TabsContent, TabsList, TabTrigger, TextShimmer, Tooltip, TooltipContent, TooltipTrigger, TransitionPanel, useAccountWallet, useHasMounted, useProfile, useRouter, useSearchParamsSSR, useTokenBalancesByChain, } from "../../../global-account/react/index.js";
|
|
6
6
|
import { cn } from "../../../shared/utils/index.js";
|
|
7
7
|
import centerTruncate from "../../../shared/utils/centerTruncate.js";
|
|
8
|
-
import { formatTokenAmount } from "../../../shared/utils/number.js";
|
|
8
|
+
import { formatTokenAmount, formatUnits } from "../../../shared/utils/number.js";
|
|
9
9
|
import { simpleHashChainToChainName } from "../../../shared/utils/simplehash.js";
|
|
10
10
|
import invariant from "invariant";
|
|
11
11
|
import { ChevronRightCircle, Loader2 } from "lucide-react";
|
|
@@ -156,8 +156,8 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
|
|
|
156
156
|
const getRelayQuoteRequest = useMemo(() => {
|
|
157
157
|
return generateGetRelayQuoteRequest({
|
|
158
158
|
orderType: orderType,
|
|
159
|
-
srcChainId: srcChainId,
|
|
160
|
-
srcToken: srcToken,
|
|
159
|
+
srcChainId: activeTab === "fiat" ? base.id : srcChainId,
|
|
160
|
+
srcToken: activeTab === "fiat" ? USDC_BASE : srcToken,
|
|
161
161
|
dstChainId: dstChainId,
|
|
162
162
|
dstToken: dstToken,
|
|
163
163
|
dstAmount: dstAmount,
|
|
@@ -168,20 +168,21 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
|
|
|
168
168
|
spenderAddress: spenderAddress,
|
|
169
169
|
});
|
|
170
170
|
}, [
|
|
171
|
+
activeTab,
|
|
171
172
|
contractAddress,
|
|
172
173
|
dstAmount,
|
|
173
174
|
dstChainId,
|
|
174
175
|
dstToken,
|
|
175
176
|
encodedData,
|
|
176
|
-
metadata,
|
|
177
|
+
metadata?.nftContract?.tokenId,
|
|
178
|
+
metadata?.nftContract?.type,
|
|
179
|
+
metadata?.type,
|
|
177
180
|
orderType,
|
|
178
181
|
spenderAddress,
|
|
179
182
|
srcChainId,
|
|
180
183
|
srcToken,
|
|
181
184
|
]);
|
|
182
185
|
const { anyspendQuote, isLoadingAnyspendQuote } = useAnyspendQuote(isMainnet, getRelayQuoteRequest);
|
|
183
|
-
// Get geo data and onramp options (after quote is available)
|
|
184
|
-
const { geoData, isOnrampSupported } = useGeoOnrampOptions(isMainnet, anyspendQuote?.data?.currencyIn?.amountUsd || "0");
|
|
185
186
|
const { orderAndTransactions: oat } = useAnyspendOrderAndTransactions(isMainnet, orderId);
|
|
186
187
|
const onSelectOrder = (selectedOrderId) => {
|
|
187
188
|
setActivePanel(PanelView.ORDER_DETAILS);
|
|
@@ -191,30 +192,25 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
|
|
|
191
192
|
params.set("orderId", selectedOrderId);
|
|
192
193
|
router.push(`${window.location.pathname}?${params.toString()}`);
|
|
193
194
|
};
|
|
194
|
-
const [srcAmount, setSrcAmount] = useState(null);
|
|
195
|
-
const formattedSrcAmount = srcAmount ? formatTokenAmount(srcAmount, srcToken.decimals, 6, false) : null;
|
|
196
|
-
// Update the selected src token to USDC and chain to base when the active tab is fiat,
|
|
197
|
-
// also force not to update srcToken by setting dirtySelectSrcToken to true.
|
|
198
|
-
useEffect(() => {
|
|
199
|
-
if (activeTab === "fiat") {
|
|
200
|
-
setSrcChainId(base.id);
|
|
201
|
-
setSrcToken(USDC_BASE);
|
|
202
|
-
setDirtySelectSrcToken(true);
|
|
203
|
-
}
|
|
204
|
-
}, [activeTab]);
|
|
205
195
|
// Update dependent amount when relay price changes
|
|
206
|
-
|
|
207
|
-
if (anyspendQuote?.data
|
|
208
|
-
anyspendQuote
|
|
209
|
-
anyspendQuote
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
196
|
+
const srcAmount = useMemo(() => {
|
|
197
|
+
if (!anyspendQuote?.data ||
|
|
198
|
+
!anyspendQuote?.data?.currencyIn?.amount ||
|
|
199
|
+
!anyspendQuote?.data?.currencyIn?.currency?.decimals)
|
|
200
|
+
return null;
|
|
201
|
+
const amount = anyspendQuote.data.currencyIn.amount;
|
|
202
|
+
if (activeTab === "fiat") {
|
|
203
|
+
const roundUpAmount = roundUpUSDCBaseAmountToNearest(amount);
|
|
204
|
+
return BigInt(roundUpAmount);
|
|
213
205
|
}
|
|
214
206
|
else {
|
|
215
|
-
|
|
207
|
+
return BigInt(amount);
|
|
216
208
|
}
|
|
217
|
-
}, [anyspendQuote?.data]);
|
|
209
|
+
}, [activeTab, anyspendQuote?.data]);
|
|
210
|
+
const formattedSrcAmount = srcAmount ? formatTokenAmount(srcAmount, srcToken.decimals, 6, false) : null;
|
|
211
|
+
const srcFiatAmount = useMemo(() => (activeTab === "fiat" && srcAmount ? formatUnits(srcAmount.toString(), USDC_BASE.decimals) : "0"), [activeTab, srcAmount]);
|
|
212
|
+
// Get geo data and onramp options (after quote is available)
|
|
213
|
+
const { geoData, isOnrampSupported } = useGeoOnrampOptions(isMainnet, srcFiatAmount);
|
|
218
214
|
useEffect(() => {
|
|
219
215
|
if (oat?.data?.order.status === "executed") {
|
|
220
216
|
console.log("Calling onSuccess");
|
|
@@ -248,9 +244,9 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
|
|
|
248
244
|
const createOrderParams = {
|
|
249
245
|
isMainnet: isMainnet,
|
|
250
246
|
orderType: orderType,
|
|
251
|
-
srcChain: srcChainId,
|
|
247
|
+
srcChain: activeTab === "fiat" ? base.id : srcChainId,
|
|
252
248
|
dstChain: dstChainId,
|
|
253
|
-
srcToken: srcToken,
|
|
249
|
+
srcToken: activeTab === "fiat" ? USDC_BASE : srcToken,
|
|
254
250
|
dstToken: dstToken,
|
|
255
251
|
srcAmount: srcAmount.toString(),
|
|
256
252
|
recipientAddress,
|
|
@@ -299,7 +295,7 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
|
|
|
299
295
|
invariant(srcChainId === base.id, "Selected src chain is not base");
|
|
300
296
|
void createOnrampOrder({
|
|
301
297
|
...createOrderParams,
|
|
302
|
-
srcFiatAmount:
|
|
298
|
+
srcFiatAmount: srcFiatAmount,
|
|
303
299
|
onramp: {
|
|
304
300
|
vendor: onramp.vendor,
|
|
305
301
|
paymentMethod: onramp.paymentMethod,
|
|
@@ -388,7 +384,7 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
|
|
|
388
384
|
opacity: hasMounted ? 1 : 0,
|
|
389
385
|
y: hasMounted ? 0 : 20,
|
|
390
386
|
filter: hasMounted ? "blur(0px)" : "blur(10px)",
|
|
391
|
-
}, transition: { duration: 0.3, delay: 0.3, ease: "easeInOut" }, className: "flex w-full flex-col gap-2", children: _jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", disabled: isCreatingOrder || isLoadingAnyspendQuote || !anyspendQuote || !recipientAddress, onClick: () => handleConfirmOrder(), className: "relative w-full", children: isCreatingOrder ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Creating order..." })] })) : isLoadingAnyspendQuote ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Loading quote..." })] })) : anyspendQuote && recipientAddress ? (_jsxs(_Fragment, { children: [_jsx("span", { children: "Checkout" }), _jsx(ChevronRightCircle, { className: "absolute right-0 top-1/2 size-6 -translate-y-1/2 opacity-70" })] })) : recipientAddress ? ("No quote found") : ("Please select a recipient") }) }) })] }) }), _jsx(TabsContent, { value: "fiat", children: _jsx("div", { className: "mt-6 flex w-full flex-col gap-6", children: _jsx(PanelOnrampPayment, { srcAmountOnRamp:
|
|
387
|
+
}, transition: { duration: 0.3, delay: 0.3, ease: "easeInOut" }, className: "flex w-full flex-col gap-2", children: _jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", disabled: isCreatingOrder || isLoadingAnyspendQuote || !anyspendQuote || !recipientAddress, onClick: () => handleConfirmOrder(), className: "relative w-full", children: isCreatingOrder ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Creating order..." })] })) : isLoadingAnyspendQuote ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Loading quote..." })] })) : anyspendQuote && recipientAddress ? (_jsxs(_Fragment, { children: [_jsx("span", { children: "Checkout" }), _jsx(ChevronRightCircle, { className: "absolute right-0 top-1/2 size-6 -translate-y-1/2 opacity-70" })] })) : recipientAddress ? ("No quote found") : ("Please select a recipient") }) }) })] }) }), _jsx(TabsContent, { value: "fiat", children: _jsx("div", { className: "mt-6 flex w-full flex-col gap-6", children: _jsx(PanelOnrampPayment, { srcAmountOnRamp: srcAmount ? formatUnits(srcAmount.toString(), USDC_BASE.decimals) : "0", recipientName: recipientEnsName, recipientAddress: recipientAddress, isMainnet: isMainnet, isBuyMode: false, selectedDstChainId: dstChainId, selectedDstToken: dstToken, anyspendQuote: anyspendQuote, globalAddress: currentWallet?.wallet?.address, onOrderCreated: (orderId) => setOrderId(orderId), onBack: () => setActiveTab("crypto"), orderType: orderType, nft: metadata.type === "mint_nft"
|
|
392
388
|
? metadata.nftContract.type === "erc1155"
|
|
393
389
|
? {
|
|
394
390
|
type: "erc1155",
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { components } from "../../../../anyspend/types/api";
|
|
2
|
+
type Tournament = components["schemas"]["Tournament"];
|
|
3
|
+
type NFT = components["schemas"]["NFT"];
|
|
4
|
+
interface ConnectWalletPaymentProps {
|
|
5
|
+
order: components["schemas"]["Order"];
|
|
6
|
+
onPayment: () => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
txLoading: boolean;
|
|
9
|
+
isSwitchingOrExecuting: boolean;
|
|
10
|
+
phantomWalletAddress?: string | null;
|
|
11
|
+
tournament?: Tournament;
|
|
12
|
+
nft?: NFT;
|
|
13
|
+
}
|
|
14
|
+
export default function ConnectWalletPayment({ order, onPayment, txLoading, isSwitchingOrExecuting, phantomWalletAddress, tournament, nft, }: ConnectWalletPaymentProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { RELAY_SOLANA_MAINNET_CHAIN_ID } from "../../../../anyspend/index.js";
|
|
4
|
+
import { ShinyButton, useProfile } from "../../../../global-account/react/index.js";
|
|
5
|
+
import { formatTokenAmount } from "../../../../shared/utils/number.js";
|
|
6
|
+
import { motion } from "framer-motion";
|
|
7
|
+
import { ChevronRight, Loader2 } from "lucide-react";
|
|
8
|
+
import { useMemo } from "react";
|
|
9
|
+
import { OrderDetailsCollapsible } from "./OrderDetailsCollapsible.js";
|
|
10
|
+
import { StepProgress } from "./StepProgress.js";
|
|
11
|
+
export default function ConnectWalletPayment({ order, onPayment, txLoading, isSwitchingOrExecuting, phantomWalletAddress, tournament, nft, }) {
|
|
12
|
+
const profile = useProfile({ address: order.recipientAddress });
|
|
13
|
+
const recipientName = profile.data?.name?.replace(/\.b3\.fun/g, "");
|
|
14
|
+
const srcToken = order.metadata.srcToken;
|
|
15
|
+
const dstToken = order.metadata.dstToken;
|
|
16
|
+
const expectedDstAmount = order.type === "mint_nft" ||
|
|
17
|
+
order.type === "join_tournament" ||
|
|
18
|
+
order.type === "fund_tournament" ||
|
|
19
|
+
order.type === "custom"
|
|
20
|
+
? "0"
|
|
21
|
+
: order.payload.expectedDstAmount.toString();
|
|
22
|
+
const formattedExpectedDstAmount = formatTokenAmount(BigInt(expectedDstAmount), dstToken.decimals);
|
|
23
|
+
const steps = useMemo(() => [
|
|
24
|
+
{
|
|
25
|
+
id: 1,
|
|
26
|
+
title: "Connect Wallet",
|
|
27
|
+
description: "Connect your wallet to continue",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 2,
|
|
31
|
+
title: "Awaiting Payment",
|
|
32
|
+
description: "Send your payment to the address below",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 3,
|
|
36
|
+
title: "Complete Payment",
|
|
37
|
+
description: "Finalize your transaction",
|
|
38
|
+
},
|
|
39
|
+
], []);
|
|
40
|
+
if (!srcToken || !dstToken) {
|
|
41
|
+
return _jsx("div", { children: "Loading..." });
|
|
42
|
+
}
|
|
43
|
+
return (_jsxs("div", { className: "flex w-full flex-col items-center gap-6", children: [_jsx(StepProgress, { steps: steps, currentStepIndex: 1 }), _jsxs(motion.div, { initial: { opacity: 0, y: 20 }, animate: { opacity: 1, y: 0 }, transition: { delay: 0.5 }, className: "flex w-full flex-col items-center gap-2", children: [_jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", className: "flex w-5/6 items-center gap-2 sm:px-0", disabled: txLoading || isSwitchingOrExecuting, onClick: onPayment, children: txLoading ? (_jsxs(_Fragment, { children: ["Transaction Pending", _jsx(Loader2, { className: "ml-2 h-5 w-5 animate-spin" })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "whitespace-nowrap pl-4 text-lg md:text-sm", children: order.srcChain === RELAY_SOLANA_MAINNET_CHAIN_ID && phantomWalletAddress
|
|
44
|
+
? "Pay from Phantom Wallet"
|
|
45
|
+
: "Pay from Connected Wallet" }), _jsx(ChevronRight, { className: "h-4 w-4" })] })) }), _jsx("div", { className: "mt-4", children: _jsx(OrderDetailsCollapsible, { order: order, dstToken: dstToken, tournament: tournament, nft: nft, recipientName: recipientName, formattedExpectedDstAmount: formattedExpectedDstAmount }) })] })] }));
|
|
46
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare enum PaymentMethod {
|
|
2
|
+
NONE = "none",
|
|
3
|
+
CONNECT_WALLET = "connect_wallet",
|
|
4
|
+
TRANSFER_CRYPTO = "transfer_crypto"
|
|
5
|
+
}
|
|
6
|
+
interface CryptoPaymentMethodProps {
|
|
7
|
+
globalAddress?: string;
|
|
8
|
+
globalWallet?: {
|
|
9
|
+
meta?: {
|
|
10
|
+
icon?: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
selectedPaymentMethod: PaymentMethod;
|
|
14
|
+
setSelectedPaymentMethod: (method: PaymentMethod) => void;
|
|
15
|
+
isCreatingOrder: boolean;
|
|
16
|
+
onBack: () => void;
|
|
17
|
+
onSelectPaymentMethod: (method: PaymentMethod) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function CryptoPaymentMethod({ selectedPaymentMethod, setSelectedPaymentMethod, isCreatingOrder, onBack, onSelectPaymentMethod, }: CryptoPaymentMethodProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useAccountWallet } from "../../../../global-account/react/index.js";
|
|
4
|
+
import { cn } from "../../../../shared/utils/cn.js";
|
|
5
|
+
import { shortenAddress } from "../../../../shared/utils/formatAddress.js";
|
|
6
|
+
import { ChevronLeft, ChevronRightCircle, Wallet, X } from "lucide-react";
|
|
7
|
+
import { useEffect, useRef } from "react";
|
|
8
|
+
import { toast } from "sonner";
|
|
9
|
+
import { useSetActiveWallet } from "thirdweb/react";
|
|
10
|
+
import { useAccount, useConnect, useDisconnect } from "wagmi";
|
|
11
|
+
export var PaymentMethod;
|
|
12
|
+
(function (PaymentMethod) {
|
|
13
|
+
PaymentMethod["NONE"] = "none";
|
|
14
|
+
PaymentMethod["CONNECT_WALLET"] = "connect_wallet";
|
|
15
|
+
PaymentMethod["TRANSFER_CRYPTO"] = "transfer_crypto";
|
|
16
|
+
})(PaymentMethod || (PaymentMethod = {}));
|
|
17
|
+
export function CryptoPaymentMethod({ selectedPaymentMethod, setSelectedPaymentMethod, isCreatingOrder, onBack, onSelectPaymentMethod, }) {
|
|
18
|
+
const { connect, connectors, isPending: isConnecting, error: connectError } = useConnect();
|
|
19
|
+
const wagmiAccount = useAccount();
|
|
20
|
+
const { address: globalAddress, connectedEOAWallet, isActiveEOAWallet, wallet: globalWallet } = useAccountWallet();
|
|
21
|
+
const { disconnect } = useDisconnect();
|
|
22
|
+
const previousAddress = useRef(globalAddress);
|
|
23
|
+
const setActiveWallet = useSetActiveWallet();
|
|
24
|
+
// Automatically set EOA wallet as active when available
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (connectedEOAWallet) {
|
|
27
|
+
console.log("Setting active wallet", connectedEOAWallet);
|
|
28
|
+
setActiveWallet(connectedEOAWallet);
|
|
29
|
+
}
|
|
30
|
+
}, [connectedEOAWallet, isActiveEOAWallet, setActiveWallet]);
|
|
31
|
+
// Handle wallet connection success
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (globalAddress && previousAddress.current !== globalAddress) {
|
|
34
|
+
previousAddress.current = globalAddress;
|
|
35
|
+
toast.success("Wallet connected successfully");
|
|
36
|
+
// Automatically select connect wallet method and go back to main view
|
|
37
|
+
setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
38
|
+
onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
39
|
+
}
|
|
40
|
+
}, [globalAddress, setSelectedPaymentMethod, onSelectPaymentMethod]);
|
|
41
|
+
// Handle connection errors
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (connectError) {
|
|
44
|
+
// Handle specific error cases
|
|
45
|
+
if (connectError.message.includes("Connector already connected")) {
|
|
46
|
+
// If connector is already connected, just proceed with the flow
|
|
47
|
+
console.log("Connector already connected, proceeding with selection");
|
|
48
|
+
// Use wagmi account address or global address
|
|
49
|
+
if (wagmiAccount.address || globalAddress) {
|
|
50
|
+
setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
51
|
+
onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Fallback: proceed anyway as the connector reports it's connected
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
57
|
+
onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
58
|
+
}, 100);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
toast.error(`Failed to connect wallet: ${connectError.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}, [connectError, globalAddress, wagmiAccount.address, setSelectedPaymentMethod, onSelectPaymentMethod]);
|
|
66
|
+
return (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsxs("div", { className: cn("relative flex flex-col gap-10"), children: [_jsx("button", { onClick: onBack, className: "text-as-quaternary hover:text-as-primary absolute flex h-8 w-8 items-center justify-center rounded-lg transition-colors", children: _jsx(ChevronLeft, { className: "h-6 w-6" }) }), _jsx("div", { className: "flex items-center justify-around gap-4", children: _jsx("div", { className: "flex-1 text-center", children: _jsx("h2", { className: "text-as-primary text-lg font-semibold", children: "Choose payment method" }) }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [!globalAddress ? (
|
|
67
|
+
// Not connected - show single connect button
|
|
68
|
+
_jsxs("button", { onClick: () => {
|
|
69
|
+
// Prevent connecting if already connecting or if there's already a connection
|
|
70
|
+
if (isConnecting)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
// Check if wagmi already has a connection
|
|
74
|
+
if (wagmiAccount.isConnected && wagmiAccount.address) {
|
|
75
|
+
// Already connected via wagmi, just proceed with selection
|
|
76
|
+
console.log("Wagmi already connected, proceeding with selection");
|
|
77
|
+
setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
78
|
+
onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Check if global address exists (b3 account system)
|
|
82
|
+
if (globalAddress) {
|
|
83
|
+
// Already connected via global account, just proceed with selection
|
|
84
|
+
console.log("Global address already exists, proceeding with selection");
|
|
85
|
+
setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
86
|
+
onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Use the first available connector or a preferred one
|
|
90
|
+
const preferredConnector = connectors.find(c => c.name.toLowerCase().includes("metamask")) || connectors[0];
|
|
91
|
+
if (preferredConnector) {
|
|
92
|
+
connect({ connector: preferredConnector });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error("Connection error:", error);
|
|
97
|
+
toast.error("Failed to connect wallet. Please try again.");
|
|
98
|
+
}
|
|
99
|
+
}, disabled: isConnecting, className: "bg-as-surface-primary border-as-border-secondary hover:border-as-secondary/80 group flex w-full items-center justify-between gap-4 rounded-xl border px-4 py-3.5 transition-all duration-200 hover:shadow-md disabled:cursor-not-allowed disabled:opacity-50", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-blue-100", children: _jsx(Wallet, { className: "h-4 w-4 text-blue-600" }) }), _jsxs("div", { className: "flex flex-col items-start text-left", children: [_jsx("h4", { className: "text-as-primary font-semibold", children: "Connect wallet" }), _jsx("p", { className: "text-as-primary/60 text-sm", children: "Connect your wallet to continue" })] })] }), isConnecting ? (_jsx("div", { className: "border-as-primary/20 border-t-as-primary h-5 w-5 animate-spin rounded-full border-2" })) : (_jsx(ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" }))] })) : (
|
|
100
|
+
// Connected - show wallet info
|
|
101
|
+
_jsx("div", { className: "bg-as-surface-primary border-as-border-secondary rounded-xl border", children: _jsxs("div", { className: "flex items-center justify-between p-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [globalWallet?.meta?.icon ? (_jsx("img", { src: globalWallet.meta.icon, alt: "Connected Wallet", className: "h-8 w-8 rounded-full" })) : (_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-green-100", children: _jsx(Wallet, { className: "h-4 w-4 text-green-600" }) })), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-as-primary font-semibold", children: "Connected Wallet" }), _jsx("span", { className: "text-as-primary/60 text-sm", children: shortenAddress(globalAddress) })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: () => {
|
|
102
|
+
setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
103
|
+
onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
|
|
104
|
+
}, className: "bg-as-brand hover:bg-as-brand/90 rounded-lg px-3 py-1.5 text-sm font-medium text-white transition-colors", children: "Use Wallet" }), _jsx("button", { onClick: () => {
|
|
105
|
+
disconnect();
|
|
106
|
+
toast.success("Wallet disconnected");
|
|
107
|
+
if (selectedPaymentMethod === PaymentMethod.CONNECT_WALLET) {
|
|
108
|
+
setSelectedPaymentMethod(PaymentMethod.NONE);
|
|
109
|
+
}
|
|
110
|
+
}, className: "text-as-primary/60 hover:text-as-primary/80 rounded-lg p-1.5 transition-colors", children: _jsx(X, { className: "h-4 w-4" }) })] })] }) })), _jsxs("button", { onClick: () => {
|
|
111
|
+
setSelectedPaymentMethod(PaymentMethod.TRANSFER_CRYPTO);
|
|
112
|
+
onSelectPaymentMethod(PaymentMethod.TRANSFER_CRYPTO);
|
|
113
|
+
}, disabled: isCreatingOrder, className: "bg-as-surface-primary border-as-border-secondary hover:border-as-secondary/80 group flex w-full items-center justify-between gap-4 rounded-xl border px-4 py-3.5 transition-all duration-200 hover:shadow-md", children: [_jsx("div", { className: "flex flex-col items-start text-left", children: _jsx("h4", { className: "text-as-primary font-semibold", children: "Transfer crypto" }) }), _jsx(ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" })] })] })] }) }));
|
|
114
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare enum FiatPaymentMethod {
|
|
2
|
+
NONE = "none",
|
|
3
|
+
COINBASE_PAY = "coinbase_pay",
|
|
4
|
+
STRIPE = "stripe"
|
|
5
|
+
}
|
|
6
|
+
interface FiatPaymentMethodProps {
|
|
7
|
+
selectedPaymentMethod: FiatPaymentMethod;
|
|
8
|
+
setSelectedPaymentMethod: (method: FiatPaymentMethod) => void;
|
|
9
|
+
onBack: () => void;
|
|
10
|
+
onSelectPaymentMethod: (method: FiatPaymentMethod) => void;
|
|
11
|
+
srcAmountOnRamp: string;
|
|
12
|
+
isMainnet: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function FiatPaymentMethodComponent({ selectedPaymentMethod, setSelectedPaymentMethod, onBack, onSelectPaymentMethod, srcAmountOnRamp, isMainnet, }: FiatPaymentMethodProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useGeoOnrampOptions } from "../../../../anyspend/react/index.js";
|
|
4
|
+
import { cn } from "../../../../shared/utils/cn.js";
|
|
5
|
+
import { ChevronLeft, ChevronRight, Loader2 } from "lucide-react";
|
|
6
|
+
export var FiatPaymentMethod;
|
|
7
|
+
(function (FiatPaymentMethod) {
|
|
8
|
+
FiatPaymentMethod["NONE"] = "none";
|
|
9
|
+
FiatPaymentMethod["COINBASE_PAY"] = "coinbase_pay";
|
|
10
|
+
FiatPaymentMethod["STRIPE"] = "stripe";
|
|
11
|
+
})(FiatPaymentMethod || (FiatPaymentMethod = {}));
|
|
12
|
+
export function FiatPaymentMethodComponent({ selectedPaymentMethod, setSelectedPaymentMethod, onBack, onSelectPaymentMethod, srcAmountOnRamp, isMainnet, }) {
|
|
13
|
+
// Helper function to get fees from API data
|
|
14
|
+
const getFeeFromApi = (paymentMethod) => {
|
|
15
|
+
switch (paymentMethod) {
|
|
16
|
+
case FiatPaymentMethod.COINBASE_PAY:
|
|
17
|
+
// Coinbase doesn't provide fee info in API, use hardcoded $0.02
|
|
18
|
+
return "0.02";
|
|
19
|
+
case FiatPaymentMethod.STRIPE:
|
|
20
|
+
// Get fee from Stripe API response
|
|
21
|
+
if (stripeWeb2Support && "formattedFeeUsd" in stripeWeb2Support) {
|
|
22
|
+
return stripeWeb2Support.formattedFeeUsd;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
default:
|
|
26
|
+
return null; // No fee when no payment method selected
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
// Load geo-based onramp options like in PanelOnramp
|
|
30
|
+
const { coinbaseAvailablePaymentMethods, isStripeOnrampSupported, stripeWeb2Support, isLoading: isLoadingGeoOnramp, } = useGeoOnrampOptions(isMainnet, srcAmountOnRamp);
|
|
31
|
+
// Generate payment methods based on geo availability (like in PanelOnrampPayment)
|
|
32
|
+
const availablePaymentMethods = [];
|
|
33
|
+
// Add Coinbase Pay if available
|
|
34
|
+
if (coinbaseAvailablePaymentMethods.length > 0) {
|
|
35
|
+
const coinbaseFee = getFeeFromApi(FiatPaymentMethod.COINBASE_PAY);
|
|
36
|
+
availablePaymentMethods.push({
|
|
37
|
+
id: FiatPaymentMethod.COINBASE_PAY,
|
|
38
|
+
name: "Coinbase Pay",
|
|
39
|
+
description: "Debit card, bank account or Coinbase account",
|
|
40
|
+
badge: coinbaseFee ? `$${coinbaseFee} fee` : "Lowest Fee",
|
|
41
|
+
badgeColor: "bg-green-100 text-green-800",
|
|
42
|
+
available: true,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Add Stripe if available
|
|
46
|
+
if (isStripeOnrampSupported || (stripeWeb2Support && stripeWeb2Support.isSupport)) {
|
|
47
|
+
const stripeFee = getFeeFromApi(FiatPaymentMethod.STRIPE);
|
|
48
|
+
availablePaymentMethods.push({
|
|
49
|
+
id: FiatPaymentMethod.STRIPE,
|
|
50
|
+
name: "Stripe",
|
|
51
|
+
description: "Credit or debit card payment",
|
|
52
|
+
badge: stripeFee ? `$${stripeFee} fee` : "Standard Fee",
|
|
53
|
+
badgeColor: "bg-yellow-100 text-yellow-800",
|
|
54
|
+
available: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Show loading state while checking geo availability
|
|
58
|
+
if (isLoadingGeoOnramp) {
|
|
59
|
+
return (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsxs("div", { className: "flex flex-col gap-6", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("button", { onClick: onBack, className: "text-as-quaternary hover:text-as-primary flex h-8 w-8 items-center justify-center rounded-lg transition-colors", children: _jsx(ChevronLeft, { className: "h-6 w-6" }) }), _jsx("div", { className: "flex-1", children: _jsx("h2", { className: "text-as-primary text-lg font-semibold", children: "Choose payment method" }) })] }), _jsxs("div", { className: "flex items-center justify-center py-8", children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin" }), _jsx("span", { className: "text-as-secondary ml-2 text-sm", children: "Loading payment methods..." })] })] }) }));
|
|
60
|
+
}
|
|
61
|
+
return (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsxs("div", { className: "flex flex-col gap-6", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("button", { onClick: onBack, className: "text-as-quaternary hover:text-as-primary flex h-8 w-8 items-center justify-center rounded-lg transition-colors", children: _jsx(ChevronLeft, { className: "h-6 w-6" }) }), _jsx("div", { className: "flex-1", children: _jsx("h2", { className: "text-as-primary text-lg font-semibold", children: "Choose payment method" }) })] }), _jsx("div", { className: "flex flex-col gap-3", children: availablePaymentMethods.length === 0 ? (_jsx("div", { className: "bg-as-surface-secondary border-as-border-secondary rounded-2xl border p-6 text-center", children: _jsx("p", { className: "text-as-secondary text-sm", children: "No payment methods available in your region for the selected amount." }) })) : (availablePaymentMethods.map(method => (_jsxs("button", { onClick: () => {
|
|
62
|
+
setSelectedPaymentMethod(method.id);
|
|
63
|
+
onSelectPaymentMethod(method.id);
|
|
64
|
+
}, className: cn("bg-as-surface-secondary border-as-border-secondary flex w-full items-center gap-4 rounded-2xl border p-4 transition-all duration-200", selectedPaymentMethod === method.id
|
|
65
|
+
? "border-as-brand bg-as-brand/10"
|
|
66
|
+
: "hover:border-as-brand/50 hover:bg-as-brand/5"), children: [_jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-blue-600 text-2xl text-white", children: method.id === FiatPaymentMethod.COINBASE_PAY ? "C" : "S" }), _jsxs("div", { className: "flex flex-1 flex-col items-start text-left", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-as-primary text-base font-semibold", children: method.name }), _jsx("span", { className: cn("rounded-full px-2 py-1 text-xs font-medium", method.badgeColor), children: method.badge })] }), _jsx("span", { className: "text-as-primary/60 text-sm", children: method.description })] }), selectedPaymentMethod === method.id && _jsx(ChevronRight, { className: "text-as-brand h-5 w-5" })] }, method.id)))) })] }) }));
|
|
67
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { components } from "../../../../anyspend/types/api";
|
|
2
|
+
import { PaymentMethod } from "./CryptoPaymentMethod";
|
|
2
3
|
interface OrderDetailsProps {
|
|
3
4
|
isMainnet: boolean;
|
|
4
5
|
mode?: "modal" | "page";
|
|
@@ -7,6 +8,7 @@ interface OrderDetailsProps {
|
|
|
7
8
|
relayTx: components["schemas"]["RelayTx"] | null;
|
|
8
9
|
executeTx: components["schemas"]["ExecuteTx"] | null;
|
|
9
10
|
refundTxs: components["schemas"]["RefundTx"][] | null;
|
|
11
|
+
paymentMethod?: PaymentMethod;
|
|
10
12
|
onBack?: () => void;
|
|
11
13
|
}
|
|
12
14
|
export declare const OrderDetails: import("react").NamedExoticComponent<OrderDetailsProps>;
|