@t402/react 2.0.0 → 2.3.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/README.md +167 -0
- package/dist/cjs/index.cjs +35 -27
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +5 -5
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js +35 -27
- package/dist/esm/index.js.map +1 -1
- package/package.json +7 -6
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# @t402/react
|
|
2
|
+
|
|
3
|
+
React components and hooks for the t402 Payment Protocol. Build payment-aware UIs with pre-built components and reactive hooks.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @t402/react
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { PaymentProvider, PaymentButton, usePaymentRequired } from "@t402/react";
|
|
15
|
+
|
|
16
|
+
function App() {
|
|
17
|
+
return (
|
|
18
|
+
<PaymentProvider>
|
|
19
|
+
<ProtectedContent />
|
|
20
|
+
</PaymentProvider>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function ProtectedContent() {
|
|
25
|
+
const { paymentRequired, requirements, pay, status } = usePaymentRequired("/api/data");
|
|
26
|
+
|
|
27
|
+
if (paymentRequired) {
|
|
28
|
+
return <PaymentButton requirements={requirements} onPay={pay} status={status} />;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return <div>Premium content loaded!</div>;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Components
|
|
36
|
+
|
|
37
|
+
### PaymentButton
|
|
38
|
+
|
|
39
|
+
Renders a payment action button with loading and status states.
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
import { PaymentButton } from "@t402/react";
|
|
43
|
+
|
|
44
|
+
<PaymentButton
|
|
45
|
+
requirements={requirements}
|
|
46
|
+
onPay={handlePay}
|
|
47
|
+
status={status}
|
|
48
|
+
/>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### PaymentDetails
|
|
52
|
+
|
|
53
|
+
Displays payment requirements (amount, network, recipient).
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
import { PaymentDetails } from "@t402/react";
|
|
57
|
+
|
|
58
|
+
<PaymentDetails requirements={requirements} />
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### PaymentStatusDisplay
|
|
62
|
+
|
|
63
|
+
Shows the current payment status with appropriate UI feedback.
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
import { PaymentStatusDisplay } from "@t402/react";
|
|
67
|
+
|
|
68
|
+
<PaymentStatusDisplay status={status} />
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### AddressDisplay
|
|
72
|
+
|
|
73
|
+
Renders a blockchain address with truncation and copy functionality.
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { AddressDisplay } from "@t402/react";
|
|
77
|
+
|
|
78
|
+
<AddressDisplay address="0x1234...5678" />
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Hooks
|
|
82
|
+
|
|
83
|
+
### usePaymentRequired
|
|
84
|
+
|
|
85
|
+
Detects 402 responses and extracts payment requirements.
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
const {
|
|
89
|
+
paymentRequired, // boolean - whether payment is needed
|
|
90
|
+
requirements, // PaymentRequirements[] from 402 response
|
|
91
|
+
pay, // () => Promise<void> - trigger payment
|
|
92
|
+
status, // PaymentStatus - current state
|
|
93
|
+
} = usePaymentRequired(url, options);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### usePaymentStatus
|
|
97
|
+
|
|
98
|
+
Tracks the lifecycle of a payment (idle, pending, confirming, complete, error).
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
const { status, error, reset } = usePaymentStatus();
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### useAsyncPayment
|
|
105
|
+
|
|
106
|
+
Manages async payment flows with automatic retry and status tracking.
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
const { execute, status, error } = useAsyncPayment(paymentFn);
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Provider
|
|
113
|
+
|
|
114
|
+
### PaymentProvider
|
|
115
|
+
|
|
116
|
+
Wraps your app to provide payment context to all child components.
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
import { PaymentProvider } from "@t402/react";
|
|
120
|
+
|
|
121
|
+
<PaymentProvider>
|
|
122
|
+
<App />
|
|
123
|
+
</PaymentProvider>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Access context directly with `usePaymentContext()`.
|
|
127
|
+
|
|
128
|
+
## Utilities
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import {
|
|
132
|
+
isEvmNetwork,
|
|
133
|
+
isSvmNetwork,
|
|
134
|
+
isTonNetwork,
|
|
135
|
+
getNetworkDisplayName,
|
|
136
|
+
truncateAddress,
|
|
137
|
+
formatTokenAmount,
|
|
138
|
+
choosePaymentRequirement,
|
|
139
|
+
} from "@t402/react";
|
|
140
|
+
|
|
141
|
+
// Network detection
|
|
142
|
+
isEvmNetwork("eip155:8453"); // true
|
|
143
|
+
|
|
144
|
+
// Display helpers
|
|
145
|
+
getNetworkDisplayName("eip155:8453"); // "Base"
|
|
146
|
+
truncateAddress("0x1234567890abcdef"); // "0x1234...cdef"
|
|
147
|
+
formatTokenAmount(1500000n, 6); // "1.50"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Peer Dependencies
|
|
151
|
+
|
|
152
|
+
- `react` ^18.0.0 || ^19.0.0
|
|
153
|
+
- `react-dom` ^18.0.0 || ^19.0.0
|
|
154
|
+
|
|
155
|
+
## Development
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
pnpm build # Build the package
|
|
159
|
+
pnpm test # Run unit tests
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Related Packages
|
|
163
|
+
|
|
164
|
+
- `@t402/core` - Core protocol types
|
|
165
|
+
- `@t402/vue` - Vue components & composables
|
|
166
|
+
- `@t402/paywall` - Universal paywall UI
|
|
167
|
+
- `@t402/fetch` - Fetch wrapper with automatic payment
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -22,15 +22,7 @@ function Spinner({ size = "md", className = "" }) {
|
|
|
22
22
|
};
|
|
23
23
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
24
24
|
/* @__PURE__ */ jsxRuntime.jsx("style", { children: `@keyframes t402-spin { to { transform: rotate(360deg); } }` }),
|
|
25
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
-
"span",
|
|
27
|
-
{
|
|
28
|
-
style: spinnerStyle,
|
|
29
|
-
className,
|
|
30
|
-
role: "status",
|
|
31
|
-
"aria-label": "Loading"
|
|
32
|
-
}
|
|
33
|
-
)
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: spinnerStyle, className, role: "status", "aria-label": "Loading" })
|
|
34
26
|
] });
|
|
35
27
|
}
|
|
36
28
|
var baseStyles = {
|
|
@@ -453,10 +445,32 @@ function AddressDisplay({
|
|
|
453
445
|
onClick: handleCopy,
|
|
454
446
|
style: copied ? copiedStyles : buttonStyles,
|
|
455
447
|
"aria-label": copied ? "Copied" : "Copy address",
|
|
456
|
-
children: copied ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
448
|
+
children: copied ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
449
|
+
"svg",
|
|
450
|
+
{
|
|
451
|
+
width: "16",
|
|
452
|
+
height: "16",
|
|
453
|
+
viewBox: "0 0 24 24",
|
|
454
|
+
fill: "none",
|
|
455
|
+
stroke: "currentColor",
|
|
456
|
+
strokeWidth: "2",
|
|
457
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" })
|
|
458
|
+
}
|
|
459
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
460
|
+
"svg",
|
|
461
|
+
{
|
|
462
|
+
width: "16",
|
|
463
|
+
height: "16",
|
|
464
|
+
viewBox: "0 0 24 24",
|
|
465
|
+
fill: "none",
|
|
466
|
+
stroke: "currentColor",
|
|
467
|
+
strokeWidth: "2",
|
|
468
|
+
children: [
|
|
469
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
|
|
470
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
|
|
471
|
+
]
|
|
472
|
+
}
|
|
473
|
+
)
|
|
460
474
|
}
|
|
461
475
|
)
|
|
462
476
|
] });
|
|
@@ -518,16 +532,13 @@ function usePaymentStatus() {
|
|
|
518
532
|
}, timeout);
|
|
519
533
|
}
|
|
520
534
|
}, []);
|
|
521
|
-
const setStatus = react.useCallback(
|
|
522
|
-
(newStatus
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
},
|
|
529
|
-
[]
|
|
530
|
-
);
|
|
535
|
+
const setStatus = react.useCallback((newStatus, messageText) => {
|
|
536
|
+
setStatusState(newStatus);
|
|
537
|
+
if (messageText) {
|
|
538
|
+
const type = newStatus === "error" ? "error" : newStatus === "success" ? "success" : "info";
|
|
539
|
+
setMessage({ text: messageText, type });
|
|
540
|
+
}
|
|
541
|
+
}, []);
|
|
531
542
|
const setSuccess = react.useCallback(
|
|
532
543
|
(text, timeout) => {
|
|
533
544
|
setStatusState("success");
|
|
@@ -632,10 +643,7 @@ function PaymentProvider({
|
|
|
632
643
|
}) {
|
|
633
644
|
const [state, setState] = react.useState(() => {
|
|
634
645
|
if (initialPaymentRequired) {
|
|
635
|
-
const selectedRequirement = choosePaymentRequirement(
|
|
636
|
-
initialPaymentRequired.accepts,
|
|
637
|
-
testnet
|
|
638
|
-
);
|
|
646
|
+
const selectedRequirement = choosePaymentRequirement(initialPaymentRequired.accepts, testnet);
|
|
639
647
|
const detectedTestnet = isTestnetNetwork(selectedRequirement.network);
|
|
640
648
|
return {
|
|
641
649
|
status: "idle",
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Spinner.tsx","../../src/components/PaymentButton.tsx","../../src/components/PaymentStatus.tsx","../../src/utils/index.ts","../../src/components/PaymentDetails.tsx","../../src/components/AddressDisplay.tsx","../../src/hooks/usePaymentRequired.ts","../../src/hooks/usePaymentStatus.ts","../../src/hooks/useAsyncPayment.ts","../../src/providers/PaymentProvider.tsx"],"names":["jsxs","Fragment","jsx","useState","useCallback","baseStyles","containerStyles","useRef","createContext","useMemo","useContext"],"mappings":";;;;;;AAGA,IAAM,WAAA,GAAc;AAAA,EAClB,IAAI,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,aAAa,CAAA,EAAE;AAAA,EAC5C,IAAI,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,aAAa,CAAA,EAAE;AAAA,EAC5C,IAAI,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,aAAa,CAAA;AAC5C,CAAA;AAsBO,SAAS,QAAQ,EAAE,IAAA,GAAO,IAAA,EAAM,SAAA,GAAY,IAAG,EAAiB;AACrE,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAY,GAAI,YAAY,IAAI,CAAA;AAEvD,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,EAAQ,GAAG,WAAW,CAAA,gBAAA,CAAA;AAAA,IACtB,cAAA,EAAgB,SAAA;AAAA,IAChB,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW,gCAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,uBACEA,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,WACE,QAAA,EAAA,CAAA,0DAAA,CAAA,EACH,CAAA;AAAA,oBACAA,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,YAAA;AAAA,QACP,SAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW;AAAA;AAAA;AACb,GAAA,EACF,CAAA;AAEJ;ACnDA,IAAM,UAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,gBAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,aAAA,GAAqD;AAAA,EACzD,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,SAAA,EAAW;AAAA,IACT,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,aAAA;AAAA,IACjB,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEA,IAAM,UAAA,GAAkD;AAAA,EACtD,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,UAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,WAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,WAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAkCO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,SAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO;AACT,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,WAAA,GAAcC,kBAAY,YAAY;AAC1C,IAAA,IAAI,QAAA,IAAY,OAAA,IAAW,CAAC,OAAA,EAAS;AACrC,IAAA,MAAM,OAAA,EAAQ;AAAA,EAChB,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/B,EAAA,MAAM,aAAa,QAAA,IAAY,OAAA;AAE/B,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,GAAG,UAAA;AAAA,IACH,GAAG,cAAc,OAAO,CAAA;AAAA,IACxB,GAAG,WAAW,IAAI,CAAA;AAAA,IAClB,GAAI,UAAA,GAAa,cAAA,GAAiB,EAAC;AAAA,IACnC,GAAI,SAAA,IAAa,CAAC,UAAA,GACd,EAAE,QAAQ,iBAAA,EAAmB,SAAA,EAAW,kBAAA,EAAmB,GAC3D;AAAC,GACP;AAEA,EAAA,uBACEJ,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU,UAAA;AAAA,MACV,SAAA;AAAA,MACA,KAAA,EAAO,cAAA;AAAA,MACP,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,MACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,MAErC,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAWE,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,CAAA;AAAA,QAC9B;AAAA;AAAA;AAAA,GACH;AAEJ;AC3HA,IAAM,YAAA,GAAoD;AAAA,EACxD,IAAA,EAAM;AAAA,IACJ,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEA,IAAMG,WAAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,WAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,WAAA;AAAA,EACR,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,KAAA,GAAgC;AAAA,EACpC,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAwBO,SAAS,cAAc,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAA,GAAY,IAAG,EAAuB;AACrF,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAM,CAAA,IAAK,YAAA,CAAa,IAAA;AAEzD,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,OAAA,EAAS,oBAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAA,IAAW,eAAA,CAAgB,MAAM,CAAA;AAExD,EAAA,uBACEL,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,GAAGK,WAAAA,EAAY,GAAG,WAAA,EAAY;AAAA,MACvC,SAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,MAAA,KAAW,4BACVH,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAK,CAAA,mBAEnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,QAAA,EAAU,QAAO,EAAI,QAAA,EAAA,KAAA,CAAM,MAAM,CAAA,EAAE,CAAA;AAAA,wBAEpDA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,cAAA,EAAe;AAAA;AAAA;AAAA,GACxB;AAEJ;;;ACzFO,IAAM,aAAA,GAAgB;AAAA,EAC3B,gBAAA,EAAkB,GAAA;AAAA,EAClB,YAAA,EAAc,MAAA;AAAA,EACd,YAAA,EAAc,OAAA;AAAA,EACd,gBAAA,EAAkB,OAAA;AAAA,EAClB,gBAAA,EAAkB;AACpB;AAGO,IAAM,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAAS,kCAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAGO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,MAAA;AAAA,EACT,OAAA,EAAS;AACX;AAGO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ;AACV;AAQO,SAAS,6BACd,mBAAA,EACuB;AACvB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AACtC,IAAA,OAAO,mBAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAC,mBAAmB,CAAA;AAC7B;AAQO,SAAS,qBAAqB,OAAA,EAA4B;AAC/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO;AAAA,MACL,CAAA,OAAA,EAAU,cAAc,YAAY,CAAA,CAAA;AAAA,MACpC,CAAA,OAAA,EAAU,cAAc,gBAAgB,CAAA,CAAA;AAAA,MACxC,CAAA,OAAA,EAAU,oBAAoB,MAAM,CAAA;AAAA,KACtC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,CAAA,OAAA,EAAU,cAAc,YAAY,CAAA,CAAA;AAAA,IACpC,CAAA,OAAA,EAAU,cAAc,gBAAgB,CAAA,CAAA;AAAA,IACxC,CAAA,OAAA,EAAU,oBAAoB,OAAO,CAAA;AAAA,GACvC;AACF;AASO,SAAS,wBAAA,CACd,qBACA,OAAA,EACqB;AACrB,EAAA,MAAM,UAAA,GAAa,6BAA6B,mBAAmB,CAAA;AACnE,EAAA,MAAM,iBAAA,GAAoB,qBAAqB,OAAO,CAAA;AAEtD,EAAA,KAAA,MAAW,oBAAoB,iBAAA,EAAmB;AAChD,IAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,YAAY,gBAAgB,CAAA;AACrE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,WAAW,CAAC,CAAA;AACrB;AAQO,SAAS,aAAa,OAAA,EAA0B;AACrD,EAAA,OAAO,OAAA,CAAQ,WAAW,SAAS,CAAA;AACrC;AAQO,SAAS,aAAa,OAAA,EAA0B;AACrD,EAAA,OAAO,OAAA,CAAQ,WAAW,SAAS,CAAA;AACrC;AAQO,SAAS,aAAa,OAAA,EAA0B;AACrD,EAAA,OAAO,OAAA,CAAQ,WAAW,MAAM,CAAA;AAClC;AAQO,SAAS,cAAc,OAAA,EAA0B;AACtD,EAAA,OAAO,OAAA,CAAQ,WAAW,OAAO,CAAA;AACnC;AAGA,IAAM,eAAA,GAA0C;AAAA,EAC9C,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,kBAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAQO,SAAS,sBAAsB,OAAA,EAAyB;AAC7D,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,OAAO,eAAA,CAAgB,OAAO,CAAA,IAAK,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,OAAO,GAAA,KAAQ,mBAAA,CAAoB,MAAA,GAAS,eAAA,GAAkB,QAAA;AAAA,EAChE;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,OAAO,GAAA,KAAQ,gBAAA,CAAiB,OAAA,GAAU,aAAA,GAAgB,KAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,IAAI,GAAA,KAAQ,iBAAA,CAAkB,IAAA,EAAM,OAAO,WAAA;AAC3C,IAAA,IAAI,GAAA,KAAQ,iBAAA,CAAkB,MAAA,EAAQ,OAAO,aAAA;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAGA,IAAM,iBAAA,uBAAwB,GAAA,CAAI,CAAC,SAAS,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,IAAI,CAAC,CAAA;AAQzE,SAAS,iBAAiB,OAAA,EAA0B;AACzD,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,OAAO,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,OAAO,QAAQ,mBAAA,CAAoB,MAAA;AAAA,EACrC;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,OAAO,QAAQ,gBAAA,CAAiB,OAAA;AAAA,EAClC;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,IAAA,OAAO,GAAA,KAAQ,iBAAA,CAAkB,IAAA,IAAQ,GAAA,KAAQ,iBAAA,CAAkB,MAAA;AAAA,EACrE;AAEA,EAAA,OAAO,KAAA;AACT;AAUO,SAAS,eAAA,CAAgB,OAAA,EAAiB,UAAA,GAAa,CAAA,EAAG,WAAW,CAAA,EAAW;AACrF,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,UAAA,GAAa,QAAA,GAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAQ,CAAC,CAAA,CAAA;AACtE;AAUO,SAAS,iBAAA,CAAkB,MAAA,EAAgB,QAAA,GAAW,CAAA,EAAG,cAAc,CAAA,EAAW;AACvF,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAM,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,EAAA,IAAM,QAAQ,CAAA;AACrC,EAAA,MAAM,cAAc,KAAA,GAAQ,OAAA;AAC5B,EAAA,MAAM,iBAAiB,KAAA,GAAQ,OAAA;AAE/B,EAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,IAAA,OAAO,YAAY,QAAA,EAAS;AAAA,EAC9B;AAEA,EAAA,MAAM,gBAAgB,cAAA,CAAe,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,GAAG,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,cAAc,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAErE,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,YAAY,QAAA,EAAS;AAAA,EAC9B;AAEA,EAAA,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAClC;AAQO,SAAS,oBAAoB,KAAA,EAAuB;AACzD,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAM,WAAA,EAAY;AAAA;AAE/B;ACtQA,IAAM,eAAA,GAAuC;AAAA,EAC3C,eAAA,EAAiB,SAAA;AAAA,EACjB,YAAA,EAAc,MAAA;AAAA,EACd,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,SAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,cAAA,EAAgB,eAAA;AAAA,EAChB,UAAA,EAAY,QAAA;AAAA,EACZ,OAAA,EAAS,OAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,GAAG,SAAA;AAAA,EACH,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAwBO,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,SAAA,GAAY,IAAA;AAAA,EACZ,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,WAAA,CAAY,MAAM,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,WAAA,CAAY,KAAK,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,WAAA,CAAY,OAAO,CAAA;AAC7D,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,WAAA,CAAY,KAAK,CAAA;AAE1D,EAAA,uBACEF,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAiB,SAAA,EAE3B,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,SAAA,EACV,QAAA,EAAA;AAAA,sBAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAa,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBAChCF,eAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,YAAA,EACV,QAAA,EAAA;AAAA,QAAA,eAAA;AAAA,QAAgB,GAAA;AAAA,QAAE;AAAA,OAAA,EACrB;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,WAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,SAAA,EACV,QAAA,EAAA;AAAA,sBAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAa,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,sBACjCA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACzC,CAAA;AAAA,IAID,SAAA,oBACCF,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,SAAA,EACV,QAAA,EAAA;AAAA,sBAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAa,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,sBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EACvC,CAAA;AAAA,IAID,aAAA,oBACCF,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAa,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,sBACnCA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,WAAA,EAAa,UAAA,EAAY,WAAA,EAAY,EAAG,KAAA,EAAO,WAAA,CAAY,OAC1E,QAAA,EAAA,gBAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjHA,IAAMI,gBAAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY,WAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,UAAA,EAAY,MAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,KAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,KAAA,EAAO,SAAA;AAAA,EACP,UAAA,EAAY,gBAAA;AAAA,EACZ,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,GAAG,YAAA;AAAA,EACH,KAAA,EAAO;AACT,CAAA;AAwBO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,UAAA,GAAa,CAAA;AAAA,EACb,QAAA,GAAW,CAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,eAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAA;AAEpE,EAAA,MAAM,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,MAAA,QAAA,CAAS,KAAA,GAAQ,OAAA;AACjB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,MAAA,QAAA,CAAS,MAAA,EAAO;AAChB,MAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACEJ,eAAAA,CAAC,MAAA,EAAA,EAAK,OAAOM,gBAAAA,EAAiB,SAAA,EAAsB,OAAO,OAAA,EACzD,QAAA,EAAA;AAAA,oBAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAA,EAAgB,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,IAC3C,4BACCA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,KAAA,EAAO,SAAS,YAAA,GAAe,YAAA;AAAA,QAC/B,YAAA,EAAY,SAAS,QAAA,GAAW,cAAA;AAAA,QAE/B,mCACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAC5F,QAAA,kBAAAA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAiB,CAAA,EACpC,CAAA,mBAEAF,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,0BAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,0BACvDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,SAAA,EACpE;AAAA;AAAA;AAEJ,GAAA,EAEJ,CAAA;AAEJ;ACtDO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAA6B;AACpG,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,OAAA;AAE/B,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,eAAiC,IAAI,CAAA;AACnF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAwB,MAAM,CAAA;AAC1D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,aAAA,GAAgBC,iBAAAA;AAAA,IACpB,OAAO,KAAa,YAAA,KAAyD;AAC3E,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAEvB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAE9C,QAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,UAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,UAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,UAAA,SAAA,CAAU,MAAM,CAAA;AAChB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,SAAA,CAAU,SAAS,CAAA;AACnB,UAAA,SAAA,GAAY,QAAQ,CAAA;AACpB,UAAA,OAAO,QAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACjE,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AAC1D,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,OAAA,GAAU,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAC9D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW,OAAO;AAAA,GACrB;AAEA,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACrCO,SAAS,gBAAA,GAA2C;AACzD,EAAA,MAAM,CAAC,MAAA,EAAQ,cAAc,CAAA,GAAID,eAAwB,MAAM,CAAA;AAC/D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA+B,IAAI,CAAA;AAEjE,EAAA,MAAM,oBAAA,GAAuBC,iBAAAA,CAAY,CAAC,OAAA,KAAqB;AAC7D,IAAA,IAAI,OAAA,IAAW,UAAU,CAAA,EAAG;AAC1B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB,GAAG,OAAO,CAAA;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,iBAAAA;AAAA,IAChB,CAAC,WAA0B,WAAA,KAAyB;AAClD,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,OAAO,SAAA,KAAc,OAAA,GAAU,OAAA,GAAU,SAAA,KAAc,YAAY,SAAA,GAAY,MAAA;AACrF,QAAA,UAAA,CAAW,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,MACxC;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAAA;AAAA,IACjB,CAAC,MAAc,OAAA,KAAqB;AAClC,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAC7C,MAAA,oBAAA,CAAqB,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,QAAA,GAAWA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AAC7C,IAAA,cAAA,CAAe,OAAO,CAAA;AACtB,IAAA,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,iBAAAA;AAAA,IACd,CAAC,MAAc,OAAA,KAAqB;AAClC,MAAA,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAC1C,MAAA,oBAAA,CAAqB,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAAA;AAAA,IACjB,CAAC,MAAc,OAAA,KAAqB;AAClC,MAAA,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAC7C,MAAA,oBAAA,CAAqB,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AClFO,SAAS,gBAAmB,OAAA,EAA8D;AAC/F,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,SAAQ,GAAI,OAAA;AAEnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAwB,MAAM,CAAA;AAC1D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAmB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,YAAA,GAAeI,aAAO,IAAI,CAAA;AAEhC,EAAA,MAAM,OAAA,GAAUH,kBAAY,YAA+B;AACzD,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,IAAU;AAEV,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,EAAU;AAEtC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,SAAA,CAAU,aAAa,CAAA;AACvB,QAAA,SAAA,CAAU,SAAS,CAAA;AACnB,QAAA,SAAA,GAAY,aAAa,CAAA;AAAA,MAC3B;AAEA,MAAA,OAAO,aAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AAE1D,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAEA,MAAA,OAAA,GAAU,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,MAAA,KAAW,SAAA;AAAA,IACtB,WAAW,MAAA,KAAW,SAAA;AAAA,IACtB,SAAS,MAAA,KAAW,OAAA;AAAA,IACpB;AAAA,GACF;AACF;AC3GA,IAAM,YAAA,GAA6B;AAAA,EACjC,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,eAAA,EAAiB,IAAA;AAAA,EACjB,mBAAA,EAAqB,IAAA;AAAA,EACrB,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,cAAA,GAAiBI,oBAA0C,IAAI;AAqB9D,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,sBAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAuB,MAAM;AACrD,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,MAAM,mBAAA,GAAsB,wBAAA;AAAA,QAC1B,sBAAA,CAAuB,OAAA;AAAA,QACvB;AAAA,OACF;AACA,MAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,mBAAA,CAAoB,OAAO,CAAA;AAEpE,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,IAAA;AAAA,QACP,eAAA,EAAiB,sBAAA;AAAA,QACjB,mBAAA;AAAA,QACA,WAAW,OAAA,IAAW;AAAA,OACxB;AAAA,IACF;AACA,IAAA,OAAO,EAAE,GAAG,YAAA,EAAc,SAAA,EAAW,OAAA,EAAQ;AAAA,EAC/C,CAAC,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqBC,iBAAAA;AAAA,IACzB,CAAC,IAAA,KAA0B;AACzB,MAAA,MAAM,mBAAA,GAAsB,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,MAAM,SAAS,CAAA;AAClF,MAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,mBAAA,CAAoB,OAAO,CAAA;AAEpE,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,QAChB,GAAG,IAAA;AAAA,QACH,eAAA,EAAiB,IAAA;AAAA,QACjB,mBAAA;AAAA,QACA,SAAA,EAAW,KAAK,SAAA,IAAa,eAAA;AAAA,QAC7B,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,GAClB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CAAC,WAAA,KAAqC;AAC1E,IAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,MAChB,GAAG,IAAA;AAAA,MACH,mBAAA,EAAqB,WAAA;AAAA,MACrB,SAAA,EAAW,gBAAA,CAAiB,WAAA,CAAY,OAAO;AAAA,KACjD,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,iBAAAA,CAAY,CAAC,MAAA,KAA0B;AACvD,IAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,MAChB,GAAG,IAAA;AAAA,MACH,MAAA;AAAA,MACA,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,IAAA,CAAK,KAAA,GAAQ;AAAA,KAC3C,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,iBAAAA,CAAY,CAAC,KAAA,KAAyB;AACrD,IAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,MAChB,GAAG,IAAA;AAAA,MACH,KAAA;AAAA,MACA,MAAA,EAAQ,KAAA,GAAQ,OAAA,GAAU,IAAA,CAAK;AAAA,KACjC,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,EAAE,GAAG,YAAA,EAAc,SAAA,EAAW,SAAS,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,KAAA,GAAQK,aAAA;AAAA,IACZ,OAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,kBAAA,EAAoB,iBAAA,EAAmB,SAAA,EAAW,UAAU,KAAK;AAAA,GAC3E;AAEA,EAAA,uBAAOP,cAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAe,QAAA,EAAS,CAAA;AAC1D;AAwBO,SAAS,iBAAA,GAAyC;AACvD,EAAA,MAAM,OAAA,GAAUQ,iBAAW,cAAc,CAAA;AAEzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,OAAA;AACT","file":"index.cjs","sourcesContent":["import React from \"react\";\nimport type { SpinnerProps } from \"../types/index.js\";\n\nconst sizeClasses = {\n sm: { width: 16, height: 16, borderWidth: 2 },\n md: { width: 24, height: 24, borderWidth: 3 },\n lg: { width: 32, height: 32, borderWidth: 4 },\n};\n\n/**\n * A simple loading spinner component.\n *\n * @param props - Component props.\n * @returns The spinner element.\n *\n * @example\n * ```tsx\n * import { Spinner } from \"@t402/react\";\n *\n * function LoadingState() {\n * return (\n * <div>\n * <Spinner size=\"md\" />\n * <span>Loading...</span>\n * </div>\n * );\n * }\n * ```\n */\nexport function Spinner({ size = \"md\", className = \"\" }: SpinnerProps) {\n const { width, height, borderWidth } = sizeClasses[size];\n\n const spinnerStyle: React.CSSProperties = {\n width,\n height,\n border: `${borderWidth}px solid #e5e7eb`,\n borderTopColor: \"#3b82f6\",\n borderRadius: \"50%\",\n animation: \"t402-spin 0.8s linear infinite\",\n display: \"inline-block\",\n };\n\n return (\n <>\n <style>\n {`@keyframes t402-spin { to { transform: rotate(360deg); } }`}\n </style>\n <span\n style={spinnerStyle}\n className={className}\n role=\"status\"\n aria-label=\"Loading\"\n />\n </>\n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport type { PaymentButtonProps } from \"../types/index.js\";\nimport { Spinner } from \"./Spinner.js\";\n\nconst baseStyles: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n fontWeight: 600,\n borderRadius: \"8px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n border: \"none\",\n fontFamily: \"inherit\",\n};\n\nconst variantStyles: Record<string, React.CSSProperties> = {\n primary: {\n backgroundColor: \"#2563eb\",\n color: \"#ffffff\",\n },\n secondary: {\n backgroundColor: \"#6b7280\",\n color: \"#ffffff\",\n },\n outline: {\n backgroundColor: \"transparent\",\n color: \"#2563eb\",\n border: \"2px solid #2563eb\",\n },\n};\n\nconst sizeStyles: Record<string, React.CSSProperties> = {\n sm: {\n padding: \"8px 16px\",\n fontSize: \"14px\",\n },\n md: {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n },\n lg: {\n padding: \"16px 32px\",\n fontSize: \"18px\",\n },\n};\n\nconst disabledStyles: React.CSSProperties = {\n opacity: 0.6,\n cursor: \"not-allowed\",\n};\n\n/**\n * A payment button component with loading state support.\n *\n * @param props - Component props.\n * @returns The button element.\n *\n * @example\n * ```tsx\n * import { PaymentButton } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [loading, setLoading] = useState(false);\n *\n * const handlePayment = async () => {\n * setLoading(true);\n * await processPayment();\n * setLoading(false);\n * };\n *\n * return (\n * <PaymentButton\n * onClick={handlePayment}\n * loading={loading}\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * );\n * }\n * ```\n */\nexport function PaymentButton({\n onClick,\n disabled = false,\n loading = false,\n children = \"Pay Now\",\n className = \"\",\n variant = \"primary\",\n size = \"md\",\n}: PaymentButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (disabled || loading || !onClick) return;\n await onClick();\n }, [disabled, loading, onClick]);\n\n const isDisabled = disabled || loading;\n\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...(isDisabled ? disabledStyles : {}),\n ...(isHovered && !isDisabled\n ? { filter: \"brightness(1.1)\", transform: \"translateY(-1px)\" }\n : {}),\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n className={className}\n style={combinedStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {loading && <Spinner size=\"sm\" />}\n {children}\n </button>\n );\n}\n","import React from \"react\";\nimport type { PaymentStatusProps } from \"../types/index.js\";\nimport { Spinner } from \"./Spinner.js\";\n\nconst statusStyles: Record<string, React.CSSProperties> = {\n idle: {\n backgroundColor: \"#f3f4f6\",\n color: \"#374151\",\n borderColor: \"#d1d5db\",\n },\n loading: {\n backgroundColor: \"#eff6ff\",\n color: \"#1d4ed8\",\n borderColor: \"#93c5fd\",\n },\n success: {\n backgroundColor: \"#f0fdf4\",\n color: \"#166534\",\n borderColor: \"#86efac\",\n },\n error: {\n backgroundColor: \"#fef2f2\",\n color: \"#dc2626\",\n borderColor: \"#fca5a5\",\n },\n};\n\nconst baseStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 16px\",\n borderRadius: \"8px\",\n border: \"1px solid\",\n fontSize: \"14px\",\n fontWeight: 500,\n};\n\nconst icons: Record<string, string> = {\n idle: \"○\",\n loading: \"\",\n success: \"✓\",\n error: \"✕\",\n};\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @param props - Component props.\n * @returns The status display element.\n *\n * @example\n * ```tsx\n * import { PaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [status, setStatus] = useState(\"idle\");\n *\n * return (\n * <PaymentStatus\n * status={status}\n * message={status === \"loading\" ? \"Processing payment...\" : undefined}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentStatus({ status, message, className = \"\" }: PaymentStatusProps) {\n const statusStyle = statusStyles[status] || statusStyles.idle;\n\n const defaultMessages: Record<string, string> = {\n idle: \"Ready to pay\",\n loading: \"Processing...\",\n success: \"Payment successful\",\n error: \"Payment failed\",\n };\n\n const displayMessage = message || defaultMessages[status];\n\n return (\n <div\n style={{ ...baseStyles, ...statusStyle }}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n >\n {status === \"loading\" ? (\n <Spinner size=\"sm\" />\n ) : (\n <span style={{ fontSize: \"16px\" }}>{icons[status]}</span>\n )}\n <span>{displayMessage}</span>\n </div>\n );\n}\n","import type { PaymentRequirements } from \"@t402/core/types\";\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: \"1\",\n BASE_MAINNET: \"8453\",\n BASE_SEPOLIA: \"84532\",\n ARBITRUM_MAINNET: \"42161\",\n ARBITRUM_SEPOLIA: \"421614\",\n} as const;\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: \"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n DEVNET: \"EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n} as const;\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: \"-239\",\n TESTNET: \"-3\",\n} as const;\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: \"mainnet\",\n NILE: \"nile\",\n SHASTA: \"shasta\",\n} as const;\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements;\n }\n return [paymentRequirements];\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ];\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ];\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements);\n const preferredNetworks = getPreferredNetworks(testnet);\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find(req => req.network === preferredNetwork);\n if (match) {\n return match;\n }\n }\n\n return normalized[0];\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith(\"eip155:\");\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith(\"solana:\");\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith(\"ton:\");\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith(\"tron:\");\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n \"1\": \"Ethereum\",\n \"10\": \"Optimism\",\n \"137\": \"Polygon\",\n \"8453\": \"Base\",\n \"42161\": \"Arbitrum One\",\n \"84532\": \"Base Sepolia\",\n \"421614\": \"Arbitrum Sepolia\",\n \"11155111\": \"Sepolia\",\n};\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`;\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET ? \"Solana Devnet\" : \"Solana\";\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET ? \"TON Testnet\" : \"TON\";\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n if (ref === TRON_NETWORK_REFS.NILE) return \"TRON Nile\";\n if (ref === TRON_NETWORK_REFS.SHASTA) return \"TRON Shasta\";\n return \"TRON\";\n }\n\n return network;\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set([\"84532\", \"421614\", \"11155111\", \"80001\", \"97\"]);\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return TESTNET_CHAIN_IDS.has(chainId);\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET;\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET;\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA;\n }\n\n return false;\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const integerPart = value / divisor;\n const fractionalPart = value % divisor;\n\n if (fractionalPart === 0n) {\n return integerPart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, \"\");\n\n if (trimmed === \"\") {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmed}`;\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase();\n\n switch (assetLower) {\n case \"usdt\":\n return \"USDT\";\n case \"usdt0\":\n return \"USDT0\";\n case \"usdc\":\n return \"USDC\";\n default:\n return asset.toUpperCase();\n }\n}\n","import React from \"react\";\nimport type { PaymentDetailsProps } from \"../types/index.js\";\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from \"../utils/index.js\";\n\nconst containerStyles: React.CSSProperties = {\n backgroundColor: \"#f9fafb\",\n borderRadius: \"12px\",\n padding: \"16px\",\n border: \"1px solid #e5e7eb\",\n};\n\nconst rowStyles: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 0\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst lastRowStyles: React.CSSProperties = {\n ...rowStyles,\n borderBottom: \"none\",\n};\n\nconst labelStyles: React.CSSProperties = {\n color: \"#6b7280\",\n fontSize: \"14px\",\n};\n\nconst valueStyles: React.CSSProperties = {\n color: \"#111827\",\n fontSize: \"14px\",\n fontWeight: 500,\n};\n\nconst amountStyles: React.CSSProperties = {\n color: \"#111827\",\n fontSize: \"20px\",\n fontWeight: 700,\n};\n\n/**\n * A component to display payment requirement details.\n *\n * @param props - Component props.\n * @returns The payment details element.\n *\n * @example\n * ```tsx\n * import { PaymentDetails } from \"@t402/react\";\n *\n * function PaymentFlow({ requirement }) {\n * return (\n * <PaymentDetails\n * requirement={requirement}\n * showNetwork={true}\n * showAsset={true}\n * showRecipient={true}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentDetails({\n requirement,\n showNetwork = true,\n showAsset = true,\n showRecipient = false,\n className = \"\",\n}: PaymentDetailsProps) {\n const formattedAmount = formatTokenAmount(requirement.amount);\n const assetName = getAssetDisplayName(requirement.asset);\n const networkName = getNetworkDisplayName(requirement.network);\n const truncatedAddress = truncateAddress(requirement.payTo);\n\n return (\n <div style={containerStyles} className={className}>\n {/* Amount row - always shown */}\n <div style={rowStyles}>\n <span style={labelStyles}>Amount</span>\n <span style={amountStyles}>\n {formattedAmount} {assetName}\n </span>\n </div>\n\n {/* Network row */}\n {showNetwork && (\n <div style={rowStyles}>\n <span style={labelStyles}>Network</span>\n <span style={valueStyles}>{networkName}</span>\n </div>\n )}\n\n {/* Asset row */}\n {showAsset && (\n <div style={rowStyles}>\n <span style={labelStyles}>Asset</span>\n <span style={valueStyles}>{assetName}</span>\n </div>\n )}\n\n {/* Recipient row */}\n {showRecipient && (\n <div style={lastRowStyles}>\n <span style={labelStyles}>Recipient</span>\n <span style={{ ...valueStyles, fontFamily: \"monospace\" }} title={requirement.payTo}>\n {truncatedAddress}\n </span>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport type { AddressDisplayProps } from \"../types/index.js\";\nimport { truncateAddress } from \"../utils/index.js\";\n\nconst containerStyles: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n};\n\nconst addressStyles: React.CSSProperties = {\n color: \"#374151\",\n};\n\nconst buttonStyles: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n borderRadius: \"4px\",\n color: \"#6b7280\",\n transition: \"all 0.15s ease\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n};\n\nconst copiedStyles: React.CSSProperties = {\n ...buttonStyles,\n color: \"#22c55e\",\n};\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @param props - Component props.\n * @returns The address display element.\n *\n * @example\n * ```tsx\n * import { AddressDisplay } from \"@t402/react\";\n *\n * function WalletInfo() {\n * return (\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable={true}\n * startChars={6}\n * endChars={4}\n * />\n * );\n * }\n * ```\n */\nexport function AddressDisplay({\n address,\n startChars = 6,\n endChars = 4,\n copyable = false,\n className = \"\",\n}: AddressDisplayProps) {\n const [copied, setCopied] = useState(false);\n\n const displayAddress = truncateAddress(address, startChars, endChars);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = address;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [address]);\n\n return (\n <span style={containerStyles} className={className} title={address}>\n <span style={addressStyles}>{displayAddress}</span>\n {copyable && (\n <button\n type=\"button\"\n onClick={handleCopy}\n style={copied ? copiedStyles : buttonStyles}\n aria-label={copied ? \"Copied\" : \"Copy address\"}\n >\n {copied ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )}\n </button>\n )}\n </span>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { PaymentRequired } from \"@t402/core/types\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void;\n /** Callback when payment fails */\n onError?: (error: Error) => void;\n}\n\ninterface UsePaymentRequiredResult {\n /** The payment required data from a 402 response */\n paymentRequired: PaymentRequired | null;\n /** Current status of the fetch operation */\n status: PaymentStatus;\n /** Error message if status is 'error' */\n error: string | null;\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Hook to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```tsx\n * import { usePaymentRequired } from \"@t402/react\";\n *\n * function ProtectedResource() {\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response && response.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n *\n * if (paymentRequired) {\n * return <PaymentUI data={paymentRequired} />;\n * }\n *\n * return <button onClick={handleFetch}>Access Resource</button>;\n * }\n * ```\n */\nexport function usePaymentRequired(options: UsePaymentRequiredOptions = {}): UsePaymentRequiredResult {\n const { onSuccess, onError } = options;\n\n const [paymentRequired, setPaymentRequired] = useState<PaymentRequired | null>(null);\n const [status, setStatus] = useState<PaymentStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const fetchResource = useCallback(\n async (url: string, fetchOptions?: RequestInit): Promise<Response | null> => {\n setStatus(\"loading\");\n setError(null);\n setPaymentRequired(null);\n\n try {\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired;\n setPaymentRequired(data);\n setStatus(\"idle\");\n return null;\n }\n\n if (response.ok) {\n setStatus(\"success\");\n onSuccess?.(response);\n return response;\n }\n\n throw new Error(`Request failed with status ${response.status}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n setStatus(\"error\");\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n },\n [onSuccess, onError],\n );\n\n const reset = useCallback(() => {\n setPaymentRequired(null);\n setStatus(\"idle\");\n setError(null);\n }, []);\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface StatusMessage {\n /** Message text */\n text: string;\n /** Message type */\n type: \"info\" | \"success\" | \"error\" | \"warning\";\n /** Optional auto-dismiss timeout in ms */\n timeout?: number;\n}\n\ninterface UsePaymentStatusResult {\n /** Current payment status */\n status: PaymentStatus;\n /** Current status message */\n message: StatusMessage | null;\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void;\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void;\n /** Set an error message */\n setError: (message: string) => void;\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void;\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void;\n /** Clear the current message */\n clearMessage: () => void;\n /** Reset to idle state */\n reset: () => void;\n}\n\n/**\n * Hook for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```tsx\n * import { usePaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n *\n * return (\n * <div>\n * {message && <StatusMessage message={message} />}\n * <button onClick={handlePayment} disabled={status === \"loading\"}>\n * Pay Now\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusResult {\n const [status, setStatusState] = useState<PaymentStatus>(\"idle\");\n const [message, setMessage] = useState<StatusMessage | null>(null);\n\n const scheduleMessageClear = useCallback((timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n setMessage(null);\n }, timeout);\n }\n }, []);\n\n const setStatus = useCallback(\n (newStatus: PaymentStatus, messageText?: string) => {\n setStatusState(newStatus);\n if (messageText) {\n const type = newStatus === \"error\" ? \"error\" : newStatus === \"success\" ? \"success\" : \"info\";\n setMessage({ text: messageText, type });\n }\n },\n [],\n );\n\n const setSuccess = useCallback(\n (text: string, timeout?: number) => {\n setStatusState(\"success\");\n setMessage({ text, type: \"success\", timeout });\n scheduleMessageClear(timeout);\n },\n [scheduleMessageClear],\n );\n\n const setError = useCallback((text: string) => {\n setStatusState(\"error\");\n setMessage({ text, type: \"error\" });\n }, []);\n\n const setInfo = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: \"info\", timeout });\n scheduleMessageClear(timeout);\n },\n [scheduleMessageClear],\n );\n\n const setWarning = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: \"warning\", timeout });\n scheduleMessageClear(timeout);\n },\n [scheduleMessageClear],\n );\n\n const clearMessage = useCallback(() => {\n setMessage(null);\n }, []);\n\n const reset = useCallback(() => {\n setStatusState(\"idle\");\n setMessage(null);\n }, []);\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n };\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>;\n /** Callback on successful payment */\n onSuccess?: (result: T) => void;\n /** Callback on payment error */\n onError?: (error: Error) => void;\n /** Callback when payment starts */\n onStart?: () => void;\n}\n\ninterface UseAsyncPaymentResult<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>;\n /** Current payment status */\n status: PaymentStatus;\n /** Result of successful payment */\n result: T | null;\n /** Error message if payment failed */\n error: string | null;\n /** Whether payment is in progress */\n isLoading: boolean;\n /** Whether payment succeeded */\n isSuccess: boolean;\n /** Whether payment failed */\n isError: boolean;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Hook for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```tsx\n * import { useAsyncPayment } from \"@t402/react\";\n *\n * function PaymentButton({ paymentPayload }) {\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n *\n * return (\n * <button onClick={execute} disabled={isLoading}>\n * {isLoading ? \"Processing...\" : \"Pay Now\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentResult<T> {\n const { paymentFn, onSuccess, onError, onStart } = options;\n\n const [status, setStatus] = useState<PaymentStatus>(\"idle\");\n const [result, setResult] = useState<T | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Use ref to track if component is mounted\n const isMountedRef = useRef(true);\n\n const execute = useCallback(async (): Promise<T | null> => {\n setStatus(\"loading\");\n setError(null);\n onStart?.();\n\n try {\n const paymentResult = await paymentFn();\n\n if (isMountedRef.current) {\n setResult(paymentResult);\n setStatus(\"success\");\n onSuccess?.(paymentResult);\n }\n\n return paymentResult;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Payment failed\";\n\n if (isMountedRef.current) {\n setError(errorMessage);\n setStatus(\"error\");\n }\n\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n }, [paymentFn, onSuccess, onError, onStart]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setResult(null);\n setError(null);\n }, []);\n\n return {\n execute,\n status,\n result,\n error,\n isLoading: status === \"loading\",\n isSuccess: status === \"success\",\n isError: status === \"error\",\n reset,\n };\n}\n","import { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type { PaymentRequired, PaymentRequirements } from \"@t402/core/types\";\nimport type {\n PaymentState,\n PaymentContextValue,\n PaymentProviderProps,\n PaymentStatus,\n} from \"../types/index.js\";\nimport { choosePaymentRequirement, isTestnetNetwork } from \"../utils/index.js\";\n\nconst initialState: PaymentState = {\n status: \"idle\",\n error: null,\n paymentRequired: null,\n selectedRequirement: null,\n isTestnet: false,\n};\n\nconst PaymentContext = createContext<PaymentContextValue | null>(null);\n\n/**\n * Payment context provider for t402 payment state management.\n *\n * @param props - Provider props including children and initial state.\n * @returns The provider component wrapping children.\n *\n * @example\n * ```tsx\n * import { PaymentProvider } from \"@t402/react\";\n *\n * function App() {\n * return (\n * <PaymentProvider testnet={true}>\n * <PaymentFlow />\n * </PaymentProvider>\n * );\n * }\n * ```\n */\nexport function PaymentProvider({\n children,\n initialPaymentRequired,\n testnet = false,\n}: PaymentProviderProps) {\n const [state, setState] = useState<PaymentState>(() => {\n if (initialPaymentRequired) {\n const selectedRequirement = choosePaymentRequirement(\n initialPaymentRequired.accepts,\n testnet,\n );\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network);\n\n return {\n status: \"idle\",\n error: null,\n paymentRequired: initialPaymentRequired,\n selectedRequirement,\n isTestnet: testnet || detectedTestnet,\n };\n }\n return { ...initialState, isTestnet: testnet };\n });\n\n const setPaymentRequired = useCallback(\n (data: PaymentRequired) => {\n const selectedRequirement = choosePaymentRequirement(data.accepts, state.isTestnet);\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network);\n\n setState(prev => ({\n ...prev,\n paymentRequired: data,\n selectedRequirement,\n isTestnet: prev.isTestnet || detectedTestnet,\n error: null,\n }));\n },\n [state.isTestnet],\n );\n\n const selectRequirement = useCallback((requirement: PaymentRequirements) => {\n setState(prev => ({\n ...prev,\n selectedRequirement: requirement,\n isTestnet: isTestnetNetwork(requirement.network),\n }));\n }, []);\n\n const setStatus = useCallback((status: PaymentStatus) => {\n setState(prev => ({\n ...prev,\n status,\n error: status === \"error\" ? prev.error : null,\n }));\n }, []);\n\n const setError = useCallback((error: string | null) => {\n setState(prev => ({\n ...prev,\n error,\n status: error ? \"error\" : prev.status,\n }));\n }, []);\n\n const reset = useCallback(() => {\n setState({ ...initialState, isTestnet: testnet });\n }, [testnet]);\n\n const value = useMemo<PaymentContextValue>(\n () => ({\n ...state,\n setPaymentRequired,\n selectRequirement,\n setStatus,\n setError,\n reset,\n }),\n [state, setPaymentRequired, selectRequirement, setStatus, setError, reset],\n );\n\n return <PaymentContext.Provider value={value}>{children}</PaymentContext.Provider>;\n}\n\n/**\n * Hook to access the payment context.\n *\n * @returns The payment context value.\n * @throws Error if used outside of PaymentProvider.\n *\n * @example\n * ```tsx\n * import { usePaymentContext } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const { status, selectedRequirement, setStatus } = usePaymentContext();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\");\n * // ... payment logic\n * };\n *\n * return <button onClick={handlePayment}>Pay</button>;\n * }\n * ```\n */\nexport function usePaymentContext(): PaymentContextValue {\n const context = useContext(PaymentContext);\n\n if (!context) {\n throw new Error(\"usePaymentContext must be used within a PaymentProvider\");\n }\n\n return context;\n}\n\nexport { PaymentContext };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Spinner.tsx","../../src/components/PaymentButton.tsx","../../src/components/PaymentStatus.tsx","../../src/utils/index.ts","../../src/components/PaymentDetails.tsx","../../src/components/AddressDisplay.tsx","../../src/hooks/usePaymentRequired.ts","../../src/hooks/usePaymentStatus.ts","../../src/hooks/useAsyncPayment.ts","../../src/providers/PaymentProvider.tsx"],"names":["jsxs","Fragment","jsx","useState","useCallback","baseStyles","containerStyles","useRef","createContext","useMemo","useContext"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react'\nimport type { SpinnerProps } from '../types/index.js'\n\nconst sizeClasses = {\n sm: { width: 16, height: 16, borderWidth: 2 },\n md: { width: 24, height: 24, borderWidth: 3 },\n lg: { width: 32, height: 32, borderWidth: 4 },\n}\n\n/**\n * A simple loading spinner component.\n *\n * @param props - Component props.\n * @returns The spinner element.\n *\n * @example\n * ```tsx\n * import { Spinner } from \"@t402/react\";\n *\n * function LoadingState() {\n * return (\n * <div>\n * <Spinner size=\"md\" />\n * <span>Loading...</span>\n * </div>\n * );\n * }\n * ```\n */\nexport function Spinner({ size = 'md', className = '' }: SpinnerProps) {\n const { width, height, borderWidth } = sizeClasses[size]\n\n const spinnerStyle: React.CSSProperties = {\n width,\n height,\n border: `${borderWidth}px solid #e5e7eb`,\n borderTopColor: '#3b82f6',\n borderRadius: '50%',\n animation: 't402-spin 0.8s linear infinite',\n display: 'inline-block',\n }\n\n return (\n <>\n <style>{`@keyframes t402-spin { to { transform: rotate(360deg); } }`}</style>\n <span style={spinnerStyle} className={className} role=\"status\" aria-label=\"Loading\" />\n </>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport type { PaymentButtonProps } from '../types/index.js'\nimport { Spinner } from './Spinner.js'\n\nconst baseStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n fontWeight: 600,\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n border: 'none',\n fontFamily: 'inherit',\n}\n\nconst variantStyles: Record<string, React.CSSProperties> = {\n primary: {\n backgroundColor: '#2563eb',\n color: '#ffffff',\n },\n secondary: {\n backgroundColor: '#6b7280',\n color: '#ffffff',\n },\n outline: {\n backgroundColor: 'transparent',\n color: '#2563eb',\n border: '2px solid #2563eb',\n },\n}\n\nconst sizeStyles: Record<string, React.CSSProperties> = {\n sm: {\n padding: '8px 16px',\n fontSize: '14px',\n },\n md: {\n padding: '12px 24px',\n fontSize: '16px',\n },\n lg: {\n padding: '16px 32px',\n fontSize: '18px',\n },\n}\n\nconst disabledStyles: React.CSSProperties = {\n opacity: 0.6,\n cursor: 'not-allowed',\n}\n\n/**\n * A payment button component with loading state support.\n *\n * @param props - Component props.\n * @returns The button element.\n *\n * @example\n * ```tsx\n * import { PaymentButton } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [loading, setLoading] = useState(false);\n *\n * const handlePayment = async () => {\n * setLoading(true);\n * await processPayment();\n * setLoading(false);\n * };\n *\n * return (\n * <PaymentButton\n * onClick={handlePayment}\n * loading={loading}\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * );\n * }\n * ```\n */\nexport function PaymentButton({\n onClick,\n disabled = false,\n loading = false,\n children = 'Pay Now',\n className = '',\n variant = 'primary',\n size = 'md',\n}: PaymentButtonProps) {\n const [isHovered, setIsHovered] = useState(false)\n\n const handleClick = useCallback(async () => {\n if (disabled || loading || !onClick) return\n await onClick()\n }, [disabled, loading, onClick])\n\n const isDisabled = disabled || loading\n\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...(isDisabled ? disabledStyles : {}),\n ...(isHovered && !isDisabled\n ? { filter: 'brightness(1.1)', transform: 'translateY(-1px)' }\n : {}),\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n className={className}\n style={combinedStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {loading && <Spinner size=\"sm\" />}\n {children}\n </button>\n )\n}\n","import React from 'react'\nimport type { PaymentStatusProps } from '../types/index.js'\nimport { Spinner } from './Spinner.js'\n\nconst statusStyles: Record<string, React.CSSProperties> = {\n idle: {\n backgroundColor: '#f3f4f6',\n color: '#374151',\n borderColor: '#d1d5db',\n },\n loading: {\n backgroundColor: '#eff6ff',\n color: '#1d4ed8',\n borderColor: '#93c5fd',\n },\n success: {\n backgroundColor: '#f0fdf4',\n color: '#166534',\n borderColor: '#86efac',\n },\n error: {\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n borderColor: '#fca5a5',\n },\n}\n\nconst baseStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n borderRadius: '8px',\n border: '1px solid',\n fontSize: '14px',\n fontWeight: 500,\n}\n\nconst icons: Record<string, string> = {\n idle: '○',\n loading: '',\n success: '✓',\n error: '✕',\n}\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @param props - Component props.\n * @returns The status display element.\n *\n * @example\n * ```tsx\n * import { PaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [status, setStatus] = useState(\"idle\");\n *\n * return (\n * <PaymentStatus\n * status={status}\n * message={status === \"loading\" ? \"Processing payment...\" : undefined}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentStatus({ status, message, className = '' }: PaymentStatusProps) {\n const statusStyle = statusStyles[status] || statusStyles.idle\n\n const defaultMessages: Record<string, string> = {\n idle: 'Ready to pay',\n loading: 'Processing...',\n success: 'Payment successful',\n error: 'Payment failed',\n }\n\n const displayMessage = message || defaultMessages[status]\n\n return (\n <div\n style={{ ...baseStyles, ...statusStyle }}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n >\n {status === 'loading' ? (\n <Spinner size=\"sm\" />\n ) : (\n <span style={{ fontSize: '16px' }}>{icons[status]}</span>\n )}\n <span>{displayMessage}</span>\n </div>\n )\n}\n","import type { PaymentRequirements } from '@t402/core/types'\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: '1',\n BASE_MAINNET: '8453',\n BASE_SEPOLIA: '84532',\n ARBITRUM_MAINNET: '42161',\n ARBITRUM_SEPOLIA: '421614',\n} as const\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n} as const\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: '-239',\n TESTNET: '-3',\n} as const\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: 'mainnet',\n NILE: 'nile',\n SHASTA: 'shasta',\n} as const\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements\n }\n return [paymentRequirements]\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ]\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ]\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements)\n const preferredNetworks = getPreferredNetworks(testnet)\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find((req) => req.network === preferredNetwork)\n if (match) {\n return match\n }\n }\n\n return normalized[0]\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith('eip155:')\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith('solana:')\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith('ton:')\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith('tron:')\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n '1': 'Ethereum',\n '10': 'Optimism',\n '137': 'Polygon',\n '8453': 'Base',\n '42161': 'Arbitrum One',\n '84532': 'Base Sepolia',\n '421614': 'Arbitrum Sepolia',\n '11155111': 'Sepolia',\n}\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET ? 'Solana Devnet' : 'Solana'\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET ? 'TON Testnet' : 'TON'\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n if (ref === TRON_NETWORK_REFS.NILE) return 'TRON Nile'\n if (ref === TRON_NETWORK_REFS.SHASTA) return 'TRON Shasta'\n return 'TRON'\n }\n\n return network\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set(['84532', '421614', '11155111', '80001', '97'])\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return TESTNET_CHAIN_IDS.has(chainId)\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA\n }\n\n return false\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount)\n const divisor = BigInt(10 ** decimals)\n const integerPart = value / divisor\n const fractionalPart = value % divisor\n\n if (fractionalPart === 0n) {\n return integerPart.toString()\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, '')\n\n if (trimmed === '') {\n return integerPart.toString()\n }\n\n return `${integerPart}.${trimmed}`\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase()\n\n switch (assetLower) {\n case 'usdt':\n return 'USDT'\n case 'usdt0':\n return 'USDT0'\n case 'usdc':\n return 'USDC'\n default:\n return asset.toUpperCase()\n }\n}\n","import React from 'react'\nimport type { PaymentDetailsProps } from '../types/index.js'\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from '../utils/index.js'\n\nconst containerStyles: React.CSSProperties = {\n backgroundColor: '#f9fafb',\n borderRadius: '12px',\n padding: '16px',\n border: '1px solid #e5e7eb',\n}\n\nconst rowStyles: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 0',\n borderBottom: '1px solid #e5e7eb',\n}\n\nconst lastRowStyles: React.CSSProperties = {\n ...rowStyles,\n borderBottom: 'none',\n}\n\nconst labelStyles: React.CSSProperties = {\n color: '#6b7280',\n fontSize: '14px',\n}\n\nconst valueStyles: React.CSSProperties = {\n color: '#111827',\n fontSize: '14px',\n fontWeight: 500,\n}\n\nconst amountStyles: React.CSSProperties = {\n color: '#111827',\n fontSize: '20px',\n fontWeight: 700,\n}\n\n/**\n * A component to display payment requirement details.\n *\n * @param props - Component props.\n * @returns The payment details element.\n *\n * @example\n * ```tsx\n * import { PaymentDetails } from \"@t402/react\";\n *\n * function PaymentFlow({ requirement }) {\n * return (\n * <PaymentDetails\n * requirement={requirement}\n * showNetwork={true}\n * showAsset={true}\n * showRecipient={true}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentDetails({\n requirement,\n showNetwork = true,\n showAsset = true,\n showRecipient = false,\n className = '',\n}: PaymentDetailsProps) {\n const formattedAmount = formatTokenAmount(requirement.amount)\n const assetName = getAssetDisplayName(requirement.asset)\n const networkName = getNetworkDisplayName(requirement.network)\n const truncatedAddress = truncateAddress(requirement.payTo)\n\n return (\n <div style={containerStyles} className={className}>\n {/* Amount row - always shown */}\n <div style={rowStyles}>\n <span style={labelStyles}>Amount</span>\n <span style={amountStyles}>\n {formattedAmount} {assetName}\n </span>\n </div>\n\n {/* Network row */}\n {showNetwork && (\n <div style={rowStyles}>\n <span style={labelStyles}>Network</span>\n <span style={valueStyles}>{networkName}</span>\n </div>\n )}\n\n {/* Asset row */}\n {showAsset && (\n <div style={rowStyles}>\n <span style={labelStyles}>Asset</span>\n <span style={valueStyles}>{assetName}</span>\n </div>\n )}\n\n {/* Recipient row */}\n {showRecipient && (\n <div style={lastRowStyles}>\n <span style={labelStyles}>Recipient</span>\n <span style={{ ...valueStyles, fontFamily: 'monospace' }} title={requirement.payTo}>\n {truncatedAddress}\n </span>\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport type { AddressDisplayProps } from '../types/index.js'\nimport { truncateAddress } from '../utils/index.js'\n\nconst containerStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'monospace',\n fontSize: '14px',\n}\n\nconst addressStyles: React.CSSProperties = {\n color: '#374151',\n}\n\nconst buttonStyles: React.CSSProperties = {\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n color: '#6b7280',\n transition: 'all 0.15s ease',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n}\n\nconst copiedStyles: React.CSSProperties = {\n ...buttonStyles,\n color: '#22c55e',\n}\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @param props - Component props.\n * @returns The address display element.\n *\n * @example\n * ```tsx\n * import { AddressDisplay } from \"@t402/react\";\n *\n * function WalletInfo() {\n * return (\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable={true}\n * startChars={6}\n * endChars={4}\n * />\n * );\n * }\n * ```\n */\nexport function AddressDisplay({\n address,\n startChars = 6,\n endChars = 4,\n copyable = false,\n className = '',\n}: AddressDisplayProps) {\n const [copied, setCopied] = useState(false)\n\n const displayAddress = truncateAddress(address, startChars, endChars)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(address)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = address\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }, [address])\n\n return (\n <span style={containerStyles} className={className} title={address}>\n <span style={addressStyles}>{displayAddress}</span>\n {copyable && (\n <button\n type=\"button\"\n onClick={handleCopy}\n style={copied ? copiedStyles : buttonStyles}\n aria-label={copied ? 'Copied' : 'Copy address'}\n >\n {copied ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )}\n </button>\n )}\n </span>\n )\n}\n","import { useState, useCallback } from 'react'\nimport type { PaymentRequired } from '@t402/core/types'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void\n /** Callback when payment fails */\n onError?: (error: Error) => void\n}\n\ninterface UsePaymentRequiredResult {\n /** The payment required data from a 402 response */\n paymentRequired: PaymentRequired | null\n /** Current status of the fetch operation */\n status: PaymentStatus\n /** Error message if status is 'error' */\n error: string | null\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Hook to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```tsx\n * import { usePaymentRequired } from \"@t402/react\";\n *\n * function ProtectedResource() {\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response && response.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n *\n * if (paymentRequired) {\n * return <PaymentUI data={paymentRequired} />;\n * }\n *\n * return <button onClick={handleFetch}>Access Resource</button>;\n * }\n * ```\n */\nexport function usePaymentRequired(\n options: UsePaymentRequiredOptions = {},\n): UsePaymentRequiredResult {\n const { onSuccess, onError } = options\n\n const [paymentRequired, setPaymentRequired] = useState<PaymentRequired | null>(null)\n const [status, setStatus] = useState<PaymentStatus>('idle')\n const [error, setError] = useState<string | null>(null)\n\n const fetchResource = useCallback(\n async (url: string, fetchOptions?: RequestInit): Promise<Response | null> => {\n setStatus('loading')\n setError(null)\n setPaymentRequired(null)\n\n try {\n const response = await fetch(url, fetchOptions)\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired\n setPaymentRequired(data)\n setStatus('idle')\n return null\n }\n\n if (response.ok) {\n setStatus('success')\n onSuccess?.(response)\n return response\n }\n\n throw new Error(`Request failed with status ${response.status}`)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error'\n setError(errorMessage)\n setStatus('error')\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n },\n [onSuccess, onError],\n )\n\n const reset = useCallback(() => {\n setPaymentRequired(null)\n setStatus('idle')\n setError(null)\n }, [])\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n }\n}\n","import { useState, useCallback } from 'react'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface StatusMessage {\n /** Message text */\n text: string\n /** Message type */\n type: 'info' | 'success' | 'error' | 'warning'\n /** Optional auto-dismiss timeout in ms */\n timeout?: number\n}\n\ninterface UsePaymentStatusResult {\n /** Current payment status */\n status: PaymentStatus\n /** Current status message */\n message: StatusMessage | null\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void\n /** Set an error message */\n setError: (message: string) => void\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void\n /** Clear the current message */\n clearMessage: () => void\n /** Reset to idle state */\n reset: () => void\n}\n\n/**\n * Hook for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```tsx\n * import { usePaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n *\n * return (\n * <div>\n * {message && <StatusMessage message={message} />}\n * <button onClick={handlePayment} disabled={status === \"loading\"}>\n * Pay Now\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusResult {\n const [status, setStatusState] = useState<PaymentStatus>('idle')\n const [message, setMessage] = useState<StatusMessage | null>(null)\n\n const scheduleMessageClear = useCallback((timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n setMessage(null)\n }, timeout)\n }\n }, [])\n\n const setStatus = useCallback((newStatus: PaymentStatus, messageText?: string) => {\n setStatusState(newStatus)\n if (messageText) {\n const type = newStatus === 'error' ? 'error' : newStatus === 'success' ? 'success' : 'info'\n setMessage({ text: messageText, type })\n }\n }, [])\n\n const setSuccess = useCallback(\n (text: string, timeout?: number) => {\n setStatusState('success')\n setMessage({ text, type: 'success', timeout })\n scheduleMessageClear(timeout)\n },\n [scheduleMessageClear],\n )\n\n const setError = useCallback((text: string) => {\n setStatusState('error')\n setMessage({ text, type: 'error' })\n }, [])\n\n const setInfo = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: 'info', timeout })\n scheduleMessageClear(timeout)\n },\n [scheduleMessageClear],\n )\n\n const setWarning = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: 'warning', timeout })\n scheduleMessageClear(timeout)\n },\n [scheduleMessageClear],\n )\n\n const clearMessage = useCallback(() => {\n setMessage(null)\n }, [])\n\n const reset = useCallback(() => {\n setStatusState('idle')\n setMessage(null)\n }, [])\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n }\n}\n","import { useState, useCallback, useRef } from 'react'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>\n /** Callback on successful payment */\n onSuccess?: (result: T) => void\n /** Callback on payment error */\n onError?: (error: Error) => void\n /** Callback when payment starts */\n onStart?: () => void\n}\n\ninterface UseAsyncPaymentResult<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>\n /** Current payment status */\n status: PaymentStatus\n /** Result of successful payment */\n result: T | null\n /** Error message if payment failed */\n error: string | null\n /** Whether payment is in progress */\n isLoading: boolean\n /** Whether payment succeeded */\n isSuccess: boolean\n /** Whether payment failed */\n isError: boolean\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Hook for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```tsx\n * import { useAsyncPayment } from \"@t402/react\";\n *\n * function PaymentButton({ paymentPayload }) {\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n *\n * return (\n * <button onClick={execute} disabled={isLoading}>\n * {isLoading ? \"Processing...\" : \"Pay Now\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentResult<T> {\n const { paymentFn, onSuccess, onError, onStart } = options\n\n const [status, setStatus] = useState<PaymentStatus>('idle')\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n // Use ref to track if component is mounted\n const isMountedRef = useRef(true)\n\n const execute = useCallback(async (): Promise<T | null> => {\n setStatus('loading')\n setError(null)\n onStart?.()\n\n try {\n const paymentResult = await paymentFn()\n\n if (isMountedRef.current) {\n setResult(paymentResult)\n setStatus('success')\n onSuccess?.(paymentResult)\n }\n\n return paymentResult\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Payment failed'\n\n if (isMountedRef.current) {\n setError(errorMessage)\n setStatus('error')\n }\n\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n }, [paymentFn, onSuccess, onError, onStart])\n\n const reset = useCallback(() => {\n setStatus('idle')\n setResult(null)\n setError(null)\n }, [])\n\n return {\n execute,\n status,\n result,\n error,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n reset,\n }\n}\n","import { createContext, useContext, useState, useCallback, useMemo } from 'react'\nimport type { PaymentRequired, PaymentRequirements } from '@t402/core/types'\nimport type {\n PaymentState,\n PaymentContextValue,\n PaymentProviderProps,\n PaymentStatus,\n} from '../types/index.js'\nimport { choosePaymentRequirement, isTestnetNetwork } from '../utils/index.js'\n\nconst initialState: PaymentState = {\n status: 'idle',\n error: null,\n paymentRequired: null,\n selectedRequirement: null,\n isTestnet: false,\n}\n\nconst PaymentContext = createContext<PaymentContextValue | null>(null)\n\n/**\n * Payment context provider for t402 payment state management.\n *\n * @param props - Provider props including children and initial state.\n * @returns The provider component wrapping children.\n *\n * @example\n * ```tsx\n * import { PaymentProvider } from \"@t402/react\";\n *\n * function App() {\n * return (\n * <PaymentProvider testnet={true}>\n * <PaymentFlow />\n * </PaymentProvider>\n * );\n * }\n * ```\n */\nexport function PaymentProvider({\n children,\n initialPaymentRequired,\n testnet = false,\n}: PaymentProviderProps) {\n const [state, setState] = useState<PaymentState>(() => {\n if (initialPaymentRequired) {\n const selectedRequirement = choosePaymentRequirement(initialPaymentRequired.accepts, testnet)\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network)\n\n return {\n status: 'idle',\n error: null,\n paymentRequired: initialPaymentRequired,\n selectedRequirement,\n isTestnet: testnet || detectedTestnet,\n }\n }\n return { ...initialState, isTestnet: testnet }\n })\n\n const setPaymentRequired = useCallback(\n (data: PaymentRequired) => {\n const selectedRequirement = choosePaymentRequirement(data.accepts, state.isTestnet)\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network)\n\n setState((prev) => ({\n ...prev,\n paymentRequired: data,\n selectedRequirement,\n isTestnet: prev.isTestnet || detectedTestnet,\n error: null,\n }))\n },\n [state.isTestnet],\n )\n\n const selectRequirement = useCallback((requirement: PaymentRequirements) => {\n setState((prev) => ({\n ...prev,\n selectedRequirement: requirement,\n isTestnet: isTestnetNetwork(requirement.network),\n }))\n }, [])\n\n const setStatus = useCallback((status: PaymentStatus) => {\n setState((prev) => ({\n ...prev,\n status,\n error: status === 'error' ? prev.error : null,\n }))\n }, [])\n\n const setError = useCallback((error: string | null) => {\n setState((prev) => ({\n ...prev,\n error,\n status: error ? 'error' : prev.status,\n }))\n }, [])\n\n const reset = useCallback(() => {\n setState({ ...initialState, isTestnet: testnet })\n }, [testnet])\n\n const value = useMemo<PaymentContextValue>(\n () => ({\n ...state,\n setPaymentRequired,\n selectRequirement,\n setStatus,\n setError,\n reset,\n }),\n [state, setPaymentRequired, selectRequirement, setStatus, setError, reset],\n )\n\n return <PaymentContext.Provider value={value}>{children}</PaymentContext.Provider>\n}\n\n/**\n * Hook to access the payment context.\n *\n * @returns The payment context value.\n * @throws Error if used outside of PaymentProvider.\n *\n * @example\n * ```tsx\n * import { usePaymentContext } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const { status, selectedRequirement, setStatus } = usePaymentContext();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\");\n * // ... payment logic\n * };\n *\n * return <button onClick={handlePayment}>Pay</button>;\n * }\n * ```\n */\nexport function usePaymentContext(): PaymentContextValue {\n const context = useContext(PaymentContext)\n\n if (!context) {\n throw new Error('usePaymentContext must be used within a PaymentProvider')\n }\n\n return context\n}\n\nexport { PaymentContext }\n"]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -6,7 +6,7 @@ import * as react from 'react';
|
|
|
6
6
|
/**
|
|
7
7
|
* Payment status states
|
|
8
8
|
*/
|
|
9
|
-
type PaymentStatus$1 =
|
|
9
|
+
type PaymentStatus$1 = 'idle' | 'loading' | 'success' | 'error';
|
|
10
10
|
/**
|
|
11
11
|
* Payment context state
|
|
12
12
|
*/
|
|
@@ -68,9 +68,9 @@ interface PaymentButtonProps {
|
|
|
68
68
|
/** Additional CSS class names */
|
|
69
69
|
className?: string;
|
|
70
70
|
/** Button variant */
|
|
71
|
-
variant?:
|
|
71
|
+
variant?: 'primary' | 'secondary' | 'outline';
|
|
72
72
|
/** Button size */
|
|
73
|
-
size?:
|
|
73
|
+
size?: 'sm' | 'md' | 'lg';
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Props for PaymentStatus component
|
|
@@ -103,7 +103,7 @@ interface PaymentDetailsProps {
|
|
|
103
103
|
*/
|
|
104
104
|
interface SpinnerProps {
|
|
105
105
|
/** Spinner size */
|
|
106
|
-
size?:
|
|
106
|
+
size?: 'sm' | 'md' | 'lg';
|
|
107
107
|
/** Additional CSS class names */
|
|
108
108
|
className?: string;
|
|
109
109
|
}
|
|
@@ -306,7 +306,7 @@ interface StatusMessage {
|
|
|
306
306
|
/** Message text */
|
|
307
307
|
text: string;
|
|
308
308
|
/** Message type */
|
|
309
|
-
type:
|
|
309
|
+
type: 'info' | 'success' | 'error' | 'warning';
|
|
310
310
|
/** Optional auto-dismiss timeout in ms */
|
|
311
311
|
timeout?: number;
|
|
312
312
|
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as react from 'react';
|
|
|
6
6
|
/**
|
|
7
7
|
* Payment status states
|
|
8
8
|
*/
|
|
9
|
-
type PaymentStatus$1 =
|
|
9
|
+
type PaymentStatus$1 = 'idle' | 'loading' | 'success' | 'error';
|
|
10
10
|
/**
|
|
11
11
|
* Payment context state
|
|
12
12
|
*/
|
|
@@ -68,9 +68,9 @@ interface PaymentButtonProps {
|
|
|
68
68
|
/** Additional CSS class names */
|
|
69
69
|
className?: string;
|
|
70
70
|
/** Button variant */
|
|
71
|
-
variant?:
|
|
71
|
+
variant?: 'primary' | 'secondary' | 'outline';
|
|
72
72
|
/** Button size */
|
|
73
|
-
size?:
|
|
73
|
+
size?: 'sm' | 'md' | 'lg';
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Props for PaymentStatus component
|
|
@@ -103,7 +103,7 @@ interface PaymentDetailsProps {
|
|
|
103
103
|
*/
|
|
104
104
|
interface SpinnerProps {
|
|
105
105
|
/** Spinner size */
|
|
106
|
-
size?:
|
|
106
|
+
size?: 'sm' | 'md' | 'lg';
|
|
107
107
|
/** Additional CSS class names */
|
|
108
108
|
className?: string;
|
|
109
109
|
}
|
|
@@ -306,7 +306,7 @@ interface StatusMessage {
|
|
|
306
306
|
/** Message text */
|
|
307
307
|
text: string;
|
|
308
308
|
/** Message type */
|
|
309
|
-
type:
|
|
309
|
+
type: 'info' | 'success' | 'error' | 'warning';
|
|
310
310
|
/** Optional auto-dismiss timeout in ms */
|
|
311
311
|
timeout?: number;
|
|
312
312
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -20,15 +20,7 @@ function Spinner({ size = "md", className = "" }) {
|
|
|
20
20
|
};
|
|
21
21
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
22
22
|
/* @__PURE__ */ jsx("style", { children: `@keyframes t402-spin { to { transform: rotate(360deg); } }` }),
|
|
23
|
-
/* @__PURE__ */ jsx(
|
|
24
|
-
"span",
|
|
25
|
-
{
|
|
26
|
-
style: spinnerStyle,
|
|
27
|
-
className,
|
|
28
|
-
role: "status",
|
|
29
|
-
"aria-label": "Loading"
|
|
30
|
-
}
|
|
31
|
-
)
|
|
23
|
+
/* @__PURE__ */ jsx("span", { style: spinnerStyle, className, role: "status", "aria-label": "Loading" })
|
|
32
24
|
] });
|
|
33
25
|
}
|
|
34
26
|
var baseStyles = {
|
|
@@ -451,10 +443,32 @@ function AddressDisplay({
|
|
|
451
443
|
onClick: handleCopy,
|
|
452
444
|
style: copied ? copiedStyles : buttonStyles,
|
|
453
445
|
"aria-label": copied ? "Copied" : "Copy address",
|
|
454
|
-
children: copied ? /* @__PURE__ */ jsx(
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
446
|
+
children: copied ? /* @__PURE__ */ jsx(
|
|
447
|
+
"svg",
|
|
448
|
+
{
|
|
449
|
+
width: "16",
|
|
450
|
+
height: "16",
|
|
451
|
+
viewBox: "0 0 24 24",
|
|
452
|
+
fill: "none",
|
|
453
|
+
stroke: "currentColor",
|
|
454
|
+
strokeWidth: "2",
|
|
455
|
+
children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" })
|
|
456
|
+
}
|
|
457
|
+
) : /* @__PURE__ */ jsxs(
|
|
458
|
+
"svg",
|
|
459
|
+
{
|
|
460
|
+
width: "16",
|
|
461
|
+
height: "16",
|
|
462
|
+
viewBox: "0 0 24 24",
|
|
463
|
+
fill: "none",
|
|
464
|
+
stroke: "currentColor",
|
|
465
|
+
strokeWidth: "2",
|
|
466
|
+
children: [
|
|
467
|
+
/* @__PURE__ */ jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
|
|
468
|
+
/* @__PURE__ */ jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
|
|
469
|
+
]
|
|
470
|
+
}
|
|
471
|
+
)
|
|
458
472
|
}
|
|
459
473
|
)
|
|
460
474
|
] });
|
|
@@ -516,16 +530,13 @@ function usePaymentStatus() {
|
|
|
516
530
|
}, timeout);
|
|
517
531
|
}
|
|
518
532
|
}, []);
|
|
519
|
-
const setStatus = useCallback(
|
|
520
|
-
(newStatus
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
},
|
|
527
|
-
[]
|
|
528
|
-
);
|
|
533
|
+
const setStatus = useCallback((newStatus, messageText) => {
|
|
534
|
+
setStatusState(newStatus);
|
|
535
|
+
if (messageText) {
|
|
536
|
+
const type = newStatus === "error" ? "error" : newStatus === "success" ? "success" : "info";
|
|
537
|
+
setMessage({ text: messageText, type });
|
|
538
|
+
}
|
|
539
|
+
}, []);
|
|
529
540
|
const setSuccess = useCallback(
|
|
530
541
|
(text, timeout) => {
|
|
531
542
|
setStatusState("success");
|
|
@@ -630,10 +641,7 @@ function PaymentProvider({
|
|
|
630
641
|
}) {
|
|
631
642
|
const [state, setState] = useState(() => {
|
|
632
643
|
if (initialPaymentRequired) {
|
|
633
|
-
const selectedRequirement = choosePaymentRequirement(
|
|
634
|
-
initialPaymentRequired.accepts,
|
|
635
|
-
testnet
|
|
636
|
-
);
|
|
644
|
+
const selectedRequirement = choosePaymentRequirement(initialPaymentRequired.accepts, testnet);
|
|
637
645
|
const detectedTestnet = isTestnetNetwork(selectedRequirement.network);
|
|
638
646
|
return {
|
|
639
647
|
status: "idle",
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Spinner.tsx","../../src/components/PaymentButton.tsx","../../src/components/PaymentStatus.tsx","../../src/utils/index.ts","../../src/components/PaymentDetails.tsx","../../src/components/AddressDisplay.tsx","../../src/hooks/usePaymentRequired.ts","../../src/hooks/usePaymentStatus.ts","../../src/hooks/useAsyncPayment.ts","../../src/providers/PaymentProvider.tsx"],"names":["jsxs","jsx","baseStyles","containerStyles","useState","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import React from \"react\";\nimport type { SpinnerProps } from \"../types/index.js\";\n\nconst sizeClasses = {\n sm: { width: 16, height: 16, borderWidth: 2 },\n md: { width: 24, height: 24, borderWidth: 3 },\n lg: { width: 32, height: 32, borderWidth: 4 },\n};\n\n/**\n * A simple loading spinner component.\n *\n * @param props - Component props.\n * @returns The spinner element.\n *\n * @example\n * ```tsx\n * import { Spinner } from \"@t402/react\";\n *\n * function LoadingState() {\n * return (\n * <div>\n * <Spinner size=\"md\" />\n * <span>Loading...</span>\n * </div>\n * );\n * }\n * ```\n */\nexport function Spinner({ size = \"md\", className = \"\" }: SpinnerProps) {\n const { width, height, borderWidth } = sizeClasses[size];\n\n const spinnerStyle: React.CSSProperties = {\n width,\n height,\n border: `${borderWidth}px solid #e5e7eb`,\n borderTopColor: \"#3b82f6\",\n borderRadius: \"50%\",\n animation: \"t402-spin 0.8s linear infinite\",\n display: \"inline-block\",\n };\n\n return (\n <>\n <style>\n {`@keyframes t402-spin { to { transform: rotate(360deg); } }`}\n </style>\n <span\n style={spinnerStyle}\n className={className}\n role=\"status\"\n aria-label=\"Loading\"\n />\n </>\n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport type { PaymentButtonProps } from \"../types/index.js\";\nimport { Spinner } from \"./Spinner.js\";\n\nconst baseStyles: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n fontWeight: 600,\n borderRadius: \"8px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n border: \"none\",\n fontFamily: \"inherit\",\n};\n\nconst variantStyles: Record<string, React.CSSProperties> = {\n primary: {\n backgroundColor: \"#2563eb\",\n color: \"#ffffff\",\n },\n secondary: {\n backgroundColor: \"#6b7280\",\n color: \"#ffffff\",\n },\n outline: {\n backgroundColor: \"transparent\",\n color: \"#2563eb\",\n border: \"2px solid #2563eb\",\n },\n};\n\nconst sizeStyles: Record<string, React.CSSProperties> = {\n sm: {\n padding: \"8px 16px\",\n fontSize: \"14px\",\n },\n md: {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n },\n lg: {\n padding: \"16px 32px\",\n fontSize: \"18px\",\n },\n};\n\nconst disabledStyles: React.CSSProperties = {\n opacity: 0.6,\n cursor: \"not-allowed\",\n};\n\n/**\n * A payment button component with loading state support.\n *\n * @param props - Component props.\n * @returns The button element.\n *\n * @example\n * ```tsx\n * import { PaymentButton } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [loading, setLoading] = useState(false);\n *\n * const handlePayment = async () => {\n * setLoading(true);\n * await processPayment();\n * setLoading(false);\n * };\n *\n * return (\n * <PaymentButton\n * onClick={handlePayment}\n * loading={loading}\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * );\n * }\n * ```\n */\nexport function PaymentButton({\n onClick,\n disabled = false,\n loading = false,\n children = \"Pay Now\",\n className = \"\",\n variant = \"primary\",\n size = \"md\",\n}: PaymentButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (disabled || loading || !onClick) return;\n await onClick();\n }, [disabled, loading, onClick]);\n\n const isDisabled = disabled || loading;\n\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...(isDisabled ? disabledStyles : {}),\n ...(isHovered && !isDisabled\n ? { filter: \"brightness(1.1)\", transform: \"translateY(-1px)\" }\n : {}),\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n className={className}\n style={combinedStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {loading && <Spinner size=\"sm\" />}\n {children}\n </button>\n );\n}\n","import React from \"react\";\nimport type { PaymentStatusProps } from \"../types/index.js\";\nimport { Spinner } from \"./Spinner.js\";\n\nconst statusStyles: Record<string, React.CSSProperties> = {\n idle: {\n backgroundColor: \"#f3f4f6\",\n color: \"#374151\",\n borderColor: \"#d1d5db\",\n },\n loading: {\n backgroundColor: \"#eff6ff\",\n color: \"#1d4ed8\",\n borderColor: \"#93c5fd\",\n },\n success: {\n backgroundColor: \"#f0fdf4\",\n color: \"#166534\",\n borderColor: \"#86efac\",\n },\n error: {\n backgroundColor: \"#fef2f2\",\n color: \"#dc2626\",\n borderColor: \"#fca5a5\",\n },\n};\n\nconst baseStyles: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 16px\",\n borderRadius: \"8px\",\n border: \"1px solid\",\n fontSize: \"14px\",\n fontWeight: 500,\n};\n\nconst icons: Record<string, string> = {\n idle: \"○\",\n loading: \"\",\n success: \"✓\",\n error: \"✕\",\n};\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @param props - Component props.\n * @returns The status display element.\n *\n * @example\n * ```tsx\n * import { PaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [status, setStatus] = useState(\"idle\");\n *\n * return (\n * <PaymentStatus\n * status={status}\n * message={status === \"loading\" ? \"Processing payment...\" : undefined}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentStatus({ status, message, className = \"\" }: PaymentStatusProps) {\n const statusStyle = statusStyles[status] || statusStyles.idle;\n\n const defaultMessages: Record<string, string> = {\n idle: \"Ready to pay\",\n loading: \"Processing...\",\n success: \"Payment successful\",\n error: \"Payment failed\",\n };\n\n const displayMessage = message || defaultMessages[status];\n\n return (\n <div\n style={{ ...baseStyles, ...statusStyle }}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n >\n {status === \"loading\" ? (\n <Spinner size=\"sm\" />\n ) : (\n <span style={{ fontSize: \"16px\" }}>{icons[status]}</span>\n )}\n <span>{displayMessage}</span>\n </div>\n );\n}\n","import type { PaymentRequirements } from \"@t402/core/types\";\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: \"1\",\n BASE_MAINNET: \"8453\",\n BASE_SEPOLIA: \"84532\",\n ARBITRUM_MAINNET: \"42161\",\n ARBITRUM_SEPOLIA: \"421614\",\n} as const;\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: \"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n DEVNET: \"EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n} as const;\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: \"-239\",\n TESTNET: \"-3\",\n} as const;\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: \"mainnet\",\n NILE: \"nile\",\n SHASTA: \"shasta\",\n} as const;\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements;\n }\n return [paymentRequirements];\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ];\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ];\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements);\n const preferredNetworks = getPreferredNetworks(testnet);\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find(req => req.network === preferredNetwork);\n if (match) {\n return match;\n }\n }\n\n return normalized[0];\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith(\"eip155:\");\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith(\"solana:\");\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith(\"ton:\");\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith(\"tron:\");\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n \"1\": \"Ethereum\",\n \"10\": \"Optimism\",\n \"137\": \"Polygon\",\n \"8453\": \"Base\",\n \"42161\": \"Arbitrum One\",\n \"84532\": \"Base Sepolia\",\n \"421614\": \"Arbitrum Sepolia\",\n \"11155111\": \"Sepolia\",\n};\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`;\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET ? \"Solana Devnet\" : \"Solana\";\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET ? \"TON Testnet\" : \"TON\";\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n if (ref === TRON_NETWORK_REFS.NILE) return \"TRON Nile\";\n if (ref === TRON_NETWORK_REFS.SHASTA) return \"TRON Shasta\";\n return \"TRON\";\n }\n\n return network;\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set([\"84532\", \"421614\", \"11155111\", \"80001\", \"97\"]);\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith(\"eip155:\")) {\n const chainId = network.split(\":\")[1];\n return TESTNET_CHAIN_IDS.has(chainId);\n }\n\n if (network.startsWith(\"solana:\")) {\n const ref = network.split(\":\")[1];\n return ref === SOLANA_NETWORK_REFS.DEVNET;\n }\n\n if (network.startsWith(\"ton:\")) {\n const ref = network.split(\":\")[1];\n return ref === TON_NETWORK_REFS.TESTNET;\n }\n\n if (network.startsWith(\"tron:\")) {\n const ref = network.split(\":\")[1];\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA;\n }\n\n return false;\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address;\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const integerPart = value / divisor;\n const fractionalPart = value % divisor;\n\n if (fractionalPart === 0n) {\n return integerPart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, \"\");\n\n if (trimmed === \"\") {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmed}`;\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase();\n\n switch (assetLower) {\n case \"usdt\":\n return \"USDT\";\n case \"usdt0\":\n return \"USDT0\";\n case \"usdc\":\n return \"USDC\";\n default:\n return asset.toUpperCase();\n }\n}\n","import React from \"react\";\nimport type { PaymentDetailsProps } from \"../types/index.js\";\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from \"../utils/index.js\";\n\nconst containerStyles: React.CSSProperties = {\n backgroundColor: \"#f9fafb\",\n borderRadius: \"12px\",\n padding: \"16px\",\n border: \"1px solid #e5e7eb\",\n};\n\nconst rowStyles: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 0\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst lastRowStyles: React.CSSProperties = {\n ...rowStyles,\n borderBottom: \"none\",\n};\n\nconst labelStyles: React.CSSProperties = {\n color: \"#6b7280\",\n fontSize: \"14px\",\n};\n\nconst valueStyles: React.CSSProperties = {\n color: \"#111827\",\n fontSize: \"14px\",\n fontWeight: 500,\n};\n\nconst amountStyles: React.CSSProperties = {\n color: \"#111827\",\n fontSize: \"20px\",\n fontWeight: 700,\n};\n\n/**\n * A component to display payment requirement details.\n *\n * @param props - Component props.\n * @returns The payment details element.\n *\n * @example\n * ```tsx\n * import { PaymentDetails } from \"@t402/react\";\n *\n * function PaymentFlow({ requirement }) {\n * return (\n * <PaymentDetails\n * requirement={requirement}\n * showNetwork={true}\n * showAsset={true}\n * showRecipient={true}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentDetails({\n requirement,\n showNetwork = true,\n showAsset = true,\n showRecipient = false,\n className = \"\",\n}: PaymentDetailsProps) {\n const formattedAmount = formatTokenAmount(requirement.amount);\n const assetName = getAssetDisplayName(requirement.asset);\n const networkName = getNetworkDisplayName(requirement.network);\n const truncatedAddress = truncateAddress(requirement.payTo);\n\n return (\n <div style={containerStyles} className={className}>\n {/* Amount row - always shown */}\n <div style={rowStyles}>\n <span style={labelStyles}>Amount</span>\n <span style={amountStyles}>\n {formattedAmount} {assetName}\n </span>\n </div>\n\n {/* Network row */}\n {showNetwork && (\n <div style={rowStyles}>\n <span style={labelStyles}>Network</span>\n <span style={valueStyles}>{networkName}</span>\n </div>\n )}\n\n {/* Asset row */}\n {showAsset && (\n <div style={rowStyles}>\n <span style={labelStyles}>Asset</span>\n <span style={valueStyles}>{assetName}</span>\n </div>\n )}\n\n {/* Recipient row */}\n {showRecipient && (\n <div style={lastRowStyles}>\n <span style={labelStyles}>Recipient</span>\n <span style={{ ...valueStyles, fontFamily: \"monospace\" }} title={requirement.payTo}>\n {truncatedAddress}\n </span>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback } from \"react\";\nimport type { AddressDisplayProps } from \"../types/index.js\";\nimport { truncateAddress } from \"../utils/index.js\";\n\nconst containerStyles: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n};\n\nconst addressStyles: React.CSSProperties = {\n color: \"#374151\",\n};\n\nconst buttonStyles: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"4px\",\n borderRadius: \"4px\",\n color: \"#6b7280\",\n transition: \"all 0.15s ease\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n};\n\nconst copiedStyles: React.CSSProperties = {\n ...buttonStyles,\n color: \"#22c55e\",\n};\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @param props - Component props.\n * @returns The address display element.\n *\n * @example\n * ```tsx\n * import { AddressDisplay } from \"@t402/react\";\n *\n * function WalletInfo() {\n * return (\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable={true}\n * startChars={6}\n * endChars={4}\n * />\n * );\n * }\n * ```\n */\nexport function AddressDisplay({\n address,\n startChars = 6,\n endChars = 4,\n copyable = false,\n className = \"\",\n}: AddressDisplayProps) {\n const [copied, setCopied] = useState(false);\n\n const displayAddress = truncateAddress(address, startChars, endChars);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = address;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [address]);\n\n return (\n <span style={containerStyles} className={className} title={address}>\n <span style={addressStyles}>{displayAddress}</span>\n {copyable && (\n <button\n type=\"button\"\n onClick={handleCopy}\n style={copied ? copiedStyles : buttonStyles}\n aria-label={copied ? \"Copied\" : \"Copy address\"}\n >\n {copied ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )}\n </button>\n )}\n </span>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { PaymentRequired } from \"@t402/core/types\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void;\n /** Callback when payment fails */\n onError?: (error: Error) => void;\n}\n\ninterface UsePaymentRequiredResult {\n /** The payment required data from a 402 response */\n paymentRequired: PaymentRequired | null;\n /** Current status of the fetch operation */\n status: PaymentStatus;\n /** Error message if status is 'error' */\n error: string | null;\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Hook to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```tsx\n * import { usePaymentRequired } from \"@t402/react\";\n *\n * function ProtectedResource() {\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response && response.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n *\n * if (paymentRequired) {\n * return <PaymentUI data={paymentRequired} />;\n * }\n *\n * return <button onClick={handleFetch}>Access Resource</button>;\n * }\n * ```\n */\nexport function usePaymentRequired(options: UsePaymentRequiredOptions = {}): UsePaymentRequiredResult {\n const { onSuccess, onError } = options;\n\n const [paymentRequired, setPaymentRequired] = useState<PaymentRequired | null>(null);\n const [status, setStatus] = useState<PaymentStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const fetchResource = useCallback(\n async (url: string, fetchOptions?: RequestInit): Promise<Response | null> => {\n setStatus(\"loading\");\n setError(null);\n setPaymentRequired(null);\n\n try {\n const response = await fetch(url, fetchOptions);\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired;\n setPaymentRequired(data);\n setStatus(\"idle\");\n return null;\n }\n\n if (response.ok) {\n setStatus(\"success\");\n onSuccess?.(response);\n return response;\n }\n\n throw new Error(`Request failed with status ${response.status}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n setStatus(\"error\");\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n },\n [onSuccess, onError],\n );\n\n const reset = useCallback(() => {\n setPaymentRequired(null);\n setStatus(\"idle\");\n setError(null);\n }, []);\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface StatusMessage {\n /** Message text */\n text: string;\n /** Message type */\n type: \"info\" | \"success\" | \"error\" | \"warning\";\n /** Optional auto-dismiss timeout in ms */\n timeout?: number;\n}\n\ninterface UsePaymentStatusResult {\n /** Current payment status */\n status: PaymentStatus;\n /** Current status message */\n message: StatusMessage | null;\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void;\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void;\n /** Set an error message */\n setError: (message: string) => void;\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void;\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void;\n /** Clear the current message */\n clearMessage: () => void;\n /** Reset to idle state */\n reset: () => void;\n}\n\n/**\n * Hook for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```tsx\n * import { usePaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n *\n * return (\n * <div>\n * {message && <StatusMessage message={message} />}\n * <button onClick={handlePayment} disabled={status === \"loading\"}>\n * Pay Now\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusResult {\n const [status, setStatusState] = useState<PaymentStatus>(\"idle\");\n const [message, setMessage] = useState<StatusMessage | null>(null);\n\n const scheduleMessageClear = useCallback((timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n setMessage(null);\n }, timeout);\n }\n }, []);\n\n const setStatus = useCallback(\n (newStatus: PaymentStatus, messageText?: string) => {\n setStatusState(newStatus);\n if (messageText) {\n const type = newStatus === \"error\" ? \"error\" : newStatus === \"success\" ? \"success\" : \"info\";\n setMessage({ text: messageText, type });\n }\n },\n [],\n );\n\n const setSuccess = useCallback(\n (text: string, timeout?: number) => {\n setStatusState(\"success\");\n setMessage({ text, type: \"success\", timeout });\n scheduleMessageClear(timeout);\n },\n [scheduleMessageClear],\n );\n\n const setError = useCallback((text: string) => {\n setStatusState(\"error\");\n setMessage({ text, type: \"error\" });\n }, []);\n\n const setInfo = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: \"info\", timeout });\n scheduleMessageClear(timeout);\n },\n [scheduleMessageClear],\n );\n\n const setWarning = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: \"warning\", timeout });\n scheduleMessageClear(timeout);\n },\n [scheduleMessageClear],\n );\n\n const clearMessage = useCallback(() => {\n setMessage(null);\n }, []);\n\n const reset = useCallback(() => {\n setStatusState(\"idle\");\n setMessage(null);\n }, []);\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n };\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport type { PaymentStatus } from \"../types/index.js\";\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>;\n /** Callback on successful payment */\n onSuccess?: (result: T) => void;\n /** Callback on payment error */\n onError?: (error: Error) => void;\n /** Callback when payment starts */\n onStart?: () => void;\n}\n\ninterface UseAsyncPaymentResult<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>;\n /** Current payment status */\n status: PaymentStatus;\n /** Result of successful payment */\n result: T | null;\n /** Error message if payment failed */\n error: string | null;\n /** Whether payment is in progress */\n isLoading: boolean;\n /** Whether payment succeeded */\n isSuccess: boolean;\n /** Whether payment failed */\n isError: boolean;\n /** Reset the state */\n reset: () => void;\n}\n\n/**\n * Hook for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```tsx\n * import { useAsyncPayment } from \"@t402/react\";\n *\n * function PaymentButton({ paymentPayload }) {\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n *\n * return (\n * <button onClick={execute} disabled={isLoading}>\n * {isLoading ? \"Processing...\" : \"Pay Now\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentResult<T> {\n const { paymentFn, onSuccess, onError, onStart } = options;\n\n const [status, setStatus] = useState<PaymentStatus>(\"idle\");\n const [result, setResult] = useState<T | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Use ref to track if component is mounted\n const isMountedRef = useRef(true);\n\n const execute = useCallback(async (): Promise<T | null> => {\n setStatus(\"loading\");\n setError(null);\n onStart?.();\n\n try {\n const paymentResult = await paymentFn();\n\n if (isMountedRef.current) {\n setResult(paymentResult);\n setStatus(\"success\");\n onSuccess?.(paymentResult);\n }\n\n return paymentResult;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Payment failed\";\n\n if (isMountedRef.current) {\n setError(errorMessage);\n setStatus(\"error\");\n }\n\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n return null;\n }\n }, [paymentFn, onSuccess, onError, onStart]);\n\n const reset = useCallback(() => {\n setStatus(\"idle\");\n setResult(null);\n setError(null);\n }, []);\n\n return {\n execute,\n status,\n result,\n error,\n isLoading: status === \"loading\",\n isSuccess: status === \"success\",\n isError: status === \"error\",\n reset,\n };\n}\n","import { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport type { PaymentRequired, PaymentRequirements } from \"@t402/core/types\";\nimport type {\n PaymentState,\n PaymentContextValue,\n PaymentProviderProps,\n PaymentStatus,\n} from \"../types/index.js\";\nimport { choosePaymentRequirement, isTestnetNetwork } from \"../utils/index.js\";\n\nconst initialState: PaymentState = {\n status: \"idle\",\n error: null,\n paymentRequired: null,\n selectedRequirement: null,\n isTestnet: false,\n};\n\nconst PaymentContext = createContext<PaymentContextValue | null>(null);\n\n/**\n * Payment context provider for t402 payment state management.\n *\n * @param props - Provider props including children and initial state.\n * @returns The provider component wrapping children.\n *\n * @example\n * ```tsx\n * import { PaymentProvider } from \"@t402/react\";\n *\n * function App() {\n * return (\n * <PaymentProvider testnet={true}>\n * <PaymentFlow />\n * </PaymentProvider>\n * );\n * }\n * ```\n */\nexport function PaymentProvider({\n children,\n initialPaymentRequired,\n testnet = false,\n}: PaymentProviderProps) {\n const [state, setState] = useState<PaymentState>(() => {\n if (initialPaymentRequired) {\n const selectedRequirement = choosePaymentRequirement(\n initialPaymentRequired.accepts,\n testnet,\n );\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network);\n\n return {\n status: \"idle\",\n error: null,\n paymentRequired: initialPaymentRequired,\n selectedRequirement,\n isTestnet: testnet || detectedTestnet,\n };\n }\n return { ...initialState, isTestnet: testnet };\n });\n\n const setPaymentRequired = useCallback(\n (data: PaymentRequired) => {\n const selectedRequirement = choosePaymentRequirement(data.accepts, state.isTestnet);\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network);\n\n setState(prev => ({\n ...prev,\n paymentRequired: data,\n selectedRequirement,\n isTestnet: prev.isTestnet || detectedTestnet,\n error: null,\n }));\n },\n [state.isTestnet],\n );\n\n const selectRequirement = useCallback((requirement: PaymentRequirements) => {\n setState(prev => ({\n ...prev,\n selectedRequirement: requirement,\n isTestnet: isTestnetNetwork(requirement.network),\n }));\n }, []);\n\n const setStatus = useCallback((status: PaymentStatus) => {\n setState(prev => ({\n ...prev,\n status,\n error: status === \"error\" ? prev.error : null,\n }));\n }, []);\n\n const setError = useCallback((error: string | null) => {\n setState(prev => ({\n ...prev,\n error,\n status: error ? \"error\" : prev.status,\n }));\n }, []);\n\n const reset = useCallback(() => {\n setState({ ...initialState, isTestnet: testnet });\n }, [testnet]);\n\n const value = useMemo<PaymentContextValue>(\n () => ({\n ...state,\n setPaymentRequired,\n selectRequirement,\n setStatus,\n setError,\n reset,\n }),\n [state, setPaymentRequired, selectRequirement, setStatus, setError, reset],\n );\n\n return <PaymentContext.Provider value={value}>{children}</PaymentContext.Provider>;\n}\n\n/**\n * Hook to access the payment context.\n *\n * @returns The payment context value.\n * @throws Error if used outside of PaymentProvider.\n *\n * @example\n * ```tsx\n * import { usePaymentContext } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const { status, selectedRequirement, setStatus } = usePaymentContext();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\");\n * // ... payment logic\n * };\n *\n * return <button onClick={handlePayment}>Pay</button>;\n * }\n * ```\n */\nexport function usePaymentContext(): PaymentContextValue {\n const context = useContext(PaymentContext);\n\n if (!context) {\n throw new Error(\"usePaymentContext must be used within a PaymentProvider\");\n }\n\n return context;\n}\n\nexport { PaymentContext };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Spinner.tsx","../../src/components/PaymentButton.tsx","../../src/components/PaymentStatus.tsx","../../src/utils/index.ts","../../src/components/PaymentDetails.tsx","../../src/components/AddressDisplay.tsx","../../src/hooks/usePaymentRequired.ts","../../src/hooks/usePaymentStatus.ts","../../src/hooks/useAsyncPayment.ts","../../src/providers/PaymentProvider.tsx"],"names":["jsxs","jsx","baseStyles","containerStyles","useState","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react'\nimport type { SpinnerProps } from '../types/index.js'\n\nconst sizeClasses = {\n sm: { width: 16, height: 16, borderWidth: 2 },\n md: { width: 24, height: 24, borderWidth: 3 },\n lg: { width: 32, height: 32, borderWidth: 4 },\n}\n\n/**\n * A simple loading spinner component.\n *\n * @param props - Component props.\n * @returns The spinner element.\n *\n * @example\n * ```tsx\n * import { Spinner } from \"@t402/react\";\n *\n * function LoadingState() {\n * return (\n * <div>\n * <Spinner size=\"md\" />\n * <span>Loading...</span>\n * </div>\n * );\n * }\n * ```\n */\nexport function Spinner({ size = 'md', className = '' }: SpinnerProps) {\n const { width, height, borderWidth } = sizeClasses[size]\n\n const spinnerStyle: React.CSSProperties = {\n width,\n height,\n border: `${borderWidth}px solid #e5e7eb`,\n borderTopColor: '#3b82f6',\n borderRadius: '50%',\n animation: 't402-spin 0.8s linear infinite',\n display: 'inline-block',\n }\n\n return (\n <>\n <style>{`@keyframes t402-spin { to { transform: rotate(360deg); } }`}</style>\n <span style={spinnerStyle} className={className} role=\"status\" aria-label=\"Loading\" />\n </>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport type { PaymentButtonProps } from '../types/index.js'\nimport { Spinner } from './Spinner.js'\n\nconst baseStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n fontWeight: 600,\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n border: 'none',\n fontFamily: 'inherit',\n}\n\nconst variantStyles: Record<string, React.CSSProperties> = {\n primary: {\n backgroundColor: '#2563eb',\n color: '#ffffff',\n },\n secondary: {\n backgroundColor: '#6b7280',\n color: '#ffffff',\n },\n outline: {\n backgroundColor: 'transparent',\n color: '#2563eb',\n border: '2px solid #2563eb',\n },\n}\n\nconst sizeStyles: Record<string, React.CSSProperties> = {\n sm: {\n padding: '8px 16px',\n fontSize: '14px',\n },\n md: {\n padding: '12px 24px',\n fontSize: '16px',\n },\n lg: {\n padding: '16px 32px',\n fontSize: '18px',\n },\n}\n\nconst disabledStyles: React.CSSProperties = {\n opacity: 0.6,\n cursor: 'not-allowed',\n}\n\n/**\n * A payment button component with loading state support.\n *\n * @param props - Component props.\n * @returns The button element.\n *\n * @example\n * ```tsx\n * import { PaymentButton } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [loading, setLoading] = useState(false);\n *\n * const handlePayment = async () => {\n * setLoading(true);\n * await processPayment();\n * setLoading(false);\n * };\n *\n * return (\n * <PaymentButton\n * onClick={handlePayment}\n * loading={loading}\n * variant=\"primary\"\n * size=\"lg\"\n * >\n * Pay $10.00\n * </PaymentButton>\n * );\n * }\n * ```\n */\nexport function PaymentButton({\n onClick,\n disabled = false,\n loading = false,\n children = 'Pay Now',\n className = '',\n variant = 'primary',\n size = 'md',\n}: PaymentButtonProps) {\n const [isHovered, setIsHovered] = useState(false)\n\n const handleClick = useCallback(async () => {\n if (disabled || loading || !onClick) return\n await onClick()\n }, [disabled, loading, onClick])\n\n const isDisabled = disabled || loading\n\n const combinedStyles: React.CSSProperties = {\n ...baseStyles,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...(isDisabled ? disabledStyles : {}),\n ...(isHovered && !isDisabled\n ? { filter: 'brightness(1.1)', transform: 'translateY(-1px)' }\n : {}),\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n className={className}\n style={combinedStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {loading && <Spinner size=\"sm\" />}\n {children}\n </button>\n )\n}\n","import React from 'react'\nimport type { PaymentStatusProps } from '../types/index.js'\nimport { Spinner } from './Spinner.js'\n\nconst statusStyles: Record<string, React.CSSProperties> = {\n idle: {\n backgroundColor: '#f3f4f6',\n color: '#374151',\n borderColor: '#d1d5db',\n },\n loading: {\n backgroundColor: '#eff6ff',\n color: '#1d4ed8',\n borderColor: '#93c5fd',\n },\n success: {\n backgroundColor: '#f0fdf4',\n color: '#166534',\n borderColor: '#86efac',\n },\n error: {\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n borderColor: '#fca5a5',\n },\n}\n\nconst baseStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n borderRadius: '8px',\n border: '1px solid',\n fontSize: '14px',\n fontWeight: 500,\n}\n\nconst icons: Record<string, string> = {\n idle: '○',\n loading: '',\n success: '✓',\n error: '✕',\n}\n\n/**\n * A component to display payment status with appropriate styling.\n *\n * @param props - Component props.\n * @returns The status display element.\n *\n * @example\n * ```tsx\n * import { PaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const [status, setStatus] = useState(\"idle\");\n *\n * return (\n * <PaymentStatus\n * status={status}\n * message={status === \"loading\" ? \"Processing payment...\" : undefined}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentStatus({ status, message, className = '' }: PaymentStatusProps) {\n const statusStyle = statusStyles[status] || statusStyles.idle\n\n const defaultMessages: Record<string, string> = {\n idle: 'Ready to pay',\n loading: 'Processing...',\n success: 'Payment successful',\n error: 'Payment failed',\n }\n\n const displayMessage = message || defaultMessages[status]\n\n return (\n <div\n style={{ ...baseStyles, ...statusStyle }}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n >\n {status === 'loading' ? (\n <Spinner size=\"sm\" />\n ) : (\n <span style={{ fontSize: '16px' }}>{icons[status]}</span>\n )}\n <span>{displayMessage}</span>\n </div>\n )\n}\n","import type { PaymentRequirements } from '@t402/core/types'\n\n// Chain configuration constants\n\n/** EVM Chain IDs (CAIP-2 format: eip155:chainId) */\nexport const EVM_CHAIN_IDS = {\n ETHEREUM_MAINNET: '1',\n BASE_MAINNET: '8453',\n BASE_SEPOLIA: '84532',\n ARBITRUM_MAINNET: '42161',\n ARBITRUM_SEPOLIA: '421614',\n} as const\n\n/** Solana Network References (CAIP-2 format: solana:genesisHash) */\nexport const SOLANA_NETWORK_REFS = {\n MAINNET: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n} as const\n\n/** TON Network References (CAIP-2 format: ton:workchain) */\nexport const TON_NETWORK_REFS = {\n MAINNET: '-239',\n TESTNET: '-3',\n} as const\n\n/** TRON Network References */\nexport const TRON_NETWORK_REFS = {\n MAINNET: 'mainnet',\n NILE: 'nile',\n SHASTA: 'shasta',\n} as const\n\n/**\n * Normalizes payment requirements into an array.\n *\n * @param paymentRequirements - A single requirement or array of requirements.\n * @returns An array of payment requirements.\n */\nexport function normalizePaymentRequirements(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n): PaymentRequirements[] {\n if (Array.isArray(paymentRequirements)) {\n return paymentRequirements\n }\n return [paymentRequirements]\n}\n\n/**\n * Returns preferred networks for payment selection.\n *\n * @param testnet - Whether to prefer testnet networks.\n * @returns Ordered list of preferred networks (CAIP-2 format).\n */\nexport function getPreferredNetworks(testnet: boolean): string[] {\n if (testnet) {\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_SEPOLIA}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_SEPOLIA}`,\n `solana:${SOLANA_NETWORK_REFS.DEVNET}`,\n ]\n }\n return [\n `eip155:${EVM_CHAIN_IDS.BASE_MAINNET}`,\n `eip155:${EVM_CHAIN_IDS.ARBITRUM_MAINNET}`,\n `solana:${SOLANA_NETWORK_REFS.MAINNET}`,\n ]\n}\n\n/**\n * Selects the most appropriate payment requirement.\n *\n * @param paymentRequirements - Available payment requirements.\n * @param testnet - Whether to prefer testnet networks.\n * @returns The selected payment requirement.\n */\nexport function choosePaymentRequirement(\n paymentRequirements: PaymentRequirements | PaymentRequirements[],\n testnet: boolean,\n): PaymentRequirements {\n const normalized = normalizePaymentRequirements(paymentRequirements)\n const preferredNetworks = getPreferredNetworks(testnet)\n\n for (const preferredNetwork of preferredNetworks) {\n const match = normalized.find((req) => req.network === preferredNetwork)\n if (match) {\n return match\n }\n }\n\n return normalized[0]\n}\n\n/**\n * Determines if the network is EVM-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is EVM-based.\n */\nexport function isEvmNetwork(network: string): boolean {\n return network.startsWith('eip155:')\n}\n\n/**\n * Determines if the network is Solana-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is Solana-based.\n */\nexport function isSvmNetwork(network: string): boolean {\n return network.startsWith('solana:')\n}\n\n/**\n * Determines if the network is TON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TON-based.\n */\nexport function isTonNetwork(network: string): boolean {\n return network.startsWith('ton:')\n}\n\n/**\n * Determines if the network is TRON-based.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is TRON-based.\n */\nexport function isTronNetwork(network: string): boolean {\n return network.startsWith('tron:')\n}\n\n/** Known EVM chain names */\nconst EVM_CHAIN_NAMES: Record<string, string> = {\n '1': 'Ethereum',\n '10': 'Optimism',\n '137': 'Polygon',\n '8453': 'Base',\n '42161': 'Arbitrum One',\n '84532': 'Base Sepolia',\n '421614': 'Arbitrum Sepolia',\n '11155111': 'Sepolia',\n}\n\n/**\n * Gets a human-readable display name for a network.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns A display name suitable for UI use.\n */\nexport function getNetworkDisplayName(network: string): string {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return EVM_CHAIN_NAMES[chainId] ?? `Chain ${chainId}`\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET ? 'Solana Devnet' : 'Solana'\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET ? 'TON Testnet' : 'TON'\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n if (ref === TRON_NETWORK_REFS.NILE) return 'TRON Nile'\n if (ref === TRON_NETWORK_REFS.SHASTA) return 'TRON Shasta'\n return 'TRON'\n }\n\n return network\n}\n\n/** Known testnet chain IDs */\nconst TESTNET_CHAIN_IDS = new Set(['84532', '421614', '11155111', '80001', '97'])\n\n/**\n * Determines if the network is a testnet.\n *\n * @param network - The network identifier (CAIP-2 format).\n * @returns True if the network is a testnet.\n */\nexport function isTestnetNetwork(network: string): boolean {\n if (network.startsWith('eip155:')) {\n const chainId = network.split(':')[1]\n return TESTNET_CHAIN_IDS.has(chainId)\n }\n\n if (network.startsWith('solana:')) {\n const ref = network.split(':')[1]\n return ref === SOLANA_NETWORK_REFS.DEVNET\n }\n\n if (network.startsWith('ton:')) {\n const ref = network.split(':')[1]\n return ref === TON_NETWORK_REFS.TESTNET\n }\n\n if (network.startsWith('tron:')) {\n const ref = network.split(':')[1]\n return ref === TRON_NETWORK_REFS.NILE || ref === TRON_NETWORK_REFS.SHASTA\n }\n\n return false\n}\n\n/**\n * Truncates an address for display.\n *\n * @param address - The full address.\n * @param startChars - Number of characters to show at start (default: 6).\n * @param endChars - Number of characters to show at end (default: 4).\n * @returns The truncated address.\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (address.length <= startChars + endChars + 3) {\n return address\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`\n}\n\n/**\n * Formats a token amount for display.\n *\n * @param amount - The amount as a string (in smallest unit).\n * @param decimals - The token decimals (default: 6 for USDT).\n * @param maxDecimals - Maximum decimal places to show (default: 2).\n * @returns The formatted amount.\n */\nexport function formatTokenAmount(amount: string, decimals = 6, maxDecimals = 2): string {\n const value = BigInt(amount)\n const divisor = BigInt(10 ** decimals)\n const integerPart = value / divisor\n const fractionalPart = value % divisor\n\n if (fractionalPart === 0n) {\n return integerPart.toString()\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const trimmed = fractionalStr.slice(0, maxDecimals).replace(/0+$/, '')\n\n if (trimmed === '') {\n return integerPart.toString()\n }\n\n return `${integerPart}.${trimmed}`\n}\n\n/**\n * Gets the asset display name.\n *\n * @param asset - The asset identifier (e.g., \"usdt\", \"usdt0\").\n * @returns A display name suitable for UI use.\n */\nexport function getAssetDisplayName(asset: string): string {\n const assetLower = asset.toLowerCase()\n\n switch (assetLower) {\n case 'usdt':\n return 'USDT'\n case 'usdt0':\n return 'USDT0'\n case 'usdc':\n return 'USDC'\n default:\n return asset.toUpperCase()\n }\n}\n","import React from 'react'\nimport type { PaymentDetailsProps } from '../types/index.js'\nimport {\n formatTokenAmount,\n getNetworkDisplayName,\n getAssetDisplayName,\n truncateAddress,\n} from '../utils/index.js'\n\nconst containerStyles: React.CSSProperties = {\n backgroundColor: '#f9fafb',\n borderRadius: '12px',\n padding: '16px',\n border: '1px solid #e5e7eb',\n}\n\nconst rowStyles: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 0',\n borderBottom: '1px solid #e5e7eb',\n}\n\nconst lastRowStyles: React.CSSProperties = {\n ...rowStyles,\n borderBottom: 'none',\n}\n\nconst labelStyles: React.CSSProperties = {\n color: '#6b7280',\n fontSize: '14px',\n}\n\nconst valueStyles: React.CSSProperties = {\n color: '#111827',\n fontSize: '14px',\n fontWeight: 500,\n}\n\nconst amountStyles: React.CSSProperties = {\n color: '#111827',\n fontSize: '20px',\n fontWeight: 700,\n}\n\n/**\n * A component to display payment requirement details.\n *\n * @param props - Component props.\n * @returns The payment details element.\n *\n * @example\n * ```tsx\n * import { PaymentDetails } from \"@t402/react\";\n *\n * function PaymentFlow({ requirement }) {\n * return (\n * <PaymentDetails\n * requirement={requirement}\n * showNetwork={true}\n * showAsset={true}\n * showRecipient={true}\n * />\n * );\n * }\n * ```\n */\nexport function PaymentDetails({\n requirement,\n showNetwork = true,\n showAsset = true,\n showRecipient = false,\n className = '',\n}: PaymentDetailsProps) {\n const formattedAmount = formatTokenAmount(requirement.amount)\n const assetName = getAssetDisplayName(requirement.asset)\n const networkName = getNetworkDisplayName(requirement.network)\n const truncatedAddress = truncateAddress(requirement.payTo)\n\n return (\n <div style={containerStyles} className={className}>\n {/* Amount row - always shown */}\n <div style={rowStyles}>\n <span style={labelStyles}>Amount</span>\n <span style={amountStyles}>\n {formattedAmount} {assetName}\n </span>\n </div>\n\n {/* Network row */}\n {showNetwork && (\n <div style={rowStyles}>\n <span style={labelStyles}>Network</span>\n <span style={valueStyles}>{networkName}</span>\n </div>\n )}\n\n {/* Asset row */}\n {showAsset && (\n <div style={rowStyles}>\n <span style={labelStyles}>Asset</span>\n <span style={valueStyles}>{assetName}</span>\n </div>\n )}\n\n {/* Recipient row */}\n {showRecipient && (\n <div style={lastRowStyles}>\n <span style={labelStyles}>Recipient</span>\n <span style={{ ...valueStyles, fontFamily: 'monospace' }} title={requirement.payTo}>\n {truncatedAddress}\n </span>\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport type { AddressDisplayProps } from '../types/index.js'\nimport { truncateAddress } from '../utils/index.js'\n\nconst containerStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'monospace',\n fontSize: '14px',\n}\n\nconst addressStyles: React.CSSProperties = {\n color: '#374151',\n}\n\nconst buttonStyles: React.CSSProperties = {\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n color: '#6b7280',\n transition: 'all 0.15s ease',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n}\n\nconst copiedStyles: React.CSSProperties = {\n ...buttonStyles,\n color: '#22c55e',\n}\n\n/**\n * A component to display blockchain addresses with optional copy functionality.\n *\n * @param props - Component props.\n * @returns The address display element.\n *\n * @example\n * ```tsx\n * import { AddressDisplay } from \"@t402/react\";\n *\n * function WalletInfo() {\n * return (\n * <AddressDisplay\n * address=\"0x1234567890abcdef1234567890abcdef12345678\"\n * copyable={true}\n * startChars={6}\n * endChars={4}\n * />\n * );\n * }\n * ```\n */\nexport function AddressDisplay({\n address,\n startChars = 6,\n endChars = 4,\n copyable = false,\n className = '',\n}: AddressDisplayProps) {\n const [copied, setCopied] = useState(false)\n\n const displayAddress = truncateAddress(address, startChars, endChars)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(address)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = address\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }, [address])\n\n return (\n <span style={containerStyles} className={className} title={address}>\n <span style={addressStyles}>{displayAddress}</span>\n {copyable && (\n <button\n type=\"button\"\n onClick={handleCopy}\n style={copied ? copiedStyles : buttonStyles}\n aria-label={copied ? 'Copied' : 'Copy address'}\n >\n {copied ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )}\n </button>\n )}\n </span>\n )\n}\n","import { useState, useCallback } from 'react'\nimport type { PaymentRequired } from '@t402/core/types'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UsePaymentRequiredOptions {\n /** Callback when payment is successful */\n onSuccess?: (response: Response) => void\n /** Callback when payment fails */\n onError?: (error: Error) => void\n}\n\ninterface UsePaymentRequiredResult {\n /** The payment required data from a 402 response */\n paymentRequired: PaymentRequired | null\n /** Current status of the fetch operation */\n status: PaymentStatus\n /** Error message if status is 'error' */\n error: string | null\n /** Fetch a resource and capture 402 response */\n fetchResource: (url: string, options?: RequestInit) => Promise<Response | null>\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Hook to fetch a resource and capture 402 Payment Required responses.\n *\n * @param options - Configuration options.\n * @returns State and methods for handling 402 responses.\n *\n * @example\n * ```tsx\n * import { usePaymentRequired } from \"@t402/react\";\n *\n * function ProtectedResource() {\n * const { paymentRequired, status, fetchResource } = usePaymentRequired({\n * onSuccess: (response) => console.log(\"Access granted!\"),\n * });\n *\n * const handleFetch = async () => {\n * const response = await fetchResource(\"/api/protected\");\n * if (response && response.ok) {\n * const data = await response.json();\n * // Handle successful response\n * }\n * };\n *\n * if (paymentRequired) {\n * return <PaymentUI data={paymentRequired} />;\n * }\n *\n * return <button onClick={handleFetch}>Access Resource</button>;\n * }\n * ```\n */\nexport function usePaymentRequired(\n options: UsePaymentRequiredOptions = {},\n): UsePaymentRequiredResult {\n const { onSuccess, onError } = options\n\n const [paymentRequired, setPaymentRequired] = useState<PaymentRequired | null>(null)\n const [status, setStatus] = useState<PaymentStatus>('idle')\n const [error, setError] = useState<string | null>(null)\n\n const fetchResource = useCallback(\n async (url: string, fetchOptions?: RequestInit): Promise<Response | null> => {\n setStatus('loading')\n setError(null)\n setPaymentRequired(null)\n\n try {\n const response = await fetch(url, fetchOptions)\n\n if (response.status === 402) {\n const data = (await response.json()) as PaymentRequired\n setPaymentRequired(data)\n setStatus('idle')\n return null\n }\n\n if (response.ok) {\n setStatus('success')\n onSuccess?.(response)\n return response\n }\n\n throw new Error(`Request failed with status ${response.status}`)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error'\n setError(errorMessage)\n setStatus('error')\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n },\n [onSuccess, onError],\n )\n\n const reset = useCallback(() => {\n setPaymentRequired(null)\n setStatus('idle')\n setError(null)\n }, [])\n\n return {\n paymentRequired,\n status,\n error,\n fetchResource,\n reset,\n }\n}\n","import { useState, useCallback } from 'react'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface StatusMessage {\n /** Message text */\n text: string\n /** Message type */\n type: 'info' | 'success' | 'error' | 'warning'\n /** Optional auto-dismiss timeout in ms */\n timeout?: number\n}\n\ninterface UsePaymentStatusResult {\n /** Current payment status */\n status: PaymentStatus\n /** Current status message */\n message: StatusMessage | null\n /** Set the status */\n setStatus: (status: PaymentStatus, message?: string) => void\n /** Set a success message */\n setSuccess: (message: string, timeout?: number) => void\n /** Set an error message */\n setError: (message: string) => void\n /** Set an info message */\n setInfo: (message: string, timeout?: number) => void\n /** Set a warning message */\n setWarning: (message: string, timeout?: number) => void\n /** Clear the current message */\n clearMessage: () => void\n /** Reset to idle state */\n reset: () => void\n}\n\n/**\n * Hook for managing payment status and status messages.\n *\n * @returns State and methods for status management.\n *\n * @example\n * ```tsx\n * import { usePaymentStatus } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const {\n * status,\n * message,\n * setStatus,\n * setSuccess,\n * setError,\n * } = usePaymentStatus();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\", \"Processing payment...\");\n * try {\n * await processPayment();\n * setSuccess(\"Payment successful!\", 3000);\n * } catch (err) {\n * setError(\"Payment failed. Please try again.\");\n * }\n * };\n *\n * return (\n * <div>\n * {message && <StatusMessage message={message} />}\n * <button onClick={handlePayment} disabled={status === \"loading\"}>\n * Pay Now\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePaymentStatus(): UsePaymentStatusResult {\n const [status, setStatusState] = useState<PaymentStatus>('idle')\n const [message, setMessage] = useState<StatusMessage | null>(null)\n\n const scheduleMessageClear = useCallback((timeout?: number) => {\n if (timeout && timeout > 0) {\n setTimeout(() => {\n setMessage(null)\n }, timeout)\n }\n }, [])\n\n const setStatus = useCallback((newStatus: PaymentStatus, messageText?: string) => {\n setStatusState(newStatus)\n if (messageText) {\n const type = newStatus === 'error' ? 'error' : newStatus === 'success' ? 'success' : 'info'\n setMessage({ text: messageText, type })\n }\n }, [])\n\n const setSuccess = useCallback(\n (text: string, timeout?: number) => {\n setStatusState('success')\n setMessage({ text, type: 'success', timeout })\n scheduleMessageClear(timeout)\n },\n [scheduleMessageClear],\n )\n\n const setError = useCallback((text: string) => {\n setStatusState('error')\n setMessage({ text, type: 'error' })\n }, [])\n\n const setInfo = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: 'info', timeout })\n scheduleMessageClear(timeout)\n },\n [scheduleMessageClear],\n )\n\n const setWarning = useCallback(\n (text: string, timeout?: number) => {\n setMessage({ text, type: 'warning', timeout })\n scheduleMessageClear(timeout)\n },\n [scheduleMessageClear],\n )\n\n const clearMessage = useCallback(() => {\n setMessage(null)\n }, [])\n\n const reset = useCallback(() => {\n setStatusState('idle')\n setMessage(null)\n }, [])\n\n return {\n status,\n message,\n setStatus,\n setSuccess,\n setError,\n setInfo,\n setWarning,\n clearMessage,\n reset,\n }\n}\n","import { useState, useCallback, useRef } from 'react'\nimport type { PaymentStatus } from '../types/index.js'\n\ninterface UseAsyncPaymentOptions<T> {\n /** The async payment function to execute */\n paymentFn: () => Promise<T>\n /** Callback on successful payment */\n onSuccess?: (result: T) => void\n /** Callback on payment error */\n onError?: (error: Error) => void\n /** Callback when payment starts */\n onStart?: () => void\n}\n\ninterface UseAsyncPaymentResult<T> {\n /** Execute the payment */\n execute: () => Promise<T | null>\n /** Current payment status */\n status: PaymentStatus\n /** Result of successful payment */\n result: T | null\n /** Error message if payment failed */\n error: string | null\n /** Whether payment is in progress */\n isLoading: boolean\n /** Whether payment succeeded */\n isSuccess: boolean\n /** Whether payment failed */\n isError: boolean\n /** Reset the state */\n reset: () => void\n}\n\n/**\n * Hook for managing async payment operations with loading states.\n *\n * @param options - Configuration including the payment function and callbacks.\n * @returns State and methods for managing the async payment.\n *\n * @example\n * ```tsx\n * import { useAsyncPayment } from \"@t402/react\";\n *\n * function PaymentButton({ paymentPayload }) {\n * const { execute, isLoading, isSuccess, error } = useAsyncPayment({\n * paymentFn: async () => {\n * const response = await fetch(\"/api/protected\", {\n * headers: { \"X-Payment\": paymentPayload },\n * });\n * return response.json();\n * },\n * onSuccess: (data) => console.log(\"Payment succeeded:\", data),\n * onError: (err) => console.error(\"Payment failed:\", err),\n * });\n *\n * return (\n * <button onClick={execute} disabled={isLoading}>\n * {isLoading ? \"Processing...\" : \"Pay Now\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useAsyncPayment<T>(options: UseAsyncPaymentOptions<T>): UseAsyncPaymentResult<T> {\n const { paymentFn, onSuccess, onError, onStart } = options\n\n const [status, setStatus] = useState<PaymentStatus>('idle')\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n // Use ref to track if component is mounted\n const isMountedRef = useRef(true)\n\n const execute = useCallback(async (): Promise<T | null> => {\n setStatus('loading')\n setError(null)\n onStart?.()\n\n try {\n const paymentResult = await paymentFn()\n\n if (isMountedRef.current) {\n setResult(paymentResult)\n setStatus('success')\n onSuccess?.(paymentResult)\n }\n\n return paymentResult\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Payment failed'\n\n if (isMountedRef.current) {\n setError(errorMessage)\n setStatus('error')\n }\n\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n return null\n }\n }, [paymentFn, onSuccess, onError, onStart])\n\n const reset = useCallback(() => {\n setStatus('idle')\n setResult(null)\n setError(null)\n }, [])\n\n return {\n execute,\n status,\n result,\n error,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n reset,\n }\n}\n","import { createContext, useContext, useState, useCallback, useMemo } from 'react'\nimport type { PaymentRequired, PaymentRequirements } from '@t402/core/types'\nimport type {\n PaymentState,\n PaymentContextValue,\n PaymentProviderProps,\n PaymentStatus,\n} from '../types/index.js'\nimport { choosePaymentRequirement, isTestnetNetwork } from '../utils/index.js'\n\nconst initialState: PaymentState = {\n status: 'idle',\n error: null,\n paymentRequired: null,\n selectedRequirement: null,\n isTestnet: false,\n}\n\nconst PaymentContext = createContext<PaymentContextValue | null>(null)\n\n/**\n * Payment context provider for t402 payment state management.\n *\n * @param props - Provider props including children and initial state.\n * @returns The provider component wrapping children.\n *\n * @example\n * ```tsx\n * import { PaymentProvider } from \"@t402/react\";\n *\n * function App() {\n * return (\n * <PaymentProvider testnet={true}>\n * <PaymentFlow />\n * </PaymentProvider>\n * );\n * }\n * ```\n */\nexport function PaymentProvider({\n children,\n initialPaymentRequired,\n testnet = false,\n}: PaymentProviderProps) {\n const [state, setState] = useState<PaymentState>(() => {\n if (initialPaymentRequired) {\n const selectedRequirement = choosePaymentRequirement(initialPaymentRequired.accepts, testnet)\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network)\n\n return {\n status: 'idle',\n error: null,\n paymentRequired: initialPaymentRequired,\n selectedRequirement,\n isTestnet: testnet || detectedTestnet,\n }\n }\n return { ...initialState, isTestnet: testnet }\n })\n\n const setPaymentRequired = useCallback(\n (data: PaymentRequired) => {\n const selectedRequirement = choosePaymentRequirement(data.accepts, state.isTestnet)\n const detectedTestnet = isTestnetNetwork(selectedRequirement.network)\n\n setState((prev) => ({\n ...prev,\n paymentRequired: data,\n selectedRequirement,\n isTestnet: prev.isTestnet || detectedTestnet,\n error: null,\n }))\n },\n [state.isTestnet],\n )\n\n const selectRequirement = useCallback((requirement: PaymentRequirements) => {\n setState((prev) => ({\n ...prev,\n selectedRequirement: requirement,\n isTestnet: isTestnetNetwork(requirement.network),\n }))\n }, [])\n\n const setStatus = useCallback((status: PaymentStatus) => {\n setState((prev) => ({\n ...prev,\n status,\n error: status === 'error' ? prev.error : null,\n }))\n }, [])\n\n const setError = useCallback((error: string | null) => {\n setState((prev) => ({\n ...prev,\n error,\n status: error ? 'error' : prev.status,\n }))\n }, [])\n\n const reset = useCallback(() => {\n setState({ ...initialState, isTestnet: testnet })\n }, [testnet])\n\n const value = useMemo<PaymentContextValue>(\n () => ({\n ...state,\n setPaymentRequired,\n selectRequirement,\n setStatus,\n setError,\n reset,\n }),\n [state, setPaymentRequired, selectRequirement, setStatus, setError, reset],\n )\n\n return <PaymentContext.Provider value={value}>{children}</PaymentContext.Provider>\n}\n\n/**\n * Hook to access the payment context.\n *\n * @returns The payment context value.\n * @throws Error if used outside of PaymentProvider.\n *\n * @example\n * ```tsx\n * import { usePaymentContext } from \"@t402/react\";\n *\n * function PaymentFlow() {\n * const { status, selectedRequirement, setStatus } = usePaymentContext();\n *\n * const handlePayment = async () => {\n * setStatus(\"loading\");\n * // ... payment logic\n * };\n *\n * return <button onClick={handlePayment}>Pay</button>;\n * }\n * ```\n */\nexport function usePaymentContext(): PaymentContextValue {\n const context = useContext(PaymentContext)\n\n if (!context) {\n throw new Error('usePaymentContext must be used within a PaymentProvider')\n }\n\n return context\n}\n\nexport { PaymentContext }\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t402/react",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"main": "./dist/cjs/index.js",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -30,19 +30,20 @@
|
|
|
30
30
|
"eslint-plugin-import": "^2.31.0",
|
|
31
31
|
"eslint-plugin-jsdoc": "^50.6.9",
|
|
32
32
|
"eslint-plugin-prettier": "^5.2.6",
|
|
33
|
-
"
|
|
33
|
+
"glob": "^13.0.0",
|
|
34
|
+
"jsdom": "^26.1.0",
|
|
34
35
|
"prettier": "3.5.2",
|
|
35
36
|
"react": "^19.0.0",
|
|
36
37
|
"react-dom": "^19.0.0",
|
|
37
38
|
"tsup": "^8.4.0",
|
|
38
|
-
"tsx": "^4.
|
|
39
|
+
"tsx": "^4.21.0",
|
|
39
40
|
"typescript": "^5.7.3",
|
|
40
|
-
"vite": "^
|
|
41
|
+
"vite": "^7.3.1",
|
|
41
42
|
"vite-tsconfig-paths": "^5.1.4",
|
|
42
|
-
"vitest": "^3.
|
|
43
|
+
"vitest": "^3.2.4"
|
|
43
44
|
},
|
|
44
45
|
"dependencies": {
|
|
45
|
-
"@t402/core": "2.
|
|
46
|
+
"@t402/core": "2.3.1"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|
|
48
49
|
"react": "^18.0.0 || ^19.0.0",
|