@daimo/pay 1.18.3 → 1.19.1
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/build/index.d.ts +23 -28
- package/build/package.json.js +2 -2
- package/build/src/assets/chains.js +18 -52
- package/build/src/assets/chains.js.map +1 -1
- package/build/src/assets/logos.js +76 -2
- package/build/src/assets/logos.js.map +1 -1
- package/build/src/components/Common/ConnectorList/index.js +21 -20
- package/build/src/components/Common/ConnectorList/index.js.map +1 -1
- package/build/src/components/Common/Modal/index.js +31 -8
- package/build/src/components/Common/Modal/index.js.map +1 -1
- package/build/src/components/Common/SelectAnotherMethodButton/index.js +4 -4
- package/build/src/components/Common/SelectAnotherMethodButton/index.js.map +1 -1
- package/build/src/components/DaimoPayButton/index.js +1 -2
- package/build/src/components/DaimoPayButton/index.js.map +1 -1
- package/build/src/components/DaimoPayModal/ConnectUsing.js +8 -6
- package/build/src/components/DaimoPayModal/ConnectUsing.js.map +1 -1
- package/build/src/components/DaimoPayModal/ConnectWithInjector/index.js +13 -9
- package/build/src/components/DaimoPayModal/ConnectWithInjector/index.js.map +1 -1
- package/build/src/components/DaimoPayModal/ConnectWithQRCode.js +17 -23
- package/build/src/components/DaimoPayModal/ConnectWithQRCode.js.map +1 -1
- package/build/src/components/DaimoPayModal/index.js +120 -41
- package/build/src/components/DaimoPayModal/index.js.map +1 -1
- package/build/src/components/Pages/Connectors/index.js +0 -2
- package/build/src/components/Pages/Connectors/index.js.map +1 -1
- package/build/src/components/Pages/MobileConnectors/index.js +62 -17
- package/build/src/components/Pages/MobileConnectors/index.js.map +1 -1
- package/build/src/components/Pages/SelectDepositAddressChain/index.js +9 -2
- package/build/src/components/Pages/SelectDepositAddressChain/index.js.map +1 -1
- package/build/src/components/Pages/SelectExchange/index.js +22 -6
- package/build/src/components/Pages/SelectExchange/index.js.map +1 -1
- package/build/src/components/Pages/SelectMethod/index.js +107 -26
- package/build/src/components/Pages/SelectMethod/index.js.map +1 -1
- package/build/src/components/Pages/SelectWalletAmount/index.js +11 -6
- package/build/src/components/Pages/SelectWalletAmount/index.js.map +1 -1
- package/build/src/components/Pages/WaitingExternal/index.js +88 -3
- package/build/src/components/Pages/WaitingExternal/index.js.map +1 -1
- package/build/src/constants/limits.js +4 -0
- package/build/src/constants/limits.js.map +1 -0
- package/build/src/constants/paymentOptions.js +61 -0
- package/build/src/constants/paymentOptions.js.map +1 -0
- package/build/src/constants/routes.js +0 -1
- package/build/src/constants/routes.js.map +1 -1
- package/build/src/constants/wallets.js +7 -0
- package/build/src/constants/wallets.js.map +1 -0
- package/build/src/hooks/useExternalPaymentOptions.js +19 -4
- package/build/src/hooks/useExternalPaymentOptions.js.map +1 -1
- package/build/src/hooks/usePaymentState.js +41 -6
- package/build/src/hooks/usePaymentState.js.map +1 -1
- package/build/src/localizations/locales/en-US.js +4 -1
- package/build/src/localizations/locales/en-US.js.map +1 -1
- package/build/src/localizations/locales/es-ES.js +4 -1
- package/build/src/localizations/locales/es-ES.js.map +1 -1
- package/build/src/localizations/locales/pt-BR.js +4 -1
- package/build/src/localizations/locales/pt-BR.js.map +1 -1
- package/build/src/payment/paymentFsm.js.map +1 -1
- package/build/src/wallets/useWallets.js +81 -8
- package/build/src/wallets/useWallets.js.map +1 -1
- package/build/src/wallets/walletConfigs.js +65 -76
- package/build/src/wallets/walletConfigs.js.map +1 -1
- package/package.json +2 -2
- package/build/src/components/Pages/DownloadApp/index.js +0 -35
- package/build/src/components/Pages/DownloadApp/index.js.map +0 -1
|
@@ -8,7 +8,7 @@ import useIsMobile from '../../../hooks/useIsMobile.js';
|
|
|
8
8
|
import styled from '../../../styles/styled/index.js';
|
|
9
9
|
import { USD_DECIMALS } from '../../../utils/format.js';
|
|
10
10
|
import { isValidNumber, sanitizeNumber } from '../../../utils/validateInput.js';
|
|
11
|
-
import {
|
|
11
|
+
import { isExternalWallet } from '../../../wallets/useWallets.js';
|
|
12
12
|
import AmountInputField from '../../Common/AmountInput/AmountInputField.js';
|
|
13
13
|
import Button from '../../Common/Button/index.js';
|
|
14
14
|
import WalletPaymentSpinner from '../../Spinners/WalletPaymentSpinner/index.js';
|
|
@@ -16,7 +16,11 @@ import WalletPaymentSpinner from '../../Spinners/WalletPaymentSpinner/index.js';
|
|
|
16
16
|
const SelectWalletAmount = () => {
|
|
17
17
|
const { paymentState, setPendingConnectorId, setRoute } = usePayContext();
|
|
18
18
|
const { selectedWallet, openInWalletBrowser } = paymentState;
|
|
19
|
-
const {
|
|
19
|
+
const {
|
|
20
|
+
setChosenUsd,
|
|
21
|
+
hydrateOrder,
|
|
22
|
+
paymentState: payFsmState
|
|
23
|
+
} = useDaimoPay();
|
|
20
24
|
const { isMobile } = useIsMobile();
|
|
21
25
|
const maxUsdLimit = paymentState.getOrderUsdLimit();
|
|
22
26
|
const [usdInput, setUsdInput] = useState("");
|
|
@@ -24,6 +28,7 @@ const SelectWalletAmount = () => {
|
|
|
24
28
|
if (selectedWallet == null) {
|
|
25
29
|
return /* @__PURE__ */ jsx(PageContent, {});
|
|
26
30
|
}
|
|
31
|
+
const walletId = selectedWallet?.id;
|
|
27
32
|
const handleAmountChange = (e) => {
|
|
28
33
|
const value = e.target.value;
|
|
29
34
|
if (value !== "" && !isValidNumber(value, USD_DECIMALS)) return;
|
|
@@ -34,12 +39,12 @@ const SelectWalletAmount = () => {
|
|
|
34
39
|
const handleContinue = async () => {
|
|
35
40
|
const amountUsd = Number(sanitizeNumber(usdInput));
|
|
36
41
|
setChosenUsd(amountUsd);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
setPendingConnectorId(
|
|
42
|
+
if (isExternalWallet(selectedWallet) && !isMobile) {
|
|
43
|
+
await hydrateOrder();
|
|
44
|
+
setPendingConnectorId(walletId);
|
|
40
45
|
setRoute(ROUTES.CONNECT);
|
|
41
46
|
} else {
|
|
42
|
-
openInWalletBrowser(selectedWallet, amountUsd);
|
|
47
|
+
await openInWalletBrowser(selectedWallet, amountUsd);
|
|
43
48
|
}
|
|
44
49
|
};
|
|
45
50
|
return /* @__PURE__ */ jsxs(PageContent, { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/Pages/SelectWalletAmount/index.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { ROUTES } from \"../../../constants/routes\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\n\nimport { ModalContent, PageContent } from \"../../Common/Modal/styles\";\n\nimport { useDaimoPay } from \"../../../hooks/useDaimoPay\";\nimport useIsMobile from \"../../../hooks/useIsMobile\";\nimport styled from \"../../../styles/styled\";\nimport { USD_DECIMALS } from \"../../../utils/format\";\nimport { isValidNumber, sanitizeNumber } from \"../../../utils/validateInput\";\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/Pages/SelectWalletAmount/index.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { ROUTES } from \"../../../constants/routes\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\n\nimport { ModalContent, PageContent } from \"../../Common/Modal/styles\";\n\nimport { useDaimoPay } from \"../../../hooks/useDaimoPay\";\nimport useIsMobile from \"../../../hooks/useIsMobile\";\nimport styled from \"../../../styles/styled\";\nimport { USD_DECIMALS } from \"../../../utils/format\";\nimport { isValidNumber, sanitizeNumber } from \"../../../utils/validateInput\";\nimport { isExternalWallet } from \"../../../wallets/useWallets\";\nimport AmountInputField from \"../../Common/AmountInput/AmountInputField\";\nimport Button from \"../../Common/Button\";\nimport WalletPaymentSpinner from \"../../Spinners/WalletPaymentSpinner\";\n\nconst SelectWalletAmount: React.FC = () => {\n const { paymentState, setPendingConnectorId, setRoute } = usePayContext();\n const { selectedWallet, openInWalletBrowser } = paymentState;\n const {\n setChosenUsd,\n hydrateOrder,\n paymentState: payFsmState,\n } = useDaimoPay();\n const { isMobile } = useIsMobile();\n const maxUsdLimit = paymentState.getOrderUsdLimit();\n\n const [usdInput, setUsdInput] = useState<string>(\"\");\n const [continueDisabled, setContinueDisabled] = useState(true);\n\n if (selectedWallet == null) {\n return <PageContent></PageContent>;\n }\n\n const walletId = selectedWallet?.id;\n\n const handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (value !== \"\" && !isValidNumber(value, USD_DECIMALS)) return;\n setUsdInput(value);\n\n const usd = Number(sanitizeNumber(value));\n setContinueDisabled(usd <= 0 || usd > maxUsdLimit);\n };\n\n const handleContinue = async () => {\n const amountUsd = Number(sanitizeNumber(usdInput));\n setChosenUsd(amountUsd);\n\n // External wallets (World, MiniPay, etc.) on desktop show QR code\n if (isExternalWallet(selectedWallet) && !isMobile) {\n await hydrateOrder();\n setPendingConnectorId(walletId!);\n setRoute(ROUTES.CONNECT);\n } else {\n // Regular wallets or mobile: open in wallet browser\n await openInWalletBrowser(selectedWallet, amountUsd);\n }\n };\n\n return (\n <PageContent>\n <WalletPaymentSpinner\n logo={selectedWallet.icon}\n logoShape={\n selectedWallet.iconShape === \"square\"\n ? \"squircle\"\n : selectedWallet.iconShape || \"squircle\"\n }\n />\n <ModalContent $preserveDisplay={true}>\n <AmountInputContainer>\n <AmountInputField value={usdInput} onChange={handleAmountChange} />\n </AmountInputContainer>\n <Button onClick={handleContinue} disabled={continueDisabled}>\n Continue\n </Button>\n </ModalContent>\n </PageContent>\n );\n};\n\nconst AmountInputContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport default SelectWalletAmount;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,qBAA+B,MAAM;AACzC,EAAA,MAAM,EAAE,YAAA,EAAc,qBAAuB,EAAA,QAAA,KAAa,aAAc,EAAA,CAAA;AACxE,EAAM,MAAA,EAAE,cAAgB,EAAA,mBAAA,EAAwB,GAAA,YAAA,CAAA;AAChD,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAc,EAAA,WAAA;AAAA,MACZ,WAAY,EAAA,CAAA;AAChB,EAAM,MAAA,EAAE,QAAS,EAAA,GAAI,WAAY,EAAA,CAAA;AACjC,EAAM,MAAA,WAAA,GAAc,aAAa,gBAAiB,EAAA,CAAA;AAElD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAiB,EAAE,CAAA,CAAA;AACnD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AAE7D,EAAA,IAAI,kBAAkB,IAAM,EAAA;AAC1B,IAAA,2BAAQ,WAAY,EAAA,EAAA,CAAA,CAAA;AAAA,GACtB;AAEA,EAAA,MAAM,WAAW,cAAgB,EAAA,EAAA,CAAA;AAEjC,EAAM,MAAA,kBAAA,GAAqB,CAAC,CAA2C,KAAA;AACrE,IAAM,MAAA,KAAA,GAAQ,EAAE,MAAO,CAAA,KAAA,CAAA;AACvB,IAAA,IAAI,UAAU,EAAM,IAAA,CAAC,aAAc,CAAA,KAAA,EAAO,YAAY,CAAG,EAAA,OAAA;AACzD,IAAA,WAAA,CAAY,KAAK,CAAA,CAAA;AAEjB,IAAA,MAAM,GAAM,GAAA,MAAA,CAAO,cAAe,CAAA,KAAK,CAAC,CAAA,CAAA;AACxC,IAAoB,mBAAA,CAAA,GAAA,IAAO,CAAK,IAAA,GAAA,GAAM,WAAW,CAAA,CAAA;AAAA,GACnD,CAAA;AAEA,EAAA,MAAM,iBAAiB,YAAY;AACjC,IAAA,MAAM,SAAY,GAAA,MAAA,CAAO,cAAe,CAAA,QAAQ,CAAC,CAAA,CAAA;AACjD,IAAA,YAAA,CAAa,SAAS,CAAA,CAAA;AAGtB,IAAA,IAAI,gBAAiB,CAAA,cAAc,CAAK,IAAA,CAAC,QAAU,EAAA;AACjD,MAAA,MAAM,YAAa,EAAA,CAAA;AACnB,MAAA,qBAAA,CAAsB,QAAS,CAAA,CAAA;AAC/B,MAAA,QAAA,CAAS,OAAO,OAAO,CAAA,CAAA;AAAA,KAClB,MAAA;AAEL,MAAM,MAAA,mBAAA,CAAoB,gBAAgB,SAAS,CAAA,CAAA;AAAA,KACrD;AAAA,GACF,CAAA;AAEA,EAAA,4BACG,WACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,MAAM,cAAe,CAAA,IAAA;AAAA,QACrB,WACE,cAAe,CAAA,SAAA,KAAc,QACzB,GAAA,UAAA,GACA,eAAe,SAAa,IAAA,UAAA;AAAA,OAAA;AAAA,KAEpC;AAAA,oBACA,IAAA,CAAC,YAAa,EAAA,EAAA,gBAAA,EAAkB,IAC9B,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,wBACC,QAAC,kBAAA,GAAA,CAAA,gBAAA,EAAA,EAAiB,OAAO,QAAU,EAAA,QAAA,EAAU,oBAAoB,CACnE,EAAA,CAAA;AAAA,0BACC,MAAO,EAAA,EAAA,OAAA,EAAS,cAAgB,EAAA,QAAA,EAAU,kBAAkB,QAE7D,EAAA,UAAA,EAAA,CAAA;AAAA,KACF,EAAA,CAAA;AAAA,GACF,EAAA,CAAA,CAAA;AAEJ,EAAA;AAEA,MAAM,uBAAuB,MAAO,CAAA,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;;"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useDaimoPay } from '../../../hooks/useDaimoPay.js';
|
|
3
4
|
import { usePayContext } from '../../../hooks/usePayContext.js';
|
|
4
5
|
import { PageContent, ModalContent, ModalH1, ModalBody } from '../../Common/Modal/styles.js';
|
|
5
6
|
import { ExternalPaymentOptions, shouldShowExternalQRCodeOnDesktop } from '@daimo/pay-common';
|
|
6
7
|
import { ExternalLinkIcon } from '../../../assets/icons.js';
|
|
7
8
|
import useIsMobile from '../../../hooks/useIsMobile.js';
|
|
8
9
|
import useLocales from '../../../hooks/useLocales.js';
|
|
10
|
+
import styled from '../../../styles/styled/index.js';
|
|
9
11
|
import Button from '../../Common/Button/index.js';
|
|
10
12
|
import ConnectWithQRCode from '../../DaimoPayModal/ConnectWithQRCode.js';
|
|
11
13
|
import ExternalPaymentSpinner from '../../Spinners/ExternalPaymentSpinner/index.js';
|
|
@@ -16,11 +18,15 @@ const WaitingExternal = () => {
|
|
|
16
18
|
const { isMobile } = useIsMobile();
|
|
17
19
|
const locales = useLocales();
|
|
18
20
|
const { selectedExternalOption, payWithExternal, paymentWaitingMessage } = paymentState;
|
|
21
|
+
useDaimoPay();
|
|
19
22
|
let isCoinbase = false;
|
|
23
|
+
let isBinance = false;
|
|
20
24
|
if (selectedExternalOption) {
|
|
21
25
|
isCoinbase = selectedExternalOption.id === ExternalPaymentOptions.Coinbase;
|
|
26
|
+
isBinance = selectedExternalOption.id === ExternalPaymentOptions.Binance;
|
|
22
27
|
}
|
|
23
28
|
const [externalURL, setExternalURL] = useState(null);
|
|
29
|
+
const [isRegenerating, setIsRegenerating] = useState(false);
|
|
24
30
|
useEffect(() => {
|
|
25
31
|
if (!selectedExternalOption) return;
|
|
26
32
|
payWithExternal(selectedExternalOption.id).then((url) => {
|
|
@@ -51,6 +57,19 @@ const WaitingExternal = () => {
|
|
|
51
57
|
);
|
|
52
58
|
}
|
|
53
59
|
};
|
|
60
|
+
const regenerateOrder = async () => {
|
|
61
|
+
if (!selectedExternalOption) return;
|
|
62
|
+
setIsRegenerating(true);
|
|
63
|
+
setExternalURL(null);
|
|
64
|
+
try {
|
|
65
|
+
payWithExternal(selectedExternalOption.id).then((url) => {
|
|
66
|
+
setExternalURL(url);
|
|
67
|
+
setIsRegenerating(false);
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error("failed to regenerate order:", error);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
54
73
|
const waitingMessageLength = paymentWaitingMessage?.length;
|
|
55
74
|
useEffect(() => {
|
|
56
75
|
triggerResize();
|
|
@@ -58,7 +77,22 @@ const WaitingExternal = () => {
|
|
|
58
77
|
if (!selectedExternalOption) {
|
|
59
78
|
return /* @__PURE__ */ jsx(PageContent, {});
|
|
60
79
|
}
|
|
61
|
-
return shouldShowExternalQRCodeOnDesktop(selectedExternalOption.id) && !isMobile ? /* @__PURE__ */
|
|
80
|
+
return shouldShowExternalQRCodeOnDesktop(selectedExternalOption.id) && !isMobile ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsx(ConnectWithQRCode, { externalUrl: externalURL ?? "" }),
|
|
82
|
+
isBinance && paymentWaitingMessage && !isRegenerating && /* @__PURE__ */ jsx(RegenerateContainer, { children: /* @__PURE__ */ jsx(
|
|
83
|
+
RegenerateLink,
|
|
84
|
+
{
|
|
85
|
+
as: "button",
|
|
86
|
+
onClick: regenerateOrder,
|
|
87
|
+
disabled: isRegenerating,
|
|
88
|
+
children: /* @__PURE__ */ jsxs("span", { children: [
|
|
89
|
+
locales.notWorking,
|
|
90
|
+
" ",
|
|
91
|
+
/* @__PURE__ */ jsx(Underline, { children: locales.regenerateOrder })
|
|
92
|
+
] })
|
|
93
|
+
}
|
|
94
|
+
) })
|
|
95
|
+
] }) : /* @__PURE__ */ jsxs(PageContent, { children: [
|
|
62
96
|
/* @__PURE__ */ jsx(
|
|
63
97
|
ExternalPaymentSpinner,
|
|
64
98
|
{
|
|
@@ -81,9 +115,60 @@ const WaitingExternal = () => {
|
|
|
81
115
|
},
|
|
82
116
|
children: selectedExternalOption.cta
|
|
83
117
|
}
|
|
84
|
-
)
|
|
118
|
+
),
|
|
119
|
+
isBinance && paymentWaitingMessage && /* @__PURE__ */ jsx(RegenerateContainer, { children: /* @__PURE__ */ jsx(
|
|
120
|
+
RegenerateLink,
|
|
121
|
+
{
|
|
122
|
+
as: "button",
|
|
123
|
+
onClick: regenerateOrder,
|
|
124
|
+
disabled: isRegenerating,
|
|
125
|
+
children: /* @__PURE__ */ jsx("span", { children: isRegenerating ? /* @__PURE__ */ jsx(Fragment, { children: locales.generatingNewOrder }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
126
|
+
locales.notWorking,
|
|
127
|
+
" ",
|
|
128
|
+
/* @__PURE__ */ jsx(Underline, { children: locales.regenerateOrder })
|
|
129
|
+
] }) })
|
|
130
|
+
}
|
|
131
|
+
) })
|
|
85
132
|
] });
|
|
86
133
|
};
|
|
134
|
+
const RegenerateContainer = styled.div`
|
|
135
|
+
text-align: center;
|
|
136
|
+
margin-top: 16px;
|
|
137
|
+
margin-bottom: -4px;
|
|
138
|
+
`;
|
|
139
|
+
const RegenerateLink = styled.a`
|
|
140
|
+
appearance: none;
|
|
141
|
+
user-select: none;
|
|
142
|
+
display: inline-flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
justify-content: center;
|
|
145
|
+
gap: 10px;
|
|
146
|
+
height: 42px;
|
|
147
|
+
padding: 0 16px;
|
|
148
|
+
border-radius: 6px;
|
|
149
|
+
border: none;
|
|
150
|
+
background: none;
|
|
151
|
+
color: var(--ck-body-color-muted);
|
|
152
|
+
text-decoration-color: var(--ck-body-color-muted);
|
|
153
|
+
font-size: 15px;
|
|
154
|
+
line-height: 18px;
|
|
155
|
+
font-weight: 400;
|
|
156
|
+
cursor: pointer;
|
|
157
|
+
|
|
158
|
+
&:disabled {
|
|
159
|
+
opacity: 0.6;
|
|
160
|
+
cursor: not-allowed;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
span {
|
|
164
|
+
opacity: 1;
|
|
165
|
+
transition: opacity 300ms ease;
|
|
166
|
+
}
|
|
167
|
+
`;
|
|
168
|
+
const Underline = styled.span`
|
|
169
|
+
text-underline-offset: 2px;
|
|
170
|
+
text-decoration: underline;
|
|
171
|
+
`;
|
|
87
172
|
|
|
88
173
|
export { WaitingExternal as default };
|
|
89
174
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/Pages/WaitingExternal/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\n\nimport {\n ModalBody,\n ModalContent,\n ModalH1,\n PageContent,\n} from \"../../Common/Modal/styles\";\n\nimport {\n ExternalPaymentOptions,\n shouldShowExternalQRCodeOnDesktop,\n} from \"@daimo/pay-common\";\nimport { ExternalLinkIcon } from \"../../../assets/icons\";\nimport useIsMobile from \"../../../hooks/useIsMobile\";\nimport useLocales from \"../../../hooks/useLocales\";\nimport Button from \"../../Common/Button\";\nimport ConnectWithQRCode from \"../../DaimoPayModal/ConnectWithQRCode\";\nimport ExternalPaymentSpinner from \"../../Spinners/ExternalPaymentSpinner\";\n\nconst WaitingExternal: React.FC = () => {\n const context = usePayContext();\n const { triggerResize, paymentState } = context;\n const { isMobile } = useIsMobile();\n const locales = useLocales();\n const { selectedExternalOption, payWithExternal, paymentWaitingMessage } =\n paymentState;\n\n let isCoinbase = false;\n if (selectedExternalOption) {\n isCoinbase = selectedExternalOption.id === ExternalPaymentOptions.Coinbase;\n }\n\n const [externalURL, setExternalURL] = useState<string | null>(null);\n\n useEffect(() => {\n if (!selectedExternalOption) return;\n payWithExternal(selectedExternalOption.id).then((url) => {\n setExternalURL(url);\n if (!shouldShowExternalQRCodeOnDesktop) {\n openExternalWindow(url);\n }\n });\n }, [selectedExternalOption]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const openExternalWindow = (url: string) => {\n if (!isCoinbase || isMobile) {\n // for non-exchange apps: open in a new tab\n window.open(url, \"_blank\");\n } else {\n // for Coinbase: open in a popup window\n // in portrait mode in the center of the screen\n let width = 500;\n let height = 700;\n const left = Math.max(\n 0,\n Math.floor((window.innerWidth - width) / 2) + window.screenX,\n );\n const top = Math.max(\n 0,\n Math.floor((window.innerHeight - height) / 2) + window.screenY,\n );\n\n window.open(\n url,\n \"popupWindow\",\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes`,\n );\n }\n };\n\n const waitingMessageLength = paymentWaitingMessage?.length;\n\n useEffect(() => {\n triggerResize();\n }, [waitingMessageLength, externalURL]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!selectedExternalOption) {\n return <PageContent></PageContent>;\n }\n\n return shouldShowExternalQRCodeOnDesktop(selectedExternalOption.id) &&\n !isMobile ? (\n <ConnectWithQRCode externalUrl={externalURL ?? \"\"} />\n ) : (\n <PageContent>\n <ExternalPaymentSpinner\n logoURI={selectedExternalOption.logoURI}\n logoShape={selectedExternalOption.logoShape}\n />\n <ModalContent style={{ marginLeft: 24, marginRight: 24 }}>\n <ModalH1>{locales.waitingForPayment}</ModalH1>\n {paymentWaitingMessage && (\n <ModalBody style={{ marginTop: 12, marginBottom: 12 }}>\n {paymentWaitingMessage}\n </ModalBody>\n )}\n </ModalContent>\n <Button\n icon={<ExternalLinkIcon />}\n onClick={() => {\n if (externalURL) {\n openExternalWindow(externalURL);\n }\n }}\n >\n {selectedExternalOption.cta}\n </Button>\n </PageContent>\n );\n};\n\nexport default WaitingExternal;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/Pages/WaitingExternal/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useDaimoPay } from \"../../../hooks/useDaimoPay\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\n\nimport {\n ModalBody,\n ModalContent,\n ModalH1,\n PageContent,\n} from \"../../Common/Modal/styles\";\n\nimport {\n ExternalPaymentOptions,\n shouldShowExternalQRCodeOnDesktop,\n} from \"@daimo/pay-common\";\nimport { ExternalLinkIcon } from \"../../../assets/icons\";\nimport useIsMobile from \"../../../hooks/useIsMobile\";\nimport useLocales from \"../../../hooks/useLocales\";\nimport styled from \"../../../styles/styled\";\nimport Button from \"../../Common/Button\";\nimport ConnectWithQRCode from \"../../DaimoPayModal/ConnectWithQRCode\";\nimport ExternalPaymentSpinner from \"../../Spinners/ExternalPaymentSpinner\";\n\nconst WaitingExternal: React.FC = () => {\n const context = usePayContext();\n const { triggerResize, paymentState } = context;\n const { isMobile } = useIsMobile();\n const locales = useLocales();\n const { selectedExternalOption, payWithExternal, paymentWaitingMessage } =\n paymentState;\n const { order } = useDaimoPay();\n\n let isCoinbase = false;\n let isBinance = false;\n if (selectedExternalOption) {\n isCoinbase = selectedExternalOption.id === ExternalPaymentOptions.Coinbase;\n isBinance = selectedExternalOption.id === ExternalPaymentOptions.Binance;\n }\n\n const [externalURL, setExternalURL] = useState<string | null>(null);\n const [isRegenerating, setIsRegenerating] = useState(false);\n\n useEffect(() => {\n if (!selectedExternalOption) return;\n payWithExternal(selectedExternalOption.id).then((url) => {\n setExternalURL(url);\n if (!shouldShowExternalQRCodeOnDesktop) {\n openExternalWindow(url);\n }\n });\n }, [selectedExternalOption]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const openExternalWindow = (url: string) => {\n if (!isCoinbase || isMobile) {\n // for non-exchange apps: open in a new tab\n window.open(url, \"_blank\");\n } else {\n // for Coinbase: open in a popup window\n // in portrait mode in the center of the screen\n let width = 500;\n let height = 700;\n const left = Math.max(\n 0,\n Math.floor((window.innerWidth - width) / 2) + window.screenX,\n );\n const top = Math.max(\n 0,\n Math.floor((window.innerHeight - height) / 2) + window.screenY,\n );\n\n window.open(\n url,\n \"popupWindow\",\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes`,\n );\n }\n };\n\n const regenerateOrder = async () => {\n if (!selectedExternalOption) return;\n\n setIsRegenerating(true);\n setExternalURL(null);\n try {\n payWithExternal(selectedExternalOption.id).then((url) => {\n setExternalURL(url);\n setIsRegenerating(false);\n });\n } catch (error) {\n console.error(\"failed to regenerate order:\", error);\n }\n };\n\n const waitingMessageLength = paymentWaitingMessage?.length;\n\n useEffect(() => {\n triggerResize();\n }, [waitingMessageLength, externalURL]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!selectedExternalOption) {\n return <PageContent></PageContent>;\n }\n\n return shouldShowExternalQRCodeOnDesktop(selectedExternalOption.id) &&\n !isMobile ? (\n <>\n <ConnectWithQRCode externalUrl={externalURL ?? \"\"} />\n {isBinance && paymentWaitingMessage && !isRegenerating && (\n <RegenerateContainer>\n <RegenerateLink\n as=\"button\"\n onClick={regenerateOrder}\n disabled={isRegenerating}\n >\n <span>\n {locales.notWorking}{\" \"}\n <Underline>{locales.regenerateOrder}</Underline>\n </span>\n </RegenerateLink>\n </RegenerateContainer>\n )}\n </>\n ) : (\n <PageContent>\n <ExternalPaymentSpinner\n logoURI={selectedExternalOption.logoURI}\n logoShape={selectedExternalOption.logoShape}\n />\n <ModalContent style={{ marginLeft: 24, marginRight: 24 }}>\n <ModalH1>{locales.waitingForPayment}</ModalH1>\n {paymentWaitingMessage && (\n <ModalBody style={{ marginTop: 12, marginBottom: 12 }}>\n {paymentWaitingMessage}\n </ModalBody>\n )}\n </ModalContent>\n <Button\n icon={<ExternalLinkIcon />}\n onClick={() => {\n if (externalURL) {\n openExternalWindow(externalURL);\n }\n }}\n >\n {selectedExternalOption.cta}\n </Button>\n {isBinance && paymentWaitingMessage && (\n <RegenerateContainer>\n <RegenerateLink\n as=\"button\"\n onClick={regenerateOrder}\n disabled={isRegenerating}\n >\n <span>\n {isRegenerating ? (\n <>{locales.generatingNewOrder}</>\n ) : (\n <>\n {locales.notWorking}{\" \"}\n <Underline>{locales.regenerateOrder}</Underline>\n </>\n )}\n </span>\n </RegenerateLink>\n </RegenerateContainer>\n )}\n </PageContent>\n );\n};\n\nconst RegenerateContainer = styled.div`\n text-align: center;\n margin-top: 16px;\n margin-bottom: -4px;\n`;\n\nconst RegenerateLink = styled.a`\n appearance: none;\n user-select: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n height: 42px;\n padding: 0 16px;\n border-radius: 6px;\n border: none;\n background: none;\n color: var(--ck-body-color-muted);\n text-decoration-color: var(--ck-body-color-muted);\n font-size: 15px;\n line-height: 18px;\n font-weight: 400;\n cursor: pointer;\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n span {\n opacity: 1;\n transition: opacity 300ms ease;\n }\n`;\n\nconst Underline = styled.span`\n text-underline-offset: 2px;\n text-decoration: underline;\n`;\n\nexport default WaitingExternal;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sources":["../../../src/constants/limits.ts"],"sourcesContent":["export const DEFAULT_USD_LIMIT = 20000;\n"],"names":[],"mappings":"AAAO,MAAM,iBAAoB,GAAA;;;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ExternalPaymentOptions } from '@daimo/pay-common';
|
|
2
|
+
|
|
3
|
+
const TOP_LEVEL_PAYMENT_OPTIONS = [
|
|
4
|
+
ExternalPaymentOptions.AllWallets,
|
|
5
|
+
ExternalPaymentOptions.AllExchanges,
|
|
6
|
+
ExternalPaymentOptions.AllAddresses,
|
|
7
|
+
ExternalPaymentOptions.AllPaymentApps,
|
|
8
|
+
ExternalPaymentOptions.Tron
|
|
9
|
+
];
|
|
10
|
+
const DEFAULT_TOP_OPTIONS_ORDER = [
|
|
11
|
+
ExternalPaymentOptions.AllWallets,
|
|
12
|
+
ExternalPaymentOptions.AllExchanges,
|
|
13
|
+
ExternalPaymentOptions.AllAddresses
|
|
14
|
+
];
|
|
15
|
+
const WALLET_OPTION_IDS = [
|
|
16
|
+
ExternalPaymentOptions.Metamask,
|
|
17
|
+
ExternalPaymentOptions.Trust,
|
|
18
|
+
ExternalPaymentOptions.Rainbow,
|
|
19
|
+
ExternalPaymentOptions.BaseApp,
|
|
20
|
+
ExternalPaymentOptions.Backpack,
|
|
21
|
+
ExternalPaymentOptions.Bitget,
|
|
22
|
+
ExternalPaymentOptions.Family,
|
|
23
|
+
ExternalPaymentOptions.Farcaster,
|
|
24
|
+
ExternalPaymentOptions.Phantom,
|
|
25
|
+
ExternalPaymentOptions.MiniPay,
|
|
26
|
+
ExternalPaymentOptions.OKX,
|
|
27
|
+
ExternalPaymentOptions.Solflare,
|
|
28
|
+
ExternalPaymentOptions.World,
|
|
29
|
+
ExternalPaymentOptions.Zerion
|
|
30
|
+
];
|
|
31
|
+
const EXCHANGE_OPTION_IDS = [
|
|
32
|
+
ExternalPaymentOptions.Coinbase,
|
|
33
|
+
ExternalPaymentOptions.Binance,
|
|
34
|
+
ExternalPaymentOptions.Lemon
|
|
35
|
+
];
|
|
36
|
+
const ADDRESS_OPTION_IDS = [
|
|
37
|
+
ExternalPaymentOptions.Tron,
|
|
38
|
+
ExternalPaymentOptions.Base,
|
|
39
|
+
ExternalPaymentOptions.Arbitrum,
|
|
40
|
+
ExternalPaymentOptions.Optimism,
|
|
41
|
+
ExternalPaymentOptions.Polygon,
|
|
42
|
+
ExternalPaymentOptions.Ethereum
|
|
43
|
+
];
|
|
44
|
+
function inferTopLevelFromArray(items) {
|
|
45
|
+
const areAllWallets = items.every(
|
|
46
|
+
(i) => WALLET_OPTION_IDS.includes(i)
|
|
47
|
+
);
|
|
48
|
+
if (areAllWallets) return ExternalPaymentOptions.AllWallets;
|
|
49
|
+
const areAllExchanges = items.every(
|
|
50
|
+
(i) => EXCHANGE_OPTION_IDS.includes(i)
|
|
51
|
+
);
|
|
52
|
+
if (areAllExchanges) return ExternalPaymentOptions.AllExchanges;
|
|
53
|
+
const areAllAddresses = items.every(
|
|
54
|
+
(i) => ADDRESS_OPTION_IDS.includes(i)
|
|
55
|
+
);
|
|
56
|
+
if (areAllAddresses) return ExternalPaymentOptions.AllAddresses;
|
|
57
|
+
return void 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { ADDRESS_OPTION_IDS, DEFAULT_TOP_OPTIONS_ORDER, EXCHANGE_OPTION_IDS, TOP_LEVEL_PAYMENT_OPTIONS, WALLET_OPTION_IDS, inferTopLevelFromArray };
|
|
61
|
+
//# sourceMappingURL=paymentOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paymentOptions.js","sources":["../../../src/constants/paymentOptions.ts"],"sourcesContent":["import {\n ExternalPaymentOptions,\n ExternalPaymentOptionsString,\n} from \"@daimo/pay-common\";\n\n// Top-level categories the UI understands at the first select screen\nexport const TOP_LEVEL_PAYMENT_OPTIONS: ExternalPaymentOptionsString[] = [\n ExternalPaymentOptions.AllWallets,\n ExternalPaymentOptions.AllExchanges,\n ExternalPaymentOptions.AllAddresses,\n ExternalPaymentOptions.AllPaymentApps,\n ExternalPaymentOptions.Tron,\n];\n\n// Default order when no explicit order is provided\nexport const DEFAULT_TOP_OPTIONS_ORDER: ExternalPaymentOptionsString[] = [\n ExternalPaymentOptions.AllWallets,\n ExternalPaymentOptions.AllExchanges,\n ExternalPaymentOptions.AllAddresses,\n];\n\n// Specific option ids by category (excluding the All* entries)\nexport const WALLET_OPTION_IDS: ExternalPaymentOptionsString[] = [\n ExternalPaymentOptions.Metamask,\n ExternalPaymentOptions.Trust,\n ExternalPaymentOptions.Rainbow,\n ExternalPaymentOptions.BaseApp,\n ExternalPaymentOptions.Backpack,\n ExternalPaymentOptions.Bitget,\n ExternalPaymentOptions.Family,\n ExternalPaymentOptions.Farcaster,\n ExternalPaymentOptions.Phantom,\n ExternalPaymentOptions.MiniPay,\n ExternalPaymentOptions.OKX,\n ExternalPaymentOptions.Solflare,\n ExternalPaymentOptions.World,\n ExternalPaymentOptions.Zerion,\n];\n\nexport const EXCHANGE_OPTION_IDS: ExternalPaymentOptionsString[] = [\n ExternalPaymentOptions.Coinbase,\n ExternalPaymentOptions.Binance,\n ExternalPaymentOptions.Lemon,\n];\n\nexport const ADDRESS_OPTION_IDS: ExternalPaymentOptionsString[] = [\n ExternalPaymentOptions.Tron,\n ExternalPaymentOptions.Base,\n ExternalPaymentOptions.Arbitrum,\n ExternalPaymentOptions.Optimism,\n ExternalPaymentOptions.Polygon,\n ExternalPaymentOptions.Ethereum,\n];\n\n/** Infer which top-level category a nested array corresponds to. */\nexport function inferTopLevelFromArray(\n items: string[],\n):\n | typeof ExternalPaymentOptions.AllWallets\n | typeof ExternalPaymentOptions.AllExchanges\n | typeof ExternalPaymentOptions.AllAddresses\n | undefined {\n const areAllWallets = items.every((i) =>\n WALLET_OPTION_IDS.includes(i as ExternalPaymentOptionsString),\n );\n if (areAllWallets) return ExternalPaymentOptions.AllWallets;\n\n const areAllExchanges = items.every((i) =>\n EXCHANGE_OPTION_IDS.includes(i as ExternalPaymentOptionsString),\n );\n if (areAllExchanges) return ExternalPaymentOptions.AllExchanges;\n\n const areAllAddresses = items.every((i) =>\n ADDRESS_OPTION_IDS.includes(i as ExternalPaymentOptionsString),\n );\n if (areAllAddresses) return ExternalPaymentOptions.AllAddresses;\n\n return undefined;\n}\n"],"names":[],"mappings":";;AAMO,MAAM,yBAA4D,GAAA;AAAA,EACvE,sBAAuB,CAAA,UAAA;AAAA,EACvB,sBAAuB,CAAA,YAAA;AAAA,EACvB,sBAAuB,CAAA,YAAA;AAAA,EACvB,sBAAuB,CAAA,cAAA;AAAA,EACvB,sBAAuB,CAAA,IAAA;AACzB,EAAA;AAGO,MAAM,yBAA4D,GAAA;AAAA,EACvE,sBAAuB,CAAA,UAAA;AAAA,EACvB,sBAAuB,CAAA,YAAA;AAAA,EACvB,sBAAuB,CAAA,YAAA;AACzB,EAAA;AAGO,MAAM,iBAAoD,GAAA;AAAA,EAC/D,sBAAuB,CAAA,QAAA;AAAA,EACvB,sBAAuB,CAAA,KAAA;AAAA,EACvB,sBAAuB,CAAA,OAAA;AAAA,EACvB,sBAAuB,CAAA,OAAA;AAAA,EACvB,sBAAuB,CAAA,QAAA;AAAA,EACvB,sBAAuB,CAAA,MAAA;AAAA,EACvB,sBAAuB,CAAA,MAAA;AAAA,EACvB,sBAAuB,CAAA,SAAA;AAAA,EACvB,sBAAuB,CAAA,OAAA;AAAA,EACvB,sBAAuB,CAAA,OAAA;AAAA,EACvB,sBAAuB,CAAA,GAAA;AAAA,EACvB,sBAAuB,CAAA,QAAA;AAAA,EACvB,sBAAuB,CAAA,KAAA;AAAA,EACvB,sBAAuB,CAAA,MAAA;AACzB,EAAA;AAEO,MAAM,mBAAsD,GAAA;AAAA,EACjE,sBAAuB,CAAA,QAAA;AAAA,EACvB,sBAAuB,CAAA,OAAA;AAAA,EACvB,sBAAuB,CAAA,KAAA;AACzB,EAAA;AAEO,MAAM,kBAAqD,GAAA;AAAA,EAChE,sBAAuB,CAAA,IAAA;AAAA,EACvB,sBAAuB,CAAA,IAAA;AAAA,EACvB,sBAAuB,CAAA,QAAA;AAAA,EACvB,sBAAuB,CAAA,QAAA;AAAA,EACvB,sBAAuB,CAAA,OAAA;AAAA,EACvB,sBAAuB,CAAA,QAAA;AACzB,EAAA;AAGO,SAAS,uBACd,KAKY,EAAA;AACZ,EAAA,MAAM,gBAAgB,KAAM,CAAA,KAAA;AAAA,IAAM,CAAC,CAAA,KACjC,iBAAkB,CAAA,QAAA,CAAS,CAAiC,CAAA;AAAA,GAC9D,CAAA;AACA,EAAI,IAAA,aAAA,SAAsB,sBAAuB,CAAA,UAAA,CAAA;AAEjD,EAAA,MAAM,kBAAkB,KAAM,CAAA,KAAA;AAAA,IAAM,CAAC,CAAA,KACnC,mBAAoB,CAAA,QAAA,CAAS,CAAiC,CAAA;AAAA,GAChE,CAAA;AACA,EAAI,IAAA,eAAA,SAAwB,sBAAuB,CAAA,YAAA,CAAA;AAEnD,EAAA,MAAM,kBAAkB,KAAM,CAAA,KAAA;AAAA,IAAM,CAAC,CAAA,KACnC,kBAAmB,CAAA,QAAA,CAAS,CAAiC,CAAA;AAAA,GAC/D,CAAA;AACA,EAAI,IAAA,eAAA,SAAwB,sBAAuB,CAAA,YAAA,CAAA;AAEnD,EAAO,OAAA,KAAA,CAAA,CAAA;AACT;;;;"}
|
|
@@ -23,7 +23,6 @@ var ROUTES = /* @__PURE__ */ ((ROUTES2) => {
|
|
|
23
23
|
ROUTES2["CONNECTORS"] = "connectors";
|
|
24
24
|
ROUTES2["MOBILECONNECTORS"] = "mobileConnectors";
|
|
25
25
|
ROUTES2["CONNECT"] = "connect";
|
|
26
|
-
ROUTES2["DOWNLOAD"] = "download";
|
|
27
26
|
ROUTES2["SWITCHNETWORKS"] = "switchNetworks";
|
|
28
27
|
return ROUTES2;
|
|
29
28
|
})(ROUTES || {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sources":["../../../src/constants/routes.ts"],"sourcesContent":["export enum ROUTES {\n SELECT_METHOD = \"daimoPaySelectMethod\",\n SELECT_TOKEN = \"daimoPaySelectToken\",\n SELECT_AMOUNT = \"daimoPaySelectAmount\",\n SELECT_EXTERNAL_AMOUNT = \"daimoPaySelectExternalAmount\",\n SELECT_EXCHANGE = \"daimoPaySelectExchange\",\n SELECT_DEPOSIT_ADDRESS_AMOUNT = \"daimoPaySelectDepositAddressAmount\",\n SELECT_WALLET_AMOUNT = \"daimoPaySelectWalletAmount\",\n SELECT_WALLET_CHAIN = \"daimoPaySelectWalletChain\",\n SELECT_ZKP2P = \"daimoPaySelectZKP2P\",\n WAITING_EXTERNAL = \"daimoPayWaitingExternal\",\n WAITING_WALLET = \"daimoPayWaitingWallet\",\n SELECT_DEPOSIT_ADDRESS_CHAIN = \"daimoPaySelectDepositAddressChain\",\n WAITING_DEPOSIT_ADDRESS = \"daimoPayWaitingDepositAddress\",\n PAY_WITH_TOKEN = \"daimoPayPayWithToken\",\n CONFIRMATION = \"daimoPayConfirmation\",\n SOLANA_CONNECTOR = \"daimoPaySolanaConnector\",\n SOLANA_SELECT_AMOUNT = \"daimoPaySolanaSelectAmount\",\n SOLANA_PAY_WITH_TOKEN = \"daimoPaySolanaPayWithToken\",\n ERROR = \"daimoPayError\",\n\n // Unused routes. Kept to minimize connectkit merge conflicts.\n ONBOARDING = \"onboarding\",\n ABOUT = \"about\",\n CONNECTORS = \"connectors\",\n MOBILECONNECTORS = \"mobileConnectors\",\n CONNECT = \"connect\",\n
|
|
1
|
+
{"version":3,"file":"routes.js","sources":["../../../src/constants/routes.ts"],"sourcesContent":["export enum ROUTES {\n SELECT_METHOD = \"daimoPaySelectMethod\",\n SELECT_TOKEN = \"daimoPaySelectToken\",\n SELECT_AMOUNT = \"daimoPaySelectAmount\",\n SELECT_EXTERNAL_AMOUNT = \"daimoPaySelectExternalAmount\",\n SELECT_EXCHANGE = \"daimoPaySelectExchange\",\n SELECT_DEPOSIT_ADDRESS_AMOUNT = \"daimoPaySelectDepositAddressAmount\",\n SELECT_WALLET_AMOUNT = \"daimoPaySelectWalletAmount\",\n SELECT_WALLET_CHAIN = \"daimoPaySelectWalletChain\",\n SELECT_ZKP2P = \"daimoPaySelectZKP2P\",\n WAITING_EXTERNAL = \"daimoPayWaitingExternal\",\n WAITING_WALLET = \"daimoPayWaitingWallet\",\n SELECT_DEPOSIT_ADDRESS_CHAIN = \"daimoPaySelectDepositAddressChain\",\n WAITING_DEPOSIT_ADDRESS = \"daimoPayWaitingDepositAddress\",\n PAY_WITH_TOKEN = \"daimoPayPayWithToken\",\n CONFIRMATION = \"daimoPayConfirmation\",\n SOLANA_CONNECTOR = \"daimoPaySolanaConnector\",\n SOLANA_SELECT_AMOUNT = \"daimoPaySolanaSelectAmount\",\n SOLANA_PAY_WITH_TOKEN = \"daimoPaySolanaPayWithToken\",\n ERROR = \"daimoPayError\",\n\n // Unused routes. Kept to minimize connectkit merge conflicts.\n ONBOARDING = \"onboarding\",\n ABOUT = \"about\",\n CONNECTORS = \"connectors\",\n MOBILECONNECTORS = \"mobileConnectors\",\n CONNECT = \"connect\",\n SWITCHNETWORKS = \"switchNetworks\",\n}\n"],"names":["ROUTES"],"mappings":"AAAY,IAAA,MAAA,qBAAAA,OAAL,KAAA;AACL,EAAAA,QAAA,eAAgB,CAAA,GAAA,sBAAA,CAAA;AAChB,EAAAA,QAAA,cAAe,CAAA,GAAA,qBAAA,CAAA;AACf,EAAAA,QAAA,eAAgB,CAAA,GAAA,sBAAA,CAAA;AAChB,EAAAA,QAAA,wBAAyB,CAAA,GAAA,8BAAA,CAAA;AACzB,EAAAA,QAAA,iBAAkB,CAAA,GAAA,wBAAA,CAAA;AAClB,EAAAA,QAAA,+BAAgC,CAAA,GAAA,oCAAA,CAAA;AAChC,EAAAA,QAAA,sBAAuB,CAAA,GAAA,4BAAA,CAAA;AACvB,EAAAA,QAAA,qBAAsB,CAAA,GAAA,2BAAA,CAAA;AACtB,EAAAA,QAAA,cAAe,CAAA,GAAA,qBAAA,CAAA;AACf,EAAAA,QAAA,kBAAmB,CAAA,GAAA,yBAAA,CAAA;AACnB,EAAAA,QAAA,gBAAiB,CAAA,GAAA,uBAAA,CAAA;AACjB,EAAAA,QAAA,8BAA+B,CAAA,GAAA,mCAAA,CAAA;AAC/B,EAAAA,QAAA,yBAA0B,CAAA,GAAA,+BAAA,CAAA;AAC1B,EAAAA,QAAA,gBAAiB,CAAA,GAAA,sBAAA,CAAA;AACjB,EAAAA,QAAA,cAAe,CAAA,GAAA,sBAAA,CAAA;AACf,EAAAA,QAAA,kBAAmB,CAAA,GAAA,yBAAA,CAAA;AACnB,EAAAA,QAAA,sBAAuB,CAAA,GAAA,4BAAA,CAAA;AACvB,EAAAA,QAAA,uBAAwB,CAAA,GAAA,4BAAA,CAAA;AACxB,EAAAA,QAAA,OAAQ,CAAA,GAAA,eAAA,CAAA;AAGR,EAAAA,QAAA,YAAa,CAAA,GAAA,YAAA,CAAA;AACb,EAAAA,QAAA,OAAQ,CAAA,GAAA,OAAA,CAAA;AACR,EAAAA,QAAA,YAAa,CAAA,GAAA,YAAA,CAAA;AACb,EAAAA,QAAA,kBAAmB,CAAA,GAAA,kBAAA,CAAA;AACnB,EAAAA,QAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AACV,EAAAA,QAAA,gBAAiB,CAAA,GAAA,gBAAA,CAAA;AA3BP,EAAAA,OAAAA,OAAAA,CAAAA;AAAA,CAAA,EAAA,MAAA,IAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const WALLET_ID_OTHER_WALLET = "otherWallet";
|
|
2
|
+
const WALLET_ID_MOBILE_WALLETS = "mobileWallets";
|
|
3
|
+
const RABBY_CONNECTOR_ID = "io.rabby";
|
|
4
|
+
const MOBILE_WALLETS_THRESHOLD_FOR_OTHER = 3;
|
|
5
|
+
|
|
6
|
+
export { MOBILE_WALLETS_THRESHOLD_FOR_OTHER, RABBY_CONNECTOR_ID, WALLET_ID_MOBILE_WALLETS, WALLET_ID_OTHER_WALLET };
|
|
7
|
+
//# sourceMappingURL=wallets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallets.js","sources":["../../../src/constants/wallets.ts"],"sourcesContent":["// Special wallet IDs used throughout the UI\nexport const WALLET_ID_OTHER_WALLET = \"otherWallet\";\nexport const WALLET_ID_MOBILE_WALLETS = \"mobileWallets\";\n\n// Connector IDs for special-case behavior\nexport const RABBY_CONNECTOR_ID = \"io.rabby\";\n\n// Mobile wallets display rules\nexport const MOBILE_WALLETS_THRESHOLD_FOR_OTHER = 3; // if > 3, show \"Other\"\n"],"names":[],"mappings":"AACO,MAAM,sBAAyB,GAAA,cAAA;AAC/B,MAAM,wBAA2B,GAAA,gBAAA;AAGjC,MAAM,kBAAqB,GAAA,WAAA;AAG3B,MAAM,kCAAqC,GAAA;;;;"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { ExternalPaymentOptions } from '@daimo/pay-common';
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
|
+
import { inferTopLevelFromArray } from '../constants/paymentOptions.js';
|
|
3
4
|
|
|
4
5
|
const DEFAULT_EXTERNAL_PAYMENT_OPTIONS = Object.values(
|
|
5
6
|
ExternalPaymentOptions
|
|
6
7
|
).filter(
|
|
7
8
|
(opt) => (
|
|
8
|
-
//
|
|
9
|
-
opt !== ExternalPaymentOptions.
|
|
9
|
+
// These are handled in the SelectMethod component.
|
|
10
|
+
opt !== ExternalPaymentOptions.AllAddresses && opt !== ExternalPaymentOptions.AllPaymentApps
|
|
10
11
|
)
|
|
11
12
|
);
|
|
12
13
|
function useExternalPaymentOptions({
|
|
@@ -18,6 +19,9 @@ function useExternalPaymentOptions({
|
|
|
18
19
|
}) {
|
|
19
20
|
const [options, setOptions] = useState(/* @__PURE__ */ new Map());
|
|
20
21
|
const [loading, setLoading] = useState(false);
|
|
22
|
+
const [parsedConfig, setParsedConfig] = useState({
|
|
23
|
+
walletOrder: []
|
|
24
|
+
});
|
|
21
25
|
useEffect(() => {
|
|
22
26
|
const refreshExternalPaymentOptions = async (usd, mode2) => {
|
|
23
27
|
if (!platform) return;
|
|
@@ -28,7 +32,18 @@ function useExternalPaymentOptions({
|
|
|
28
32
|
mode: mode2,
|
|
29
33
|
usdRequired: usd
|
|
30
34
|
});
|
|
31
|
-
|
|
35
|
+
let walletOrder = [];
|
|
36
|
+
if (filterIds) {
|
|
37
|
+
const nestedArray = filterIds.find((opt) => Array.isArray(opt));
|
|
38
|
+
if (nestedArray && Array.isArray(nestedArray)) {
|
|
39
|
+
walletOrder = nestedArray;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
setParsedConfig({ walletOrder });
|
|
43
|
+
const flatFilterIds = filterIds ? filterIds.flatMap(
|
|
44
|
+
(opt) => Array.isArray(opt) ? inferTopLevelFromArray(opt) ?? "AllWallets" : opt
|
|
45
|
+
) : null;
|
|
46
|
+
const enabledExtPaymentOptions = flatFilterIds || DEFAULT_EXTERNAL_PAYMENT_OPTIONS;
|
|
32
47
|
const hasAllPaymentApps = enabledExtPaymentOptions.includes(
|
|
33
48
|
ExternalPaymentOptions.AllPaymentApps
|
|
34
49
|
);
|
|
@@ -57,7 +72,7 @@ function useExternalPaymentOptions({
|
|
|
57
72
|
refreshExternalPaymentOptions(usdRequired, mode);
|
|
58
73
|
}
|
|
59
74
|
}, [usdRequired, JSON.stringify(filterIds), platform, mode, trpc]);
|
|
60
|
-
return { options, loading };
|
|
75
|
+
return { options, loading, parsedConfig };
|
|
61
76
|
}
|
|
62
77
|
|
|
63
78
|
export { useExternalPaymentOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExternalPaymentOptions.js","sources":["../../../src/hooks/useExternalPaymentOptions.ts"],"sourcesContent":["import {\n DaimoPayOrderMode,\n ExternalPaymentOptionMetadata,\n ExternalPaymentOptions,\n PlatformType,\n} from \"@daimo/pay-common\";\nimport { useEffect, useState } from \"react\";\nimport { TrpcClient } from \"../utils/trpc\";\n\nconst DEFAULT_EXTERNAL_PAYMENT_OPTIONS = Object.values(\n ExternalPaymentOptions,\n).filter(\n (opt) =>\n //
|
|
1
|
+
{"version":3,"file":"useExternalPaymentOptions.js","sources":["../../../src/hooks/useExternalPaymentOptions.ts"],"sourcesContent":["import {\n DaimoPayOrderMode,\n ExternalPaymentOptionMetadata,\n ExternalPaymentOptions,\n PlatformType,\n} from \"@daimo/pay-common\";\nimport { useEffect, useState } from \"react\";\nimport { inferTopLevelFromArray } from \"../constants/paymentOptions\";\nimport { TrpcClient } from \"../utils/trpc\";\n\nconst DEFAULT_EXTERNAL_PAYMENT_OPTIONS = Object.values(\n ExternalPaymentOptions,\n).filter(\n (opt) =>\n // These are handled in the SelectMethod component.\n opt !== ExternalPaymentOptions.AllAddresses &&\n opt !== ExternalPaymentOptions.AllPaymentApps,\n);\n\nexport function useExternalPaymentOptions({\n trpc,\n filterIds,\n platform,\n usdRequired,\n mode,\n}: {\n trpc: TrpcClient;\n filterIds: (string | string[])[] | undefined;\n platform: PlatformType | undefined;\n usdRequired: number | undefined;\n mode: DaimoPayOrderMode | undefined;\n}): {\n /// Exteral options, organized by optionType\n options: Map<\n \"external\" | \"zkp2p\" | \"exchange\",\n ExternalPaymentOptionMetadata[]\n >;\n loading: boolean;\n parsedConfig: {\n walletOrder: string[];\n };\n} {\n const [options, setOptions] = useState<\n Map<\"external\" | \"zkp2p\" | \"exchange\", ExternalPaymentOptionMetadata[]>\n >(new Map());\n const [loading, setLoading] = useState(false);\n const [parsedConfig, setParsedConfig] = useState<{ walletOrder: string[] }>({\n walletOrder: [],\n });\n\n useEffect(() => {\n const refreshExternalPaymentOptions = async (\n usd: number,\n mode: DaimoPayOrderMode,\n ) => {\n if (!platform) return;\n\n setLoading(true);\n try {\n const newOptions = await trpc.getExternalPaymentOptions.query({\n platform,\n mode,\n usdRequired: usd,\n });\n\n // Extract wallet order from nested array in filterIds\n let walletOrder: string[] = [];\n if (filterIds) {\n const nestedArray = filterIds.find((opt) => Array.isArray(opt));\n if (nestedArray && Array.isArray(nestedArray)) {\n walletOrder = nestedArray as string[];\n }\n }\n setParsedConfig({ walletOrder });\n\n // Filter out options not in options JSON\n // Flatten nested arrays (used for mobile wallet filtering)\n const flatFilterIds = filterIds\n ? filterIds.flatMap((opt) =>\n Array.isArray(opt)\n ? (inferTopLevelFromArray(opt as string[]) ?? \"AllWallets\")\n : opt,\n )\n : null;\n const enabledExtPaymentOptions =\n flatFilterIds || DEFAULT_EXTERNAL_PAYMENT_OPTIONS;\n\n const hasAllPaymentApps = enabledExtPaymentOptions.includes(\n ExternalPaymentOptions.AllPaymentApps,\n );\n const hasAllExchanges = enabledExtPaymentOptions.includes(\n ExternalPaymentOptions.AllExchanges,\n );\n\n const filteredOptions = newOptions.filter(\n (option: ExternalPaymentOptionMetadata) =>\n enabledExtPaymentOptions.includes(option.id) ||\n (hasAllPaymentApps && option.optionType === \"zkp2p\") ||\n (hasAllExchanges && option.optionType === \"exchange\"),\n );\n const optionsByType: Map<\n \"external\" | \"zkp2p\" | \"exchange\",\n ExternalPaymentOptionMetadata[]\n > = new Map();\n filteredOptions.forEach((option) => {\n const { optionType } = option;\n if (!optionsByType.has(optionType)) {\n optionsByType.set(optionType, []);\n }\n optionsByType.get(optionType)!.push(option);\n });\n\n setOptions(optionsByType);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n }\n };\n\n if (usdRequired != null && mode != null) {\n refreshExternalPaymentOptions(usdRequired, mode);\n }\n // TODO: this is an ugly way to handle polling/refresh\n // Notice the load-bearing JSON.stringify() to prevent a visible infinite\n // refresh glitch on the SelectMethod screen. Replace this useEffect().\n //\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [usdRequired, JSON.stringify(filterIds), platform, mode, trpc]);\n\n return { options, loading, parsedConfig };\n}\n"],"names":["mode"],"mappings":";;;;AAUA,MAAM,mCAAmC,MAAO,CAAA,MAAA;AAAA,EAC9C,sBAAA;AACF,CAAE,CAAA,MAAA;AAAA,EACA,CAAC,GAAA;AAAA;AAAA,IAEC,GAAQ,KAAA,sBAAA,CAAuB,YAC/B,IAAA,GAAA,KAAQ,sBAAuB,CAAA,cAAA;AAAA,GAAA;AACnC,CAAA,CAAA;AAEO,SAAS,yBAA0B,CAAA;AAAA,EACxC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AACF,CAgBE,EAAA;AACA,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAI,QAE5B,iBAAA,IAAI,KAAK,CAAA,CAAA;AACX,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAoC,CAAA;AAAA,IAC1E,aAAa,EAAC;AAAA,GACf,CAAA,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,6BAAA,GAAgC,OACpC,GAAA,EACAA,KACG,KAAA;AACH,MAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAEf,MAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AACf,MAAI,IAAA;AACF,QAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,yBAAA,CAA0B,KAAM,CAAA;AAAA,UAC5D,QAAA;AAAA,UACA,IAAAA,EAAAA,KAAAA;AAAA,UACA,WAAa,EAAA,GAAA;AAAA,SACd,CAAA,CAAA;AAGD,QAAA,IAAI,cAAwB,EAAC,CAAA;AAC7B,QAAA,IAAI,SAAW,EAAA;AACb,UAAM,MAAA,WAAA,GAAc,UAAU,IAAK,CAAA,CAAC,QAAQ,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA;AAC9D,UAAA,IAAI,WAAe,IAAA,KAAA,CAAM,OAAQ,CAAA,WAAW,CAAG,EAAA;AAC7C,YAAc,WAAA,GAAA,WAAA,CAAA;AAAA,WAChB;AAAA,SACF;AACA,QAAgB,eAAA,CAAA,EAAE,aAAa,CAAA,CAAA;AAI/B,QAAM,MAAA,aAAA,GAAgB,YAClB,SAAU,CAAA,OAAA;AAAA,UAAQ,CAAC,QACjB,KAAM,CAAA,OAAA,CAAQ,GAAG,CACZ,GAAA,sBAAA,CAAuB,GAAe,CAAA,IAAK,YAC5C,GAAA,GAAA;AAAA,SAEN,GAAA,IAAA,CAAA;AACJ,QAAA,MAAM,2BACJ,aAAiB,IAAA,gCAAA,CAAA;AAEnB,QAAA,MAAM,oBAAoB,wBAAyB,CAAA,QAAA;AAAA,UACjD,sBAAuB,CAAA,cAAA;AAAA,SACzB,CAAA;AACA,QAAA,MAAM,kBAAkB,wBAAyB,CAAA,QAAA;AAAA,UAC/C,sBAAuB,CAAA,YAAA;AAAA,SACzB,CAAA;AAEA,QAAA,MAAM,kBAAkB,UAAW,CAAA,MAAA;AAAA,UACjC,CAAC,MAAA,KACC,wBAAyB,CAAA,QAAA,CAAS,MAAO,CAAA,EAAE,CAC1C,IAAA,iBAAA,IAAqB,MAAO,CAAA,UAAA,KAAe,OAC3C,IAAA,eAAA,IAAmB,OAAO,UAAe,KAAA,UAAA;AAAA,SAC9C,CAAA;AACA,QAAM,MAAA,aAAA,uBAGE,GAAI,EAAA,CAAA;AACZ,QAAgB,eAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAClC,UAAM,MAAA,EAAE,YAAe,GAAA,MAAA,CAAA;AACvB,UAAA,IAAI,CAAC,aAAA,CAAc,GAAI,CAAA,UAAU,CAAG,EAAA;AAClC,YAAc,aAAA,CAAA,GAAA,CAAI,UAAY,EAAA,EAAE,CAAA,CAAA;AAAA,WAClC;AACA,UAAA,aAAA,CAAc,GAAI,CAAA,UAAU,CAAG,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,SAC3C,CAAA,CAAA;AAED,QAAA,UAAA,CAAW,aAAa,CAAA,CAAA;AAAA,eACjB,KAAO,EAAA;AACd,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,OACnB,SAAA;AACA,QAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,OAClB;AAAA,KACF,CAAA;AAEA,IAAI,IAAA,WAAA,IAAe,IAAQ,IAAA,IAAA,IAAQ,IAAM,EAAA;AACvC,MAAA,6BAAA,CAA8B,aAAa,IAAI,CAAA,CAAA;AAAA,KACjD;AAAA,GAMF,EAAG,CAAC,WAAA,EAAa,IAAK,CAAA,SAAA,CAAU,SAAS,CAAG,EAAA,QAAA,EAAU,IAAM,EAAA,IAAI,CAAC,CAAA,CAAA;AAEjE,EAAO,OAAA,EAAE,OAAS,EAAA,OAAA,EAAS,YAAa,EAAA,CAAA;AAC1C;;;;"}
|
|
@@ -4,6 +4,8 @@ import { VersionedTransaction } from '@solana/web3.js';
|
|
|
4
4
|
import { useState, useEffect, useCallback } from 'react';
|
|
5
5
|
import { getAddress, erc20Abi, isHex, hexToBytes } from 'viem';
|
|
6
6
|
import { useAccount, useEnsName, useSendTransaction, useWriteContract } from 'wagmi';
|
|
7
|
+
import { DEFAULT_USD_LIMIT } from '../constants/limits.js';
|
|
8
|
+
import { inferTopLevelFromArray, DEFAULT_TOP_OPTIONS_ORDER, TOP_LEVEL_PAYMENT_OPTIONS } from '../constants/paymentOptions.js';
|
|
7
9
|
import { ROUTES } from '../constants/routes.js';
|
|
8
10
|
import { detectPlatform } from '../utils/platform.js';
|
|
9
11
|
import { useDaimoPay } from './useDaimoPay.js';
|
|
@@ -15,6 +17,29 @@ import { useSolanaPaymentOptions } from './useSolanaPaymentOptions.js';
|
|
|
15
17
|
import { useUntronAvailability } from './useUntronAvailability.js';
|
|
16
18
|
import { useWalletPaymentOptions } from './useWalletPaymentOptions.js';
|
|
17
19
|
|
|
20
|
+
function getTopLevelOptions(paymentOptions) {
|
|
21
|
+
if (!paymentOptions || paymentOptions.length === 0) return [];
|
|
22
|
+
const topLevelOptions = TOP_LEVEL_PAYMENT_OPTIONS;
|
|
23
|
+
const isString = (opt) => typeof opt === "string";
|
|
24
|
+
const stringOptions = paymentOptions.filter(isString);
|
|
25
|
+
const topLevel = stringOptions.filter(
|
|
26
|
+
(opt) => topLevelOptions.includes(opt)
|
|
27
|
+
);
|
|
28
|
+
const specific = stringOptions.filter(
|
|
29
|
+
(opt) => !topLevelOptions.includes(opt)
|
|
30
|
+
);
|
|
31
|
+
if (topLevel.length && specific.length) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`invalid paymentOptions: cannot mix top-level options ${JSON.stringify(topLevel)} with specific options ${JSON.stringify(specific)}. use either ["AllWallets", "AllExchanges", ...] or ["MiniPay", "Binance", ...], not both`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
const flattened = paymentOptions.map(
|
|
37
|
+
(opt) => Array.isArray(opt) ? inferTopLevelFromArray(opt) ?? "AllWallets" : opt
|
|
38
|
+
);
|
|
39
|
+
return flattened.filter(
|
|
40
|
+
(opt) => topLevelOptions.includes(opt)
|
|
41
|
+
);
|
|
42
|
+
}
|
|
18
43
|
function usePaymentState({
|
|
19
44
|
trpc,
|
|
20
45
|
lockPayParams,
|
|
@@ -82,7 +107,6 @@ function usePaymentState({
|
|
|
82
107
|
const [selectedWallet, setSelectedWallet] = useState();
|
|
83
108
|
const [selectedWalletDeepLink, setSelectedWalletDeepLink] = useState();
|
|
84
109
|
const getOrderUsdLimit = () => {
|
|
85
|
-
const DEFAULT_USD_LIMIT = 2e4;
|
|
86
110
|
if (pay.order == null || chainOrderUsdLimits.loading) {
|
|
87
111
|
return DEFAULT_USD_LIMIT;
|
|
88
112
|
}
|
|
@@ -249,19 +273,23 @@ function usePaymentState({
|
|
|
249
273
|
});
|
|
250
274
|
return "error" in result ? null : result;
|
|
251
275
|
};
|
|
252
|
-
const { isIOS } = useIsMobile();
|
|
253
|
-
const openInWalletBrowser = (wallet, amountUsd) => {
|
|
276
|
+
const { isIOS, isAndroid } = useIsMobile();
|
|
277
|
+
const openInWalletBrowser = async (wallet, amountUsd) => {
|
|
254
278
|
const paymentState = pay.paymentState;
|
|
255
279
|
assert(
|
|
256
|
-
paymentState === "payment_unpaid",
|
|
257
|
-
`[OPEN IN WALLET BROWSER] paymentState is ${paymentState}, must be payment_unpaid`
|
|
280
|
+
paymentState === "preview" || paymentState === "unhydrated" || paymentState === "payment_unpaid",
|
|
281
|
+
`[OPEN IN WALLET BROWSER] paymentState is ${paymentState}, must be preview or unhydrated or payment_unpaid`
|
|
258
282
|
);
|
|
259
283
|
assert(
|
|
260
284
|
wallet.getDaimoPayDeeplink != null,
|
|
261
285
|
`openInWalletBrowser: missing deeplink for ${wallet.name}`
|
|
262
286
|
);
|
|
287
|
+
if (pay.paymentState !== "payment_unpaid") {
|
|
288
|
+
await pay.hydrateOrder();
|
|
289
|
+
}
|
|
263
290
|
const payId = writeDaimoPayOrderID(pay.order.id);
|
|
264
|
-
const
|
|
291
|
+
const platform2 = isIOS ? "ios" : isAndroid ? "android" : "other";
|
|
292
|
+
const deeplink = wallet.getDaimoPayDeeplink(payId, platform2);
|
|
265
293
|
if (!isIOS) {
|
|
266
294
|
window.open(deeplink, "_blank");
|
|
267
295
|
}
|
|
@@ -328,9 +356,16 @@ function usePaymentState({
|
|
|
328
356
|
[setRoute, pay, currPayParams]
|
|
329
357
|
);
|
|
330
358
|
const [tokenMode, setTokenMode] = useState("evm");
|
|
359
|
+
const topOptionsOrder = (() => {
|
|
360
|
+
const defaultOrder = DEFAULT_TOP_OPTIONS_ORDER;
|
|
361
|
+
const paymentOptions = buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions;
|
|
362
|
+
const found = getTopLevelOptions(paymentOptions);
|
|
363
|
+
return found.length ? found : defaultOrder;
|
|
364
|
+
})();
|
|
331
365
|
return {
|
|
332
366
|
buttonProps,
|
|
333
367
|
setButtonProps,
|
|
368
|
+
topOptionsOrder,
|
|
334
369
|
setPayId,
|
|
335
370
|
setPayParams,
|
|
336
371
|
tokenMode,
|