@daimo/sdk 1.4.0 → 1.4.2
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/client/createDaimoClient.d.ts +31 -21
- package/dist/client/createDaimoClient.d.ts.map +1 -1
- package/dist/client/createDaimoClient.js +24 -16
- package/dist/client/createDaimoClient.js.map +1 -1
- package/dist/common/account.d.ts +75 -8
- package/dist/common/account.d.ts.map +1 -1
- package/dist/common/account.js +7 -1
- package/dist/common/account.js.map +1 -1
- package/dist/common/api.d.ts +47 -8
- package/dist/common/api.d.ts.map +1 -1
- package/dist/common/api.js +10 -1
- package/dist/common/api.js.map +1 -1
- package/dist/common/chain.d.ts +0 -1
- package/dist/common/chain.d.ts.map +1 -1
- package/dist/common/chain.js +0 -10
- package/dist/common/chain.js.map +1 -1
- package/dist/common/session.d.ts +11 -3
- package/dist/common/session.d.ts.map +1 -1
- package/dist/common/session.js.map +1 -1
- package/dist/common/token.d.ts +16 -4
- package/dist/common/token.d.ts.map +1 -1
- package/dist/common/token.js +12 -42
- package/dist/common/token.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web/api/index.d.ts +3 -3
- package/dist/web/api/index.d.ts.map +1 -1
- package/dist/web/api/navTree.d.ts +12 -5
- package/dist/web/api/navTree.d.ts.map +1 -1
- package/dist/web/api/walletTypes.d.ts +2 -15
- package/dist/web/api/walletTypes.d.ts.map +1 -1
- package/dist/web/components/ConfirmationPage.d.ts.map +1 -1
- package/dist/web/components/ConfirmationPage.js +3 -3
- package/dist/web/components/ConfirmationPage.js.map +1 -1
- package/dist/web/components/DaimoModal.d.ts.map +1 -1
- package/dist/web/components/DaimoModal.js +41 -9
- package/dist/web/components/DaimoModal.js.map +1 -1
- package/dist/web/components/QRCode.d.ts.map +1 -1
- package/dist/web/components/QRCode.js +2 -2
- package/dist/web/components/QRCode.js.map +1 -1
- package/dist/web/components/StripeOnrampPage.d.ts +40 -0
- package/dist/web/components/StripeOnrampPage.d.ts.map +1 -0
- package/dist/web/components/StripeOnrampPage.js +121 -0
- package/dist/web/components/StripeOnrampPage.js.map +1 -0
- package/dist/web/components/TokenAmountEntry.d.ts +57 -0
- package/dist/web/components/TokenAmountEntry.d.ts.map +1 -0
- package/dist/web/components/TokenAmountEntry.js +155 -0
- package/dist/web/components/TokenAmountEntry.js.map +1 -0
- package/dist/web/components/WalletAmountPage.d.ts +2 -2
- package/dist/web/components/WalletAmountPage.d.ts.map +1 -1
- package/dist/web/components/WalletAmountPage.js +11 -146
- package/dist/web/components/WalletAmountPage.js.map +1 -1
- package/dist/web/components/account/AccountApplePayPage.d.ts +24 -0
- package/dist/web/components/account/AccountApplePayPage.d.ts.map +1 -0
- package/dist/web/components/account/AccountApplePayPage.js +253 -0
- package/dist/web/components/account/AccountApplePayPage.js.map +1 -0
- package/dist/web/components/account/AccountBankDetailsPage.d.ts +16 -0
- package/dist/web/components/account/AccountBankDetailsPage.d.ts.map +1 -0
- package/dist/web/components/account/AccountBankDetailsPage.js +140 -0
- package/dist/web/components/account/AccountBankDetailsPage.js.map +1 -0
- package/dist/web/components/account/AccountBankPickerPage.d.ts +8 -8
- package/dist/web/components/account/AccountBankPickerPage.d.ts.map +1 -1
- package/dist/web/components/account/AccountBankPickerPage.js +66 -19
- package/dist/web/components/account/AccountBankPickerPage.js.map +1 -1
- package/dist/web/components/account/AccountBankTransferSubmittedPage.d.ts +13 -0
- package/dist/web/components/account/AccountBankTransferSubmittedPage.d.ts.map +1 -0
- package/dist/web/components/account/AccountBankTransferSubmittedPage.js +27 -0
- package/dist/web/components/account/AccountBankTransferSubmittedPage.js.map +1 -0
- package/dist/web/components/account/AccountDeeplinkPage.d.ts +0 -2
- package/dist/web/components/account/AccountDeeplinkPage.d.ts.map +1 -1
- package/dist/web/components/account/AccountDeeplinkPage.js +7 -6
- package/dist/web/components/account/AccountDeeplinkPage.js.map +1 -1
- package/dist/web/components/account/AccountEnrollmentPage.d.ts +5 -18
- package/dist/web/components/account/AccountEnrollmentPage.d.ts.map +1 -1
- package/dist/web/components/account/AccountEnrollmentPage.js +86 -20
- package/dist/web/components/account/AccountEnrollmentPage.js.map +1 -1
- package/dist/web/components/account/AccountFlowProvider.d.ts.map +1 -1
- package/dist/web/components/account/AccountFlowProvider.js +26 -2
- package/dist/web/components/account/AccountFlowProvider.js.map +1 -1
- package/dist/web/components/account/AccountOtpCodeEntry.d.ts +16 -0
- package/dist/web/components/account/AccountOtpCodeEntry.d.ts.map +1 -0
- package/dist/web/components/account/AccountOtpCodeEntry.js +101 -0
- package/dist/web/components/account/AccountOtpCodeEntry.js.map +1 -0
- package/dist/web/components/account/AccountOtpPage.d.ts.map +1 -1
- package/dist/web/components/account/AccountOtpPage.js +10 -53
- package/dist/web/components/account/AccountOtpPage.js.map +1 -1
- package/dist/web/components/account/AccountPaymentPage.d.ts +7 -4
- package/dist/web/components/account/AccountPaymentPage.d.ts.map +1 -1
- package/dist/web/components/account/AccountPaymentPage.js +29 -34
- package/dist/web/components/account/AccountPaymentPage.js.map +1 -1
- package/dist/web/components/account/AccountPhoneOtpPage.d.ts +14 -0
- package/dist/web/components/account/AccountPhoneOtpPage.d.ts.map +1 -0
- package/dist/web/components/account/AccountPhoneOtpPage.js +56 -0
- package/dist/web/components/account/AccountPhoneOtpPage.js.map +1 -0
- package/dist/web/components/account/AccountPhonePage.d.ts +11 -0
- package/dist/web/components/account/AccountPhonePage.d.ts.map +1 -0
- package/dist/web/components/account/AccountPhonePage.js +100 -0
- package/dist/web/components/account/AccountPhonePage.js.map +1 -0
- package/dist/web/components/account/AccountReadyPage.d.ts +2 -0
- package/dist/web/components/account/AccountReadyPage.d.ts.map +1 -0
- package/dist/web/components/account/AccountReadyPage.js +7 -0
- package/dist/web/components/account/AccountReadyPage.js.map +1 -0
- package/dist/web/components/account/AccountStatusPage.d.ts +1 -3
- package/dist/web/components/account/AccountStatusPage.d.ts.map +1 -1
- package/dist/web/components/account/AccountStatusPage.js +8 -8
- package/dist/web/components/account/AccountStatusPage.js.map +1 -1
- package/dist/web/components/account/accountNav.d.ts +14 -0
- package/dist/web/components/account/accountNav.d.ts.map +1 -0
- package/dist/web/components/account/accountNav.js +35 -0
- package/dist/web/components/account/accountNav.js.map +1 -0
- package/dist/web/components/account/openDeeplink.js +30 -14
- package/dist/web/components/account/openDeeplink.js.map +1 -1
- package/dist/web/components/account/phone.d.ts +6 -0
- package/dist/web/components/account/phone.d.ts.map +1 -0
- package/dist/web/components/account/phone.js +35 -0
- package/dist/web/components/account/phone.js.map +1 -0
- package/dist/web/components/account/useCoinbaseApplePayWidget.d.ts +20 -0
- package/dist/web/components/account/useCoinbaseApplePayWidget.d.ts.map +1 -0
- package/dist/web/components/account/useCoinbaseApplePayWidget.js +159 -0
- package/dist/web/components/account/useCoinbaseApplePayWidget.js.map +1 -0
- package/dist/web/components/buttons.d.ts +11 -1
- package/dist/web/components/buttons.d.ts.map +1 -1
- package/dist/web/components/buttons.js +11 -3
- package/dist/web/components/buttons.js.map +1 -1
- package/dist/web/components/icons.d.ts +5 -0
- package/dist/web/components/icons.d.ts.map +1 -1
- package/dist/web/components/icons.js +7 -0
- package/dist/web/components/icons.js.map +1 -1
- package/dist/web/components/shared.d.ts +8 -3
- package/dist/web/components/shared.d.ts.map +1 -1
- package/dist/web/components/shared.js +50 -16
- package/dist/web/components/shared.js.map +1 -1
- package/dist/web/hooks/locale.d.ts +4 -0
- package/dist/web/hooks/locale.d.ts.map +1 -1
- package/dist/web/hooks/locale.js +23 -1
- package/dist/web/hooks/locale.js.map +1 -1
- package/dist/web/hooks/locales/en.d.ts +17 -0
- package/dist/web/hooks/locales/en.d.ts.map +1 -1
- package/dist/web/hooks/locales/en.js +19 -2
- package/dist/web/hooks/locales/en.js.map +1 -1
- package/dist/web/hooks/locales/es.d.ts.map +1 -1
- package/dist/web/hooks/locales/es.js +17 -0
- package/dist/web/hooks/locales/es.js.map +1 -1
- package/dist/web/hooks/locales/ja.d.ts +4 -0
- package/dist/web/hooks/locales/ja.d.ts.map +1 -0
- package/dist/web/hooks/locales/ja.js +140 -0
- package/dist/web/hooks/locales/ja.js.map +1 -0
- package/dist/web/hooks/locales/ko.d.ts +4 -0
- package/dist/web/hooks/locales/ko.d.ts.map +1 -0
- package/dist/web/hooks/locales/ko.js +140 -0
- package/dist/web/hooks/locales/ko.js.map +1 -0
- package/dist/web/hooks/locales/zh.d.ts +4 -0
- package/dist/web/hooks/locales/zh.d.ts.map +1 -0
- package/dist/web/hooks/locales/zh.js +140 -0
- package/dist/web/hooks/locales/zh.js.map +1 -0
- package/dist/web/hooks/navEvent.d.ts +4 -0
- package/dist/web/hooks/navEvent.d.ts.map +1 -1
- package/dist/web/hooks/navEvent.js.map +1 -1
- package/dist/web/hooks/types.d.ts +25 -4
- package/dist/web/hooks/types.d.ts.map +1 -1
- package/dist/web/hooks/types.js.map +1 -1
- package/dist/web/hooks/useAccountFlow.d.ts +50 -13
- package/dist/web/hooks/useAccountFlow.d.ts.map +1 -1
- package/dist/web/hooks/useAccountFlow.js +93 -13
- package/dist/web/hooks/useAccountFlow.js.map +1 -1
- package/dist/web/hooks/useCreateDeposit.d.ts +1 -1
- package/dist/web/hooks/useCreateDeposit.d.ts.map +1 -1
- package/dist/web/hooks/useCreateDeposit.js +103 -15
- package/dist/web/hooks/useCreateDeposit.js.map +1 -1
- package/dist/web/hooks/useDepositAddress.d.ts.map +1 -1
- package/dist/web/hooks/useDepositAddress.js +23 -2
- package/dist/web/hooks/useDepositAddress.js.map +1 -1
- package/dist/web/hooks/useDraftDeposit.d.ts +35 -0
- package/dist/web/hooks/useDraftDeposit.d.ts.map +1 -0
- package/dist/web/hooks/useDraftDeposit.js +155 -0
- package/dist/web/hooks/useDraftDeposit.js.map +1 -0
- package/dist/web/hooks/useSessionNav.d.ts +1 -1
- package/dist/web/hooks/useSessionNav.d.ts.map +1 -1
- package/dist/web/hooks/useSessionNav.js +122 -12
- package/dist/web/hooks/useSessionNav.js.map +1 -1
- package/dist/web/hooks/useWalletFlow.d.ts.map +1 -1
- package/dist/web/hooks/useWalletFlow.js +9 -0
- package/dist/web/hooks/useWalletFlow.js.map +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +1 -1
- package/dist/web/index.js.map +1 -1
- package/dist/web/platform.d.ts +1 -0
- package/dist/web/platform.d.ts.map +1 -1
- package/dist/web/platform.js +11 -0
- package/dist/web/platform.js.map +1 -1
- package/dist/web/styles.css +1 -1
- package/dist/web/theme.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { t } from "../hooks/locale.js";
|
|
4
|
+
import { isDesktop } from "../platform.js";
|
|
5
|
+
import { SwitchArrowsIcon } from "./icons.js";
|
|
6
|
+
import { TokenIconWithChainBadge } from "./shared.js";
|
|
7
|
+
/**
|
|
8
|
+
* Unified "Enter Amount" card: token icon with chain badge, dual-mode
|
|
9
|
+
* (USD ↔ native) amount input, FX swap arrow, and min/max/balance footer.
|
|
10
|
+
* Used by both the wallet deposit flow and the fiat/account deposit flow.
|
|
11
|
+
*/
|
|
12
|
+
export function TokenAmountEntry({ token, minimumUsd, maximumUsd, nativeDisplay, initialMode = "usd", initialAmountUsd, onContinue, onChange, balance, showMax = true, iconLogoURI, iconAlt, badgeLogoURI, badgeAlt, platform, baseUrl, }) {
|
|
13
|
+
// Swap is meaningless when the token is pegged 1:1 to USD.
|
|
14
|
+
const isUsdPegged = token.fiatISO === "USD";
|
|
15
|
+
const initialUsd = initialAmountUsd ?? 0;
|
|
16
|
+
const initialNative = initialUsd > 0 ? usdToNativeStr(initialUsd, token) : "";
|
|
17
|
+
const [usdStr, setUsdStr] = useState(initialUsd > 0 ? roundUsd(initialUsd) : "");
|
|
18
|
+
const [nativeStr, setNativeStr] = useState(initialNative);
|
|
19
|
+
const [isEditingUsd, setIsEditingUsd] = useState(initialMode === "usd");
|
|
20
|
+
const amountUsd = parseFloat(usdStr) || 0;
|
|
21
|
+
const roundedMaxUsd = parseFloat(roundUsd(maximumUsd));
|
|
22
|
+
const isValid = amountUsd >= minimumUsd && amountUsd <= roundedMaxUsd;
|
|
23
|
+
const showMinWarning = usdStr !== "" && amountUsd < minimumUsd;
|
|
24
|
+
const showMaxWarning = usdStr !== "" && amountUsd > roundedMaxUsd;
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
onChange?.(amountUsd, isValid);
|
|
27
|
+
}, [amountUsd, isValid, onChange]);
|
|
28
|
+
const handleInputChange = (e) => {
|
|
29
|
+
const value = e.target.value;
|
|
30
|
+
const maxDecimals = isEditingUsd ? 2 : token.displayDecimals;
|
|
31
|
+
const regex = new RegExp(`^\\d*\\.?\\d{0,${maxDecimals}}$`);
|
|
32
|
+
if (value !== "" && !regex.test(value))
|
|
33
|
+
return;
|
|
34
|
+
if (isEditingUsd) {
|
|
35
|
+
const newUsd = parseFloat(value) || 0;
|
|
36
|
+
setUsdStr(value);
|
|
37
|
+
setNativeStr(newUsd === 0 ? "" : usdToNativeStr(newUsd, token));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const newNative = parseFloat(value) || 0;
|
|
41
|
+
setNativeStr(value);
|
|
42
|
+
setUsdStr(newNative === 0 ? "" : nativeToUsdStr(newNative, token));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const handleKeyDown = (e) => {
|
|
46
|
+
if (e.key === "Enter" && isValid)
|
|
47
|
+
onContinue(amountUsd);
|
|
48
|
+
};
|
|
49
|
+
const handleMax = () => {
|
|
50
|
+
const maxUsdStr = roundUsd(maximumUsd);
|
|
51
|
+
const maxNativeStr = usdToNativeStr(maximumUsd, token);
|
|
52
|
+
setUsdStr(maxUsdStr);
|
|
53
|
+
setNativeStr(maxNativeStr);
|
|
54
|
+
};
|
|
55
|
+
const handleSwitch = useCallback(() => {
|
|
56
|
+
const nextEditingUsd = !isEditingUsd;
|
|
57
|
+
// Re-format the side the user just switched away from, so it reads nicely.
|
|
58
|
+
if (nextEditingUsd) {
|
|
59
|
+
const nativeNum = parseFloat(nativeStr) || 0;
|
|
60
|
+
const formatted = nativeNum > 0
|
|
61
|
+
? stripTrailingZeros(roundNative(nativeNum, token))
|
|
62
|
+
: "";
|
|
63
|
+
setNativeStr(formatted);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const usdNum = parseFloat(usdStr) || 0;
|
|
67
|
+
setUsdStr(usdNum > 0 ? roundUsd(usdNum) : "");
|
|
68
|
+
}
|
|
69
|
+
setIsEditingUsd(nextEditingUsd);
|
|
70
|
+
}, [isEditingUsd, nativeStr, usdStr, token]);
|
|
71
|
+
const shouldAutoFocus = isDesktop(platform);
|
|
72
|
+
const currentValue = isEditingUsd ? usdStr : nativeStr;
|
|
73
|
+
const inputWidth = currentValue.length === 0
|
|
74
|
+
? "3.55ch"
|
|
75
|
+
: `${Math.min(currentValue.length - (currentValue.match(/\./g) || []).length * 0.55, 10)}ch`;
|
|
76
|
+
// Side decorations: $ prefix for USD mode; nativeDisplay for native mode.
|
|
77
|
+
const showPrefix = isEditingUsd || nativeDisplay.kind === "prefix";
|
|
78
|
+
const prefixText = isEditingUsd ? "$" : nativeDisplay.kind === "prefix" ? nativeDisplay.symbol : "";
|
|
79
|
+
const showSuffix = !isEditingUsd && nativeDisplay.kind === "suffix";
|
|
80
|
+
const suffixText = nativeDisplay.kind === "suffix" ? nativeDisplay.symbol : "";
|
|
81
|
+
const message = buildMessage({
|
|
82
|
+
showMinWarning,
|
|
83
|
+
showMaxWarning,
|
|
84
|
+
minimumUsd,
|
|
85
|
+
maximumUsd,
|
|
86
|
+
isEditingUsd,
|
|
87
|
+
token,
|
|
88
|
+
nativeDisplay,
|
|
89
|
+
balance,
|
|
90
|
+
});
|
|
91
|
+
const messageColor = showMinWarning || showMaxWarning
|
|
92
|
+
? "daimo-text-[var(--daimo-text)]"
|
|
93
|
+
: "daimo-text-[var(--daimo-text-secondary)]";
|
|
94
|
+
// Secondary amount for the switch button.
|
|
95
|
+
const secondaryAmount = isEditingUsd
|
|
96
|
+
? formatNative(nativeStr || "0", nativeDisplay)
|
|
97
|
+
: `$${usdStr || roundUsd(0)}`;
|
|
98
|
+
return (_jsxs("div", { className: "daimo-flex daimo-flex-col daimo-items-center", children: [_jsx("div", { className: "daimo-mb-3", children: _jsx(TokenIconWithChainBadge, { token: token, symbol: iconAlt, logoURI: iconLogoURI, size: "lg", badgeLogoURI: badgeLogoURI, badgeAlt: badgeAlt, baseUrl: baseUrl }) }), _jsxs("div", { className: "daimo-flex daimo-items-center daimo-justify-center daimo-gap-2", children: [showMax && (_jsx("span", { className: "daimo-invisible daimo-py-[3px] daimo-px-2 daimo-text-sm", children: t.max })), _jsxs("div", { className: "daimo-flex daimo-items-center daimo-justify-center daimo-gap-1", children: [showPrefix && (_jsx("span", { className: `daimo-text-[24px] daimo-font-semibold daimo-tabular-nums ${currentValue ? "daimo-text-[var(--daimo-text)]" : "daimo-text-[var(--daimo-placeholder)]"}`, children: prefixText })), _jsx("input", { type: "text", inputMode: "decimal", value: currentValue, onChange: handleInputChange, onKeyDown: handleKeyDown, placeholder: "0.00", className: "daimo-bg-transparent daimo-font-semibold daimo-text-[var(--daimo-text)] daimo-placeholder-[var(--daimo-placeholder)] daimo-outline-none daimo-border-none daimo-shadow-none daimo-caret-[var(--daimo-text-muted)] daimo-tabular-nums daimo-ring-0 focus:daimo-outline-none focus:daimo-ring-0 focus:daimo-border-none focus:daimo-shadow-none", style: {
|
|
99
|
+
width: inputWidth,
|
|
100
|
+
minWidth: "1ch",
|
|
101
|
+
maxWidth: "10ch",
|
|
102
|
+
fontSize: "clamp(16px, 30px, 30px)",
|
|
103
|
+
}, autoFocus: shouldAutoFocus }), showSuffix && (_jsx("span", { className: "daimo-text-base daimo-font-normal daimo-text-[var(--daimo-text-muted)]", children: suffixText }))] }), showMax && (_jsx("button", { onClick: handleMax, className: "daimo-py-[3px] daimo-px-2 daimo-text-sm daimo-font-normal daimo-rounded-full daimo-bg-[var(--daimo-surface-secondary)] daimo-text-[var(--daimo-text-secondary)] hover:[@media(hover:hover)]:daimo-bg-[var(--daimo-surface-hover)] daimo-touch-action-manipulation daimo-transition-[background-color] daimo-duration-100 daimo-ease", children: t.max }))] }), !isUsdPegged && (_jsx(SwitchButton, { onClick: handleSwitch, secondaryAmount: secondaryAmount, isEditingUsd: isEditingUsd })), _jsx("p", { className: `${messageColor} daimo-text-base daimo-font-normal daimo-leading-[21px] daimo-tabular-nums daimo-mb-6`, children: message })] }));
|
|
104
|
+
}
|
|
105
|
+
// --- Helpers ---
|
|
106
|
+
function usdToNativeStr(usd, token) {
|
|
107
|
+
if (usd === 0)
|
|
108
|
+
return "";
|
|
109
|
+
return roundNative(usd / token.usd, token);
|
|
110
|
+
}
|
|
111
|
+
function nativeToUsdStr(native, token) {
|
|
112
|
+
if (native === 0)
|
|
113
|
+
return "";
|
|
114
|
+
return roundUsd(native * token.usd);
|
|
115
|
+
}
|
|
116
|
+
function roundUsd(usd) {
|
|
117
|
+
return usd.toFixed(2);
|
|
118
|
+
}
|
|
119
|
+
function roundNative(amount, token) {
|
|
120
|
+
if (amount === 0)
|
|
121
|
+
return "0";
|
|
122
|
+
return amount.toFixed(token.displayDecimals);
|
|
123
|
+
}
|
|
124
|
+
function stripTrailingZeros(val) {
|
|
125
|
+
return val.includes(".") ? val.replace(/\.?0+$/, "") : val;
|
|
126
|
+
}
|
|
127
|
+
function formatNative(value, display) {
|
|
128
|
+
return display.kind === "prefix"
|
|
129
|
+
? `${display.symbol}${value}`
|
|
130
|
+
: `${value} ${display.symbol}`;
|
|
131
|
+
}
|
|
132
|
+
function buildMessage(args) {
|
|
133
|
+
const { showMinWarning, showMaxWarning, minimumUsd, maximumUsd, isEditingUsd, token, nativeDisplay, balance } = args;
|
|
134
|
+
const fmt = (usd) => isEditingUsd
|
|
135
|
+
? `$${roundUsd(usd)}`
|
|
136
|
+
: formatNative(usdToNativeStr(usd, token), nativeDisplay);
|
|
137
|
+
if (showMaxWarning)
|
|
138
|
+
return `${t.maximum} ${fmt(maximumUsd)}`;
|
|
139
|
+
if (showMinWarning)
|
|
140
|
+
return `${t.minimum} ${fmt(minimumUsd)}`;
|
|
141
|
+
if (balance) {
|
|
142
|
+
if (isEditingUsd) {
|
|
143
|
+
const isUsdPegged = token.fiatISO === "USD";
|
|
144
|
+
return isUsdPegged
|
|
145
|
+
? `${t.balance} $${roundUsd(balance.usd)}`
|
|
146
|
+
: `${t.balance} $${roundUsd(balance.usd)} ${token.symbol}`;
|
|
147
|
+
}
|
|
148
|
+
return `${t.balance} ${formatNative(roundNative(balance.nativeAmountUnits, token), nativeDisplay)}`;
|
|
149
|
+
}
|
|
150
|
+
return `${t.minimum} ${fmt(minimumUsd)}`;
|
|
151
|
+
}
|
|
152
|
+
function SwitchButton({ onClick, secondaryAmount, isEditingUsd, }) {
|
|
153
|
+
return (_jsxs("button", { onClick: onClick, className: "daimo-flex daimo-items-center daimo-gap-1 daimo-py-3 daimo-px-4 hover:[@media(hover:hover)]:daimo-opacity-70 active:daimo-opacity-50 daimo-touch-action-manipulation daimo-transition-opacity daimo-duration-150 daimo-ease", children: [_jsx(SwitchArrowsIcon, { flipY: !isEditingUsd, animated: true }), _jsx("span", { className: "daimo-text-base daimo-font-normal daimo-leading-[21px] daimo-text-[var(--daimo-text-secondary)] daimo-tabular-nums", children: secondaryAmount })] }));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=TokenAmountEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenAmountEntry.js","sourceRoot":"","sources":["../../../src/web/components/TokenAmountEntry.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WalletPaymentOption } from "../api/walletTypes.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { DaimoPlatform } from "../platform.js";
|
|
3
3
|
type WalletAmountPageProps = {
|
|
4
4
|
token: WalletPaymentOption;
|
|
5
5
|
platform: DaimoPlatform;
|
|
@@ -7,7 +7,7 @@ type WalletAmountPageProps = {
|
|
|
7
7
|
onContinue: (amountUsd: number) => void;
|
|
8
8
|
baseUrl: string;
|
|
9
9
|
};
|
|
10
|
-
/** Amount entry page for wallet payment flow */
|
|
10
|
+
/** Amount entry page for wallet payment flow. */
|
|
11
11
|
export declare function WalletAmountPage({ token, platform, onBack, onContinue, baseUrl, }: WalletAmountPageProps): import("react/jsx-runtime").JSX.Element;
|
|
12
12
|
export {};
|
|
13
13
|
//# sourceMappingURL=WalletAmountPage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WalletAmountPage.d.ts","sourceRoot":"","sources":["../../../src/web/components/WalletAmountPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WalletAmountPage.d.ts","sourceRoot":"","sources":["../../../src/web/components/WalletAmountPage.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpD,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,OAAO,GACR,EAAE,qBAAqB,2CAyCvB"}
|
|
@@ -2,156 +2,21 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useCallback, useState } from "react";
|
|
3
3
|
import { formatUnits } from "viem";
|
|
4
4
|
import { t } from "../hooks/locale.js";
|
|
5
|
-
import { isDesktop } from "../platform.js";
|
|
6
5
|
import { PrimaryButton } from "./buttons.js";
|
|
7
|
-
import { PageHeader
|
|
8
|
-
|
|
6
|
+
import { PageHeader } from "./shared.js";
|
|
7
|
+
import { TokenAmountEntry } from "./TokenAmountEntry.js";
|
|
8
|
+
/** Amount entry page for wallet payment flow. */
|
|
9
9
|
export function WalletAmountPage({ token, platform, onBack, onContinue, baseUrl, }) {
|
|
10
10
|
const balanceToken = token.balance.token;
|
|
11
11
|
const minimumUsd = token.minimumRequired.usd;
|
|
12
12
|
const maximumUsd = Math.min(token.balance.usd, balanceToken.maxAcceptUsd);
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const roundedMaxUsd = parseFloat(roundUsd(maximumUsd));
|
|
22
|
-
const isValid = amountUsd >= minimumUsd && amountUsd <= roundedMaxUsd;
|
|
23
|
-
const showMinWarning = usdStr !== "" && amountUsd < minimumUsd;
|
|
24
|
-
const showMaxWarning = usdStr !== "" && amountUsd > roundedMaxUsd;
|
|
25
|
-
// Convert between USD and token amounts using token.usd (price of 1 token in USD)
|
|
26
|
-
const usdToTokenStr = useCallback((usd) => {
|
|
27
|
-
if (usd === 0)
|
|
28
|
-
return "";
|
|
29
|
-
// usd / token.usd = how many tokens for that USD amount
|
|
30
|
-
const tokenAmount = usd / balanceToken.usd;
|
|
31
|
-
return roundTokenAmountUnits(tokenAmount, balanceToken);
|
|
32
|
-
}, [balanceToken]);
|
|
33
|
-
const tokenToUsdStr = useCallback((tokenAmountUnits) => {
|
|
34
|
-
if (tokenAmountUnits === 0)
|
|
35
|
-
return "";
|
|
36
|
-
// tokenAmount * token.usd = USD value
|
|
37
|
-
const usd = tokenAmountUnits * balanceToken.usd;
|
|
38
|
-
return roundUsd(usd);
|
|
39
|
-
}, [balanceToken]);
|
|
40
|
-
// Update values when input changes
|
|
41
|
-
const updateValues = useCallback((newUsdStr, newTokenStr, editingUsd) => {
|
|
42
|
-
// When switching modes, format the non-edited value nicely
|
|
43
|
-
if (editingUsd) {
|
|
44
|
-
const tokenNum = parseFloat(newTokenStr) || 0;
|
|
45
|
-
const formattedToken = tokenNum > 0
|
|
46
|
-
? stripTrailingZeros(roundTokenAmountUnits(tokenNum, balanceToken))
|
|
47
|
-
: "";
|
|
48
|
-
setUsdStr(newUsdStr);
|
|
49
|
-
setTokenStr(formattedToken);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
const usdNum = parseFloat(newUsdStr) || 0;
|
|
53
|
-
const formattedUsd = usdNum > 0 ? roundUsd(usdNum) : "";
|
|
54
|
-
setUsdStr(formattedUsd);
|
|
55
|
-
setTokenStr(newTokenStr);
|
|
56
|
-
}
|
|
57
|
-
setIsEditingUsd(editingUsd);
|
|
58
|
-
}, [balanceToken]);
|
|
59
|
-
const handleInputChange = (e) => {
|
|
60
|
-
const value = e.target.value;
|
|
61
|
-
// Allow empty, or digits with up to appropriate decimal places
|
|
62
|
-
const maxDecimals = isEditingUsd ? 2 : balanceToken.displayDecimals;
|
|
63
|
-
const regex = new RegExp(`^\\d*\\.?\\d{0,${maxDecimals}}$`);
|
|
64
|
-
if (value !== "" && !regex.test(value))
|
|
65
|
-
return;
|
|
66
|
-
if (isEditingUsd) {
|
|
67
|
-
const newUsd = parseFloat(value) || 0;
|
|
68
|
-
setUsdStr(value);
|
|
69
|
-
setTokenStr(usdToTokenStr(newUsd));
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
const newToken = parseFloat(value) || 0;
|
|
73
|
-
setTokenStr(value);
|
|
74
|
-
setUsdStr(tokenToUsdStr(newToken));
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
const handleKeyDown = (e) => {
|
|
78
|
-
if (e.key === "Enter" && isValid) {
|
|
79
|
-
onContinue(amountUsd);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
const handleMax = () => {
|
|
83
|
-
const balanceTokenUnits = Number(formatUnits(BigInt(token.balance.amount), balanceToken.decimals));
|
|
84
|
-
const cappedByLiquidity = balanceToken.maxAcceptUsd < token.balance.usd;
|
|
85
|
-
const maxTokenAmountUnits = cappedByLiquidity
|
|
86
|
-
? maximumUsd / balanceToken.usd
|
|
87
|
-
: balanceTokenUnits;
|
|
88
|
-
const maxUsdStr = roundUsd(maximumUsd);
|
|
89
|
-
const maxTokenStr = roundTokenAmountUnits(maxTokenAmountUnits, balanceToken);
|
|
90
|
-
setUsdStr(maxUsdStr);
|
|
91
|
-
setTokenStr(maxTokenStr);
|
|
92
|
-
};
|
|
93
|
-
const handleSwitchCurrency = () => {
|
|
94
|
-
updateValues(usdStr, tokenStr, !isEditingUsd);
|
|
95
|
-
};
|
|
96
|
-
const shouldAutoFocus = isDesktop(platform);
|
|
97
|
-
// Dynamic input width
|
|
98
|
-
const currentValue = isEditingUsd ? usdStr : tokenStr;
|
|
99
|
-
const inputWidth = currentValue.length === 0
|
|
100
|
-
? "3.55ch"
|
|
101
|
-
: `${Math.min(currentValue.length - (currentValue.match(/\./g) || []).length * 0.55, 10)}ch`;
|
|
102
|
-
// Balance/warning message
|
|
103
|
-
const maxTokenAmountUnits = Number(formatUnits(BigInt(token.balance.amount), balanceToken.decimals));
|
|
104
|
-
const balanceUsd = token.balance.usd;
|
|
105
|
-
const getBalanceMessage = () => {
|
|
106
|
-
if (isEditingUsd) {
|
|
107
|
-
return isUsdStablecoin
|
|
108
|
-
? `${t.balance} $${roundUsd(balanceUsd)}`
|
|
109
|
-
: `${t.balance} $${roundUsd(balanceUsd)} ${balanceToken.symbol}`;
|
|
110
|
-
}
|
|
111
|
-
return `${t.balance} ${roundTokenAmountUnits(maxTokenAmountUnits, balanceToken)} ${balanceToken.symbol}`;
|
|
112
|
-
};
|
|
113
|
-
const getMessage = () => {
|
|
114
|
-
const formatAmount = (usd) => isEditingUsd
|
|
115
|
-
? `$${roundUsd(usd)}`
|
|
116
|
-
: `${usdToTokenStr(usd)} ${balanceToken.symbol}`;
|
|
117
|
-
if (showMaxWarning)
|
|
118
|
-
return `${t.maximum} ${formatAmount(maximumUsd)}`;
|
|
119
|
-
if (showMinWarning)
|
|
120
|
-
return `${t.minimum} ${formatAmount(minimumUsd)}`;
|
|
121
|
-
return getBalanceMessage();
|
|
122
|
-
};
|
|
123
|
-
const messageColor = showMinWarning || showMaxWarning
|
|
124
|
-
? "daimo-text-[var(--daimo-text)]"
|
|
125
|
-
: "daimo-text-[var(--daimo-text-secondary)]";
|
|
126
|
-
// Secondary amount for switch button
|
|
127
|
-
const secondaryAmount = isEditingUsd
|
|
128
|
-
? `${tokenStr || "0"} ${balanceToken.symbol}`
|
|
129
|
-
: `$${usdStr || roundUsd(0)}`;
|
|
130
|
-
return (_jsxs("div", { className: "daimo-flex daimo-flex-col daimo-flex-1 daimo-min-h-0", children: [_jsx(PageHeader, { title: t.enterAmount, onBack: onBack }), _jsxs("div", { className: "daimo-flex-1 daimo-flex daimo-flex-col daimo-items-center daimo-justify-center daimo-p-6", children: [_jsx("div", { className: "daimo-mb-3", children: _jsx(TokenIconWithChainBadge, { token: balanceToken, size: "lg", baseUrl: baseUrl }) }), _jsxs("div", { className: "daimo-flex daimo-items-center daimo-justify-center daimo-gap-2", children: [_jsx("span", { className: "daimo-invisible daimo-py-[3px] daimo-px-2 daimo-text-sm", children: t.max }), _jsxs("div", { className: "daimo-flex daimo-items-center daimo-justify-center daimo-gap-1", children: [isEditingUsd && (_jsx("span", { className: `daimo-text-[24px] daimo-font-semibold daimo-tabular-nums ${usdStr ? "daimo-text-[var(--daimo-text)]" : "daimo-text-[var(--daimo-placeholder)]"}`, children: "$" })), _jsx("input", { type: "text", inputMode: "decimal", value: currentValue, onChange: handleInputChange, onKeyDown: handleKeyDown, placeholder: "0.00", className: "daimo-bg-transparent daimo-font-semibold daimo-text-[var(--daimo-text)] daimo-placeholder-[var(--daimo-placeholder)] daimo-outline-none daimo-border-none daimo-shadow-none daimo-caret-[var(--daimo-text-muted)] daimo-tabular-nums daimo-ring-0 focus:daimo-outline-none focus:daimo-ring-0 focus:daimo-border-none focus:daimo-shadow-none", style: {
|
|
131
|
-
width: inputWidth,
|
|
132
|
-
minWidth: "1ch",
|
|
133
|
-
maxWidth: "10ch",
|
|
134
|
-
fontSize: "clamp(16px, 30px, 30px)", // 30px with 16px min to prevent iOS zoom
|
|
135
|
-
}, autoFocus: shouldAutoFocus }), !isEditingUsd && (_jsx("span", { className: "daimo-text-base daimo-font-normal daimo-text-[var(--daimo-text-muted)]", children: balanceToken.symbol }))] }), _jsx("button", { onClick: handleMax, className: "daimo-py-[3px] daimo-px-2 daimo-text-sm daimo-font-normal daimo-rounded-full daimo-bg-[var(--daimo-surface-secondary)] daimo-text-[var(--daimo-text-secondary)] hover:[@media(hover:hover)]:daimo-bg-[var(--daimo-surface-hover)] daimo-touch-action-manipulation daimo-transition-[background-color] daimo-duration-100 daimo-ease", children: t.max })] }), !isUsdStablecoin && (_jsx("div", { children: _jsx(SwitchButton, { onClick: handleSwitchCurrency, secondaryAmount: secondaryAmount, isEditingUsd: isEditingUsd }) })), _jsx("p", { className: `${messageColor} daimo-text-base daimo-font-normal daimo-leading-[21px] daimo-tabular-nums daimo-mb-6`, children: getMessage() }), _jsx(PrimaryButton, { onClick: () => isValid && onContinue(amountUsd), disabled: !isValid, className: "daimo-max-w-none", children: t.continue })] })] }));
|
|
136
|
-
}
|
|
137
|
-
// --- Helpers ---
|
|
138
|
-
const USD_DECIMALS = 2;
|
|
139
|
-
function roundUsd(usd) {
|
|
140
|
-
return usd.toFixed(USD_DECIMALS);
|
|
141
|
-
}
|
|
142
|
-
function roundTokenAmountUnits(amountUnits, token) {
|
|
143
|
-
if (amountUnits === 0)
|
|
144
|
-
return "0";
|
|
145
|
-
const decimals = token.displayDecimals;
|
|
146
|
-
return amountUnits.toFixed(decimals);
|
|
147
|
-
}
|
|
148
|
-
function stripTrailingZeros(val) {
|
|
149
|
-
return val.includes(".") ? val.replace(/\.?0+$/, "") : val;
|
|
150
|
-
}
|
|
151
|
-
function SwitchButton({ onClick, secondaryAmount, isEditingUsd, }) {
|
|
152
|
-
return (_jsxs("button", { onClick: onClick, className: "daimo-flex daimo-items-center daimo-gap-1 daimo-py-3 daimo-px-4 hover:[@media(hover:hover)]:daimo-opacity-70 active:daimo-opacity-50 daimo-touch-action-manipulation daimo-transition-opacity daimo-duration-150 daimo-ease", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", className: "daimo-text-[var(--daimo-text-muted)]", style: {
|
|
153
|
-
transform: isEditingUsd ? "scaleY(1)" : "scaleY(-1)",
|
|
154
|
-
transition: "transform 0.2s ease-in-out",
|
|
155
|
-
}, children: _jsx("path", { d: "M3 7.5 7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5", stroke: "currentColor", strokeWidth: "1.75", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "daimo-text-base daimo-font-normal daimo-leading-[21px] daimo-text-[var(--daimo-text-secondary)] daimo-tabular-nums", children: secondaryAmount })] }));
|
|
13
|
+
const balanceNativeUnits = Number(formatUnits(BigInt(token.balance.amount), balanceToken.decimals));
|
|
14
|
+
const [amountUsd, setAmountUsd] = useState(0);
|
|
15
|
+
const [isValid, setIsValid] = useState(false);
|
|
16
|
+
const handleChange = useCallback((usd, valid) => {
|
|
17
|
+
setAmountUsd(usd);
|
|
18
|
+
setIsValid(valid);
|
|
19
|
+
}, []);
|
|
20
|
+
return (_jsxs("div", { className: "daimo-flex daimo-flex-col daimo-flex-1 daimo-min-h-0", children: [_jsx(PageHeader, { title: t.enterAmount, onBack: onBack }), _jsxs("div", { className: "daimo-flex-1 daimo-flex daimo-flex-col daimo-items-center daimo-justify-center daimo-p-6", children: [_jsx(TokenAmountEntry, { token: balanceToken, minimumUsd: minimumUsd, maximumUsd: maximumUsd, nativeDisplay: { kind: "suffix", symbol: balanceToken.symbol }, initialMode: "usd", onContinue: onContinue, onChange: handleChange, balance: { usd: token.balance.usd, nativeAmountUnits: balanceNativeUnits }, platform: platform, baseUrl: baseUrl }), _jsx(PrimaryButton, { onClick: () => isValid && onContinue(amountUsd), disabled: !isValid, className: "daimo-max-w-none", children: t.continue })] })] }));
|
|
156
21
|
}
|
|
157
22
|
//# sourceMappingURL=WalletAmountPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WalletAmountPage.js","sourceRoot":"","sources":["../../../src/web/components/WalletAmountPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"WalletAmountPage.js","sourceRoot":"","sources":["../../../src/web/components/WalletAmountPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAUzD,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,OAAO,GACe;IACtB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1E,MAAM,kBAAkB,GAAG,MAAM,CAC/B,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CACjE,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE;QAC/D,YAAY,CAAC,GAAG,CAAC,CAAC;QAClB,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,eAAK,SAAS,EAAC,sDAAsD,aACnE,KAAC,UAAU,IAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAI,EACpD,eAAK,SAAS,EAAC,0FAA0F,aACvG,KAAC,gBAAgB,IACf,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,EAC9D,WAAW,EAAC,KAAK,EACjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,EAC1E,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,GAChB,EACF,KAAC,aAAa,IACZ,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,UAAU,CAAC,SAAS,CAAC,EAC/C,QAAQ,EAAE,CAAC,OAAO,EAClB,SAAS,EAAC,kBAAkB,YAE3B,CAAC,CAAC,QAAQ,GACG,IACZ,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AccountRail } from "../../../common/account.js";
|
|
2
|
+
type AccountApplePayPageProps = {
|
|
3
|
+
rail: AccountRail;
|
|
4
|
+
sessionId: string;
|
|
5
|
+
clientSecret: string;
|
|
6
|
+
actionVerb: string;
|
|
7
|
+
initialAmount?: string;
|
|
8
|
+
onBack: () => void;
|
|
9
|
+
onAdvance: () => void;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Coinbase Headless payment page — amount entry + Apple Pay in a single
|
|
13
|
+
* screen. Amount edits keep the backend preview + signatures up to date.
|
|
14
|
+
* Coinbase webhooks drive the deposit lifecycle; iframe events only affect
|
|
15
|
+
* the widget layout.
|
|
16
|
+
*
|
|
17
|
+
* **Iframing + CSP**: pay.coinbase.com serves a `frame-ancestors` CSP
|
|
18
|
+
* header that only allows specific allowlisted domains. In sandbox we append
|
|
19
|
+
* `useApplePaySandbox=true`, but Coinbase may still require the current host
|
|
20
|
+
* to be allowlisted for the iframe to load.
|
|
21
|
+
*/
|
|
22
|
+
export declare function AccountApplePayPage({ rail, sessionId, clientSecret, actionVerb, initialAmount, onBack, onAdvance, }: AccountApplePayPageProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=AccountApplePayPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountApplePayPage.d.ts","sourceRoot":"","sources":["../../../../src/web/components/account/AccountApplePayPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAGZ,MAAM,4BAA4B,CAAC;AAYpC,KAAK,wBAAwB,GAAG;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAWF;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,EACb,MAAM,EACN,SAAS,GACV,EAAE,wBAAwB,2CA8V1B"}
|