@daimo/pay 1.1.5 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/build/index.d.ts +56 -122
  2. package/build/package.json.js +3 -4
  3. package/build/package.json.js.map +1 -1
  4. package/build/src/assets/icons.js +2 -1
  5. package/build/src/assets/icons.js.map +1 -1
  6. package/build/src/components/Common/AmountInput/AmountInputField.js +59 -0
  7. package/build/src/components/Common/AmountInput/AmountInputField.js.map +1 -0
  8. package/build/src/components/Common/AmountInput/index.js +147 -0
  9. package/build/src/components/Common/AmountInput/index.js.map +1 -0
  10. package/build/src/components/Common/ChainSelectList/index.js +1 -1
  11. package/build/src/components/Common/Modal/index.js +9 -4
  12. package/build/src/components/Common/Modal/index.js.map +1 -1
  13. package/build/src/components/Common/Modal/styles.js +2 -1
  14. package/build/src/components/Common/Modal/styles.js.map +1 -1
  15. package/build/src/components/Common/OptionsList/styles.js +1 -1
  16. package/build/src/components/Common/OrderHeader/index.js +22 -111
  17. package/build/src/components/Common/OrderHeader/index.js.map +1 -1
  18. package/build/src/components/Common/PaymentBreakdown/index.js +48 -0
  19. package/build/src/components/{Pages/WaitingOther → Common/PaymentBreakdown}/index.js.map +1 -1
  20. package/build/src/components/Common/SwitchButton/index.js +39 -0
  21. package/build/src/components/Common/SwitchButton/index.js.map +1 -0
  22. package/build/src/components/Common/TokenChainLogo/index.js +24 -0
  23. package/build/src/components/Common/TokenChainLogo/index.js.map +1 -0
  24. package/build/src/components/DaimoPay.js +49 -14
  25. package/build/src/components/DaimoPay.js.map +1 -1
  26. package/build/src/components/DaimoPayButton/index.js +31 -25
  27. package/build/src/components/DaimoPayButton/index.js.map +1 -1
  28. package/build/src/components/DaimoPayModal/index.js +102 -36
  29. package/build/src/components/DaimoPayModal/index.js.map +1 -1
  30. package/build/src/components/Pages/Confirmation/index.js +1 -1
  31. package/build/src/components/Pages/PayWithToken/index.js +5 -110
  32. package/build/src/components/Pages/PayWithToken/index.js.map +1 -1
  33. package/build/src/components/Pages/SelectAmount/index.js +16 -0
  34. package/build/src/components/Pages/SelectAmount/index.js.map +1 -0
  35. package/build/src/components/Pages/SelectDepositAddressAmount/index.js +61 -0
  36. package/build/src/components/Pages/SelectDepositAddressAmount/index.js.map +1 -0
  37. package/build/src/components/Pages/SelectDepositAddressChain/index.js +8 -2
  38. package/build/src/components/Pages/SelectDepositAddressChain/index.js.map +1 -1
  39. package/build/src/components/Pages/SelectExternalAmount/index.js +63 -0
  40. package/build/src/components/Pages/SelectExternalAmount/index.js.map +1 -0
  41. package/build/src/components/Pages/SelectMethod/index.js +22 -9
  42. package/build/src/components/Pages/SelectMethod/index.js.map +1 -1
  43. package/build/src/components/Pages/SelectToken/index.js +41 -41
  44. package/build/src/components/Pages/Solana/ConnectSolana/index.js +5 -2
  45. package/build/src/components/Pages/Solana/ConnectSolana/index.js.map +1 -1
  46. package/build/src/components/Pages/Solana/ConnectorSolana/index.js +13 -3
  47. package/build/src/components/Pages/Solana/ConnectorSolana/index.js.map +1 -1
  48. package/build/src/components/Pages/Solana/PayWithSolanaToken/index.js +13 -36
  49. package/build/src/components/Pages/Solana/PayWithSolanaToken/index.js.map +1 -1
  50. package/build/src/components/Pages/Solana/SelectSolanaAmount/index.js +16 -0
  51. package/build/src/components/Pages/Solana/SelectSolanaAmount/index.js.map +1 -0
  52. package/build/src/components/Pages/Solana/SelectSolanaToken/index.js +42 -21
  53. package/build/src/components/Pages/Solana/SelectSolanaToken/index.js.map +1 -1
  54. package/build/src/components/Pages/WaitingDepositAddress/index.js +1 -1
  55. package/build/src/components/Pages/WaitingExternal/index.js +53 -0
  56. package/build/src/components/Pages/WaitingExternal/index.js.map +1 -0
  57. package/build/src/components/Spinners/ExternalPaymentSpinner/index.js +20 -0
  58. package/build/src/components/Spinners/ExternalPaymentSpinner/index.js.map +1 -0
  59. package/build/src/components/Spinners/TokenLogoSpinner/index.js +13 -0
  60. package/build/src/components/Spinners/TokenLogoSpinner/index.js.map +1 -0
  61. package/build/src/components/Spinners/TokenLogoSpinner/styles.js +40 -0
  62. package/build/src/components/Spinners/TokenLogoSpinner/styles.js.map +1 -0
  63. package/build/src/components/Spinners/styles.js +32 -0
  64. package/build/src/components/Spinners/styles.js.map +1 -0
  65. package/build/src/hooks/useDaimoPayStatus.js +3 -16
  66. package/build/src/hooks/useDaimoPayStatus.js.map +1 -1
  67. package/build/src/hooks/useDepositAddressOptions.js +8 -5
  68. package/build/src/hooks/useDepositAddressOptions.js.map +1 -1
  69. package/build/src/hooks/useExternalPaymentOptions.js +7 -6
  70. package/build/src/hooks/useExternalPaymentOptions.js.map +1 -1
  71. package/build/src/hooks/useOrderUsdLimits.js +26 -0
  72. package/build/src/hooks/useOrderUsdLimits.js.map +1 -0
  73. package/build/src/hooks/usePayWithSolanaToken.js +4 -3
  74. package/build/src/hooks/usePayWithSolanaToken.js.map +1 -1
  75. package/build/src/hooks/usePayWithToken.js +7 -8
  76. package/build/src/hooks/usePayWithToken.js.map +1 -1
  77. package/build/src/hooks/usePaymentState.js +71 -32
  78. package/build/src/hooks/usePaymentState.js.map +1 -1
  79. package/build/src/hooks/useSolanaPaymentOptions.js +7 -5
  80. package/build/src/hooks/useSolanaPaymentOptions.js.map +1 -1
  81. package/build/src/hooks/useWalletPaymentOptions.js +9 -8
  82. package/build/src/hooks/useWalletPaymentOptions.js.map +1 -1
  83. package/build/src/index.js +1 -2
  84. package/build/src/index.js.map +1 -1
  85. package/build/src/utils/exports.js +4 -8
  86. package/build/src/utils/exports.js.map +1 -1
  87. package/build/src/utils/format.js +83 -0
  88. package/build/src/utils/format.js.map +1 -0
  89. package/build/src/utils/trpc.js +2 -1
  90. package/build/src/utils/trpc.js.map +1 -1
  91. package/build/src/utils/validateInput.js +36 -0
  92. package/build/src/utils/validateInput.js.map +1 -0
  93. package/package.json +3 -4
  94. package/build/src/components/Pages/WaitingOther/index.js +0 -91
  95. package/build/src/hooks/useModal.js +0 -35
  96. package/build/src/hooks/useModal.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Returns true if the value is a valid number.
3
+ * @param value The value to validate.
4
+ * @param maxDecimals The maximum number of decimal places.
5
+ * @returns True if the value is a valid number, false otherwise.
6
+ */
7
+ function isValidNumber(value, maxDecimals) {
8
+ if (value.length === 0) {
9
+ return false;
10
+ }
11
+ // Test that the value is digits, followed by an optional decimal, followed
12
+ // by more digits
13
+ const match = /^\d*\.?(\d*)$/.exec(value);
14
+ if (match == null)
15
+ return false;
16
+ // Check that the number of digits after the decimal is less than or equal to
17
+ // maxDecimals
18
+ return maxDecimals == null || match[1].length <= maxDecimals;
19
+ }
20
+ /**
21
+ * Sanitize a number input.
22
+ * - Remove all non-numeric and non-decimal characters
23
+ * - If the value is empty, return "0"
24
+ * - Parse into a number
25
+ * @param value The value to sanitize.
26
+ * @returns The sanitized value.
27
+ */
28
+ function sanitizeNumber(value) {
29
+ const cleaned = value.replace(/[^0-9.]/g, "");
30
+ if (!cleaned || cleaned === "." || !/^\d*\.?\d*$/.test(cleaned))
31
+ return "0";
32
+ return cleaned.startsWith(".") ? `0${cleaned}` : cleaned;
33
+ }
34
+
35
+ export { isValidNumber, sanitizeNumber };
36
+ //# sourceMappingURL=validateInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateInput.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@daimo/pay",
3
3
  "private": false,
4
- "version": "1.1.5",
4
+ "version": "1.3.0",
5
5
  "author": "Daimo",
6
6
  "homepage": "https://pay.daimo.com",
7
7
  "license": "BSD-2-Clause license",
@@ -40,8 +40,8 @@
40
40
  "crypto"
41
41
  ],
42
42
  "dependencies": {
43
- "@daimo/common": "1.1.0",
44
- "@daimo/contract": "1.1.0",
43
+ "@daimo/common": "1.2.0",
44
+ "@daimo/contract": "1.2.0",
45
45
  "@solana/wallet-adapter-base": "^0.9.23",
46
46
  "@solana/wallet-adapter-react": "^0.15.35",
47
47
  "@solana/web3.js": "^1.95.4",
@@ -67,7 +67,6 @@
67
67
  },
68
68
  "devDependencies": {
69
69
  "@rollup/plugin-json": "^6.1.0",
70
- "@rollup/plugin-node-resolve": "^13.1.3",
71
70
  "@types/node": "^20.14.12",
72
71
  "@types/qrcode": "^1.4.2",
73
72
  "@types/react": "^18.2.47",
@@ -1,91 +0,0 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useState, useEffect } from 'react';
3
- import { usePayContext, ROUTES } from '../../DaimoPay.js';
4
- import { PageContent, ModalContent, ModalH1, ModalBody } from '../../Common/Modal/styles.js';
5
- import { motion, AnimatePresence } from 'framer-motion';
6
- import { css } from 'styled-components';
7
- import { ExternalLinkIcon } from '../../../assets/icons.js';
8
- import styled from '../../../styles/styled/index.js';
9
- import Button from '../../Common/Button/index.js';
10
- import CircleSpinner from '../../Spinners/CircleSpinner/index.js';
11
- import SquircleSpinner from '../../Spinners/SquircleSpinner/index.js';
12
-
13
- const WaitingOther = () => {
14
- const context = usePayContext();
15
- const { triggerResize, paymentState, setRoute } = context;
16
- const trpc = context.trpc;
17
- const { selectedExternalOption, payWithExternal, paymentWaitingMessage, daimoPayOrder, } = paymentState;
18
- const [externalURL, setExternalURL] = useState(null);
19
- useEffect(() => {
20
- const checkForSourcePayment = async () => {
21
- if (!daimoPayOrder)
22
- return;
23
- const found = await trpc.findSourcePayment.query({
24
- orderId: daimoPayOrder.id.toString(),
25
- });
26
- if (found) {
27
- setRoute(ROUTES.CONFIRMATION);
28
- }
29
- };
30
- const interval = setInterval(checkForSourcePayment, 1000);
31
- return () => clearInterval(interval);
32
- }, [daimoPayOrder?.id]);
33
- useEffect(() => {
34
- if (!selectedExternalOption)
35
- return;
36
- payWithExternal(selectedExternalOption.id).then((url) => {
37
- setExternalURL(url);
38
- setTimeout(() => {
39
- window.open(url, "_blank");
40
- });
41
- });
42
- }, [selectedExternalOption]);
43
- const waitingMessageLength = paymentWaitingMessage?.length;
44
- useEffect(() => {
45
- triggerResize();
46
- }, [waitingMessageLength, externalURL]);
47
- if (!selectedExternalOption) {
48
- return jsx(PageContent, {});
49
- }
50
- const optionSpinner = (() => {
51
- if (selectedExternalOption.logoShape === "circle") {
52
- return (jsx(CircleSpinner, { logo: jsx("img", { src: selectedExternalOption.logoURI }), loading: true, unavailable: false }));
53
- }
54
- else {
55
- return (jsx(SquircleSpinner, { logo: jsx("img", { src: selectedExternalOption.logoURI }), loading: true }));
56
- }
57
- })();
58
- return (jsxs(PageContent, { children: [jsx(LoadingContainer, { children: jsx(AnimationContainer, { "$circle": selectedExternalOption.logoShape === "circle", children: jsx(AnimatePresence, { children: optionSpinner }) }) }), jsxs(ModalContent, { style: { marginLeft: 24, marginRight: 24 }, children: [jsx(ModalH1, { children: "Waiting for Payment" }), paymentWaitingMessage && (jsx(ModalBody, { style: { marginTop: 12, marginBottom: 12 }, children: paymentWaitingMessage }))] }), jsx(Button, { icon: jsx(ExternalLinkIcon, {}), onClick: () => {
59
- if (externalURL)
60
- window.open(externalURL, "_blank");
61
- }, children: "Open in New Tab" })] }));
62
- };
63
- const LoadingContainer = styled(motion.div) `
64
- display: flex;
65
- align-items: center;
66
- justify-content: center;
67
- margin: 10px auto 16px;
68
- height: 120px;
69
- `;
70
- const AnimationContainer = styled(motion.div) `
71
- user-select: none;
72
- position: relative;
73
- --spinner-error-opacity: 0;
74
- &:before {
75
- content: "";
76
- position: absolute;
77
- inset: 1px;
78
- opacity: 0;
79
- background: var(--ck-body-color-danger);
80
- ${(props) => props.$circle &&
81
- css `
82
- inset: -5px;
83
- border-radius: 50%;
84
- background: none;
85
- box-shadow: inset 0 0 0 3.5px var(--ck-body-color-danger);
86
- `}
87
- }
88
- `;
89
-
90
- export { LoadingContainer, WaitingOther as default };
91
- //# sourceMappingURL=index.js.map
@@ -1,35 +0,0 @@
1
- import { usePayContext, ROUTES } from '../components/DaimoPay.js';
2
- import { useConnectCallback } from './useConnectCallback.js';
3
-
4
- /** Opens and closes the payment modal. */
5
- const useModal = ({ onConnect, onDisconnect } = {}) => {
6
- const context = usePayContext();
7
- useConnectCallback({
8
- onConnect,
9
- onDisconnect,
10
- });
11
- const close = () => {
12
- context.setOpen(false);
13
- };
14
- const open = () => {
15
- context.setOpen(true);
16
- };
17
- const gotoAndOpen = (route) => {
18
- context.setRoute(route);
19
- open();
20
- };
21
- return {
22
- open: context.open,
23
- setOpen: (show) => {
24
- if (show) {
25
- gotoAndOpen(ROUTES.SELECT_METHOD);
26
- }
27
- else {
28
- close();
29
- }
30
- },
31
- };
32
- };
33
-
34
- export { useModal };
35
- //# sourceMappingURL=useModal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useModal.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}