@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.
Files changed (62) hide show
  1. package/build/index.d.ts +23 -28
  2. package/build/package.json.js +2 -2
  3. package/build/src/assets/chains.js +18 -52
  4. package/build/src/assets/chains.js.map +1 -1
  5. package/build/src/assets/logos.js +76 -2
  6. package/build/src/assets/logos.js.map +1 -1
  7. package/build/src/components/Common/ConnectorList/index.js +21 -20
  8. package/build/src/components/Common/ConnectorList/index.js.map +1 -1
  9. package/build/src/components/Common/Modal/index.js +31 -8
  10. package/build/src/components/Common/Modal/index.js.map +1 -1
  11. package/build/src/components/Common/SelectAnotherMethodButton/index.js +4 -4
  12. package/build/src/components/Common/SelectAnotherMethodButton/index.js.map +1 -1
  13. package/build/src/components/DaimoPayButton/index.js +1 -2
  14. package/build/src/components/DaimoPayButton/index.js.map +1 -1
  15. package/build/src/components/DaimoPayModal/ConnectUsing.js +8 -6
  16. package/build/src/components/DaimoPayModal/ConnectUsing.js.map +1 -1
  17. package/build/src/components/DaimoPayModal/ConnectWithInjector/index.js +13 -9
  18. package/build/src/components/DaimoPayModal/ConnectWithInjector/index.js.map +1 -1
  19. package/build/src/components/DaimoPayModal/ConnectWithQRCode.js +17 -23
  20. package/build/src/components/DaimoPayModal/ConnectWithQRCode.js.map +1 -1
  21. package/build/src/components/DaimoPayModal/index.js +120 -41
  22. package/build/src/components/DaimoPayModal/index.js.map +1 -1
  23. package/build/src/components/Pages/Connectors/index.js +0 -2
  24. package/build/src/components/Pages/Connectors/index.js.map +1 -1
  25. package/build/src/components/Pages/MobileConnectors/index.js +62 -17
  26. package/build/src/components/Pages/MobileConnectors/index.js.map +1 -1
  27. package/build/src/components/Pages/SelectDepositAddressChain/index.js +9 -2
  28. package/build/src/components/Pages/SelectDepositAddressChain/index.js.map +1 -1
  29. package/build/src/components/Pages/SelectExchange/index.js +22 -6
  30. package/build/src/components/Pages/SelectExchange/index.js.map +1 -1
  31. package/build/src/components/Pages/SelectMethod/index.js +107 -26
  32. package/build/src/components/Pages/SelectMethod/index.js.map +1 -1
  33. package/build/src/components/Pages/SelectWalletAmount/index.js +11 -6
  34. package/build/src/components/Pages/SelectWalletAmount/index.js.map +1 -1
  35. package/build/src/components/Pages/WaitingExternal/index.js +88 -3
  36. package/build/src/components/Pages/WaitingExternal/index.js.map +1 -1
  37. package/build/src/constants/limits.js +4 -0
  38. package/build/src/constants/limits.js.map +1 -0
  39. package/build/src/constants/paymentOptions.js +61 -0
  40. package/build/src/constants/paymentOptions.js.map +1 -0
  41. package/build/src/constants/routes.js +0 -1
  42. package/build/src/constants/routes.js.map +1 -1
  43. package/build/src/constants/wallets.js +7 -0
  44. package/build/src/constants/wallets.js.map +1 -0
  45. package/build/src/hooks/useExternalPaymentOptions.js +19 -4
  46. package/build/src/hooks/useExternalPaymentOptions.js.map +1 -1
  47. package/build/src/hooks/usePaymentState.js +41 -6
  48. package/build/src/hooks/usePaymentState.js.map +1 -1
  49. package/build/src/localizations/locales/en-US.js +4 -1
  50. package/build/src/localizations/locales/en-US.js.map +1 -1
  51. package/build/src/localizations/locales/es-ES.js +4 -1
  52. package/build/src/localizations/locales/es-ES.js.map +1 -1
  53. package/build/src/localizations/locales/pt-BR.js +4 -1
  54. package/build/src/localizations/locales/pt-BR.js.map +1 -1
  55. package/build/src/payment/paymentFsm.js.map +1 -1
  56. package/build/src/wallets/useWallets.js +81 -8
  57. package/build/src/wallets/useWallets.js.map +1 -1
  58. package/build/src/wallets/walletConfigs.js +65 -76
  59. package/build/src/wallets/walletConfigs.js.map +1 -1
  60. package/package.json +2 -2
  61. package/build/src/components/Pages/DownloadApp/index.js +0 -35
  62. 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 { WALLET_ID_MOBILE_WALLETS } from '../../../wallets/useWallets.js';
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 { setChosenUsd, hydrateOrder } = useDaimoPay();
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
- await hydrateOrder();
38
- if (selectedWallet.id === WALLET_ID_MOBILE_WALLETS || selectedWallet.id === "world" && !isMobile) {
39
- setPendingConnectorId(selectedWallet.id);
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 { WALLET_ID_MOBILE_WALLETS } 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 { setChosenUsd, hydrateOrder } = 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 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 await hydrateOrder();\n if (\n selectedWallet.id === WALLET_ID_MOBILE_WALLETS ||\n (selectedWallet.id === \"world\" && !isMobile)\n ) {\n setPendingConnectorId(selectedWallet.id);\n setRoute(ROUTES.CONNECT);\n } else {\n 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,EAAA,MAAM,EAAE,YAAA,EAAc,YAAa,EAAA,GAAI,WAAY,EAAA,CAAA;AACnD,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,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;AACtB,IAAA,MAAM,YAAa,EAAA,CAAA;AACnB,IAAA,IACE,eAAe,EAAO,KAAA,wBAAA,IACrB,eAAe,EAAO,KAAA,OAAA,IAAW,CAAC,QACnC,EAAA;AACA,MAAA,qBAAA,CAAsB,eAAe,EAAE,CAAA,CAAA;AACvC,MAAA,QAAA,CAAS,OAAO,OAAO,CAAA,CAAA;AAAA,KAClB,MAAA;AACL,MAAA,mBAAA,CAAoB,gBAAgB,SAAS,CAAA,CAAA;AAAA,KAC/C;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
+ {"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__ */ jsx(ConnectWithQRCode, { externalUrl: externalURL ?? "" }) : /* @__PURE__ */ jsxs(PageContent, { children: [
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,4 @@
1
+ const DEFAULT_USD_LIMIT = 2e4;
2
+
3
+ export { DEFAULT_USD_LIMIT };
4
+ //# sourceMappingURL=limits.js.map
@@ -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 DOWNLOAD = \"download\",\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,UAAW,CAAA,GAAA,UAAA,CAAA;AACX,EAAAA,QAAA,gBAAiB,CAAA,GAAA,gBAAA,CAAA;AA5BP,EAAAA,OAAAA,OAAAA,CAAAA;AAAA,CAAA,EAAA,MAAA,IAAA,EAAA;;;;"}
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
- // Solana and ExternalChains are handled in the SelectMethod component.
9
- opt !== ExternalPaymentOptions.ExternalChains && opt !== ExternalPaymentOptions.Daimo
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
- const enabledExtPaymentOptions = filterIds || DEFAULT_EXTERNAL_PAYMENT_OPTIONS;
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 // Solana and ExternalChains are handled in the SelectMethod component.\n opt !== ExternalPaymentOptions.ExternalChains &&\n opt !== ExternalPaymentOptions.Daimo,\n);\n\nexport function useExternalPaymentOptions({\n trpc,\n filterIds,\n platform,\n usdRequired,\n mode,\n}: {\n trpc: TrpcClient;\n filterIds: 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} {\n const [options, setOptions] = useState<\n Map<\"external\" | \"zkp2p\" | \"exchange\", ExternalPaymentOptionMetadata[]>\n >(new Map());\n const [loading, setLoading] = useState(false);\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 // Filter out options not in options JSON\n const enabledExtPaymentOptions =\n filterIds || 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 };\n}\n"],"names":["mode"],"mappings":";;;AASA,MAAM,mCAAmC,MAAO,CAAA,MAAA;AAAA,EAC9C,sBAAA;AACF,CAAE,CAAA,MAAA;AAAA,EACA,CAAC,GAAA;AAAA;AAAA,IAEC,GAAQ,KAAA,sBAAA,CAAuB,cAC/B,IAAA,GAAA,KAAQ,sBAAuB,CAAA,KAAA;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,CAaE,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;AAE5C,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,MAAM,2BACJ,SAAa,IAAA,gCAAA,CAAA;AAEf,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,SAAS,OAAQ,EAAA,CAAA;AAC5B;;;;"}
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":"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"}
@@ -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 deeplink = wallet.getDaimoPayDeeplink(payId);
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,