@tagadapay/headless-sdk 1.8.0-rc.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +216 -1
  2. package/dist/core/client.d.ts +68 -0
  3. package/dist/core/client.d.ts.map +1 -0
  4. package/dist/core/client.js +73 -0
  5. package/dist/core/client.js.map +1 -0
  6. package/dist/core/errors.d.ts +53 -0
  7. package/dist/core/errors.d.ts.map +1 -0
  8. package/dist/core/errors.js +58 -0
  9. package/dist/core/errors.js.map +1 -0
  10. package/dist/core/helpers/autocomplete.d.ts +89 -0
  11. package/dist/core/helpers/autocomplete.d.ts.map +1 -0
  12. package/dist/core/helpers/autocomplete.js +186 -0
  13. package/dist/core/helpers/autocomplete.js.map +1 -0
  14. package/dist/core/helpers/countries.d.ts +45 -0
  15. package/dist/core/helpers/countries.d.ts.map +1 -0
  16. package/dist/core/helpers/countries.js +65 -0
  17. package/dist/core/helpers/countries.js.map +1 -0
  18. package/dist/core/helpers/currency.d.ts +26 -0
  19. package/dist/core/helpers/currency.d.ts.map +1 -0
  20. package/dist/core/helpers/currency.js +72 -0
  21. package/dist/core/helpers/currency.js.map +1 -0
  22. package/dist/core/helpers/index.d.ts +6 -0
  23. package/dist/core/helpers/index.d.ts.map +1 -0
  24. package/dist/core/helpers/index.js +6 -0
  25. package/dist/core/helpers/index.js.map +1 -0
  26. package/dist/core/helpers/iso3166.d.ts +28 -0
  27. package/dist/core/helpers/iso3166.d.ts.map +1 -0
  28. package/dist/core/helpers/iso3166.js +84 -0
  29. package/dist/core/helpers/iso3166.js.map +1 -0
  30. package/dist/core/helpers/walletContact.d.ts +67 -0
  31. package/dist/core/helpers/walletContact.d.ts.map +1 -0
  32. package/dist/core/helpers/walletContact.js +71 -0
  33. package/dist/core/helpers/walletContact.js.map +1 -0
  34. package/dist/core/http.d.ts +27 -0
  35. package/dist/core/http.d.ts.map +1 -0
  36. package/dist/core/http.js +125 -0
  37. package/dist/core/http.js.map +1 -0
  38. package/dist/core/index.d.ts +15 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +13 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/core/modules/catalog.d.ts +27 -0
  43. package/dist/core/modules/catalog.d.ts.map +1 -0
  44. package/dist/core/modules/catalog.js +38 -0
  45. package/dist/core/modules/catalog.js.map +1 -0
  46. package/dist/core/modules/checkout.d.ts +268 -0
  47. package/dist/core/modules/checkout.d.ts.map +1 -0
  48. package/dist/core/modules/checkout.js +470 -0
  49. package/dist/core/modules/checkout.js.map +1 -0
  50. package/dist/core/modules/customer.d.ts +33 -0
  51. package/dist/core/modules/customer.d.ts.map +1 -0
  52. package/dist/core/modules/customer.js +53 -0
  53. package/dist/core/modules/customer.js.map +1 -0
  54. package/dist/core/modules/funnel.d.ts +38 -0
  55. package/dist/core/modules/funnel.d.ts.map +1 -0
  56. package/dist/core/modules/funnel.js +143 -0
  57. package/dist/core/modules/funnel.js.map +1 -0
  58. package/dist/core/modules/offers.d.ts +137 -0
  59. package/dist/core/modules/offers.d.ts.map +1 -0
  60. package/dist/core/modules/offers.js +141 -0
  61. package/dist/core/modules/offers.js.map +1 -0
  62. package/dist/core/modules/payment.d.ts +353 -0
  63. package/dist/core/modules/payment.d.ts.map +1 -0
  64. package/dist/core/modules/payment.js +784 -0
  65. package/dist/core/modules/payment.js.map +1 -0
  66. package/dist/core/modules/rx.d.ts +162 -0
  67. package/dist/core/modules/rx.d.ts.map +1 -0
  68. package/dist/core/modules/rx.js +46 -0
  69. package/dist/core/modules/rx.js.map +1 -0
  70. package/dist/core/types.d.ts +532 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +5 -0
  73. package/dist/core/types.js.map +1 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/react/hooks/useCatalog.d.ts +25 -0
  77. package/dist/react/hooks/useCatalog.d.ts.map +1 -0
  78. package/dist/react/hooks/useCatalog.js +58 -0
  79. package/dist/react/hooks/useCatalog.js.map +1 -0
  80. package/dist/react/hooks/useCheckout.d.ts +58 -0
  81. package/dist/react/hooks/useCheckout.d.ts.map +1 -0
  82. package/dist/react/hooks/useCheckout.js +177 -0
  83. package/dist/react/hooks/useCheckout.js.map +1 -0
  84. package/dist/react/hooks/useCustomer.d.ts +28 -0
  85. package/dist/react/hooks/useCustomer.d.ts.map +1 -0
  86. package/dist/react/hooks/useCustomer.js +77 -0
  87. package/dist/react/hooks/useCustomer.js.map +1 -0
  88. package/dist/react/hooks/useGoogleAutocomplete.d.ts +26 -0
  89. package/dist/react/hooks/useGoogleAutocomplete.d.ts.map +1 -0
  90. package/dist/react/hooks/useGoogleAutocomplete.js +70 -0
  91. package/dist/react/hooks/useGoogleAutocomplete.js.map +1 -0
  92. package/dist/react/hooks/useISOData.d.ts +23 -0
  93. package/dist/react/hooks/useISOData.d.ts.map +1 -0
  94. package/dist/react/hooks/useISOData.js +63 -0
  95. package/dist/react/hooks/useISOData.js.map +1 -0
  96. package/dist/react/hooks/useOffers.d.ts +134 -0
  97. package/dist/react/hooks/useOffers.d.ts.map +1 -0
  98. package/dist/react/hooks/useOffers.js +171 -0
  99. package/dist/react/hooks/useOffers.js.map +1 -0
  100. package/dist/react/hooks/usePayment.d.ts +117 -0
  101. package/dist/react/hooks/usePayment.d.ts.map +1 -0
  102. package/dist/react/hooks/usePayment.js +233 -0
  103. package/dist/react/hooks/usePayment.js.map +1 -0
  104. package/dist/react/hooks/useRx.d.ts +64 -0
  105. package/dist/react/hooks/useRx.d.ts.map +1 -0
  106. package/dist/react/hooks/useRx.js +145 -0
  107. package/dist/react/hooks/useRx.js.map +1 -0
  108. package/dist/react/index.d.ts +22 -0
  109. package/dist/react/index.d.ts.map +1 -0
  110. package/dist/react/index.js +12 -0
  111. package/dist/react/index.js.map +1 -0
  112. package/dist/react/internal/redirectGuard.d.ts +9 -0
  113. package/dist/react/internal/redirectGuard.d.ts.map +1 -0
  114. package/dist/react/internal/redirectGuard.js +25 -0
  115. package/dist/react/internal/redirectGuard.js.map +1 -0
  116. package/dist/react/provider.d.ts +31 -0
  117. package/dist/react/provider.d.ts.map +1 -0
  118. package/dist/react/provider.js +32 -0
  119. package/dist/react/provider.js.map +1 -0
  120. package/dist/stripe/StripeExpressButton.d.ts +30 -0
  121. package/dist/stripe/StripeExpressButton.d.ts.map +1 -0
  122. package/dist/stripe/StripeExpressButton.js +32 -0
  123. package/dist/stripe/StripeExpressButton.js.map +1 -0
  124. package/dist/stripe/StripeExpressCheckout.d.ts +109 -0
  125. package/dist/stripe/StripeExpressCheckout.d.ts.map +1 -0
  126. package/dist/stripe/StripeExpressCheckout.js +242 -0
  127. package/dist/stripe/StripeExpressCheckout.js.map +1 -0
  128. package/dist/stripe/index.d.ts +8 -0
  129. package/dist/stripe/index.d.ts.map +1 -0
  130. package/dist/stripe/index.js +15 -0
  131. package/dist/stripe/index.js.map +1 -0
  132. package/dist/stripe/useStripeExpress.d.ts +54 -0
  133. package/dist/stripe/useStripeExpress.d.ts.map +1 -0
  134. package/dist/stripe/useStripeExpress.js +125 -0
  135. package/dist/stripe/useStripeExpress.js.map +1 -0
  136. package/dist/tagada-headless-react.min.js +8 -0
  137. package/dist/tagada-headless-react.min.js.map +7 -0
  138. package/dist/tagada-headless.js +2423 -0
  139. package/dist/tagada-headless.min.js +8 -0
  140. package/dist/tagada-headless.min.js.map +7 -0
  141. package/package.json +79 -73
@@ -0,0 +1,233 @@
1
+ import { useState, useCallback, useRef, useEffect } from 'react';
2
+ import { useHeadlessClient } from '../provider.js';
3
+ import { tryClaimResume } from '../internal/redirectGuard.js';
4
+ /**
5
+ * React hook for payment processing.
6
+ *
7
+ * Handles the full payment lifecycle including 3DS redirects and return-URL detection.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { processPayment, isProcessing, error } = usePayment({
12
+ * onPaymentSuccess: (result) => router.push('/confirmation'),
13
+ * onPaymentFailed: (result) => toast.error(result.error),
14
+ * });
15
+ *
16
+ * // On submit — one function handles everything
17
+ * const result = await processPayment({
18
+ * checkoutSessionId: session.id,
19
+ * tagadaToken,
20
+ * });
21
+ * ```
22
+ */
23
+ export function usePayment(options) {
24
+ const client = useHeadlessClient();
25
+ const [paymentSetup, setPaymentSetup] = useState(null);
26
+ const [expressMethods, setExpressMethods] = useState(null);
27
+ const [storeConfig, setStoreConfig] = useState(null);
28
+ const [isProcessing, setIsProcessing] = useState(false);
29
+ const [result, setResult] = useState(null);
30
+ const [error, setError] = useState(null);
31
+ const loadedRef = useRef(false);
32
+ const redirectReturnProcessedRef = useRef(false);
33
+ const optionsRef = useRef(options);
34
+ optionsRef.current = options;
35
+ // ---------------------------------------------------------------------------
36
+ // Return-URL detection: auto-resume after 3DS / processor redirect
37
+ // ---------------------------------------------------------------------------
38
+ useEffect(() => {
39
+ if (typeof window === 'undefined')
40
+ return;
41
+ if (redirectReturnProcessedRef.current)
42
+ return;
43
+ const params = new URLSearchParams(window.location.search);
44
+ const paymentAction = params.get('paymentAction');
45
+ const paymentActionStatus = params.get('paymentActionStatus');
46
+ const paymentId = params.get('paymentId');
47
+ if (paymentAction !== 'requireAction' || paymentActionStatus !== 'completed' || !paymentId) {
48
+ return;
49
+ }
50
+ redirectReturnProcessedRef.current = true;
51
+ if (!tryClaimResume(paymentId)) {
52
+ // Another hook (likely useOffers) already started the resume for this
53
+ // paymentId; don't double-poll or double-fire callbacks.
54
+ return;
55
+ }
56
+ setIsProcessing(true);
57
+ setError(null);
58
+ const resume = async () => {
59
+ try {
60
+ const resumeResult = await client.payment.resumeAfterRedirect(paymentId);
61
+ // Clean payment-related query params from URL
62
+ const cleanParams = new URLSearchParams(window.location.search);
63
+ ['paymentAction', 'paymentActionStatus', 'paymentId', 'payment_intent', 'payment_intent_client_secret', 'source_type', 'redirect_status'].forEach((p) => cleanParams.delete(p));
64
+ const newUrl = cleanParams.toString()
65
+ ? `${window.location.pathname}?${cleanParams.toString()}`
66
+ : window.location.pathname;
67
+ window.history.replaceState({}, document.title, newUrl);
68
+ if (resumeResult.status === 'succeeded') {
69
+ optionsRef.current?.onPaymentSuccess?.(resumeResult);
70
+ }
71
+ else if (resumeResult.status === 'failed') {
72
+ setError(new Error(resumeResult.error));
73
+ optionsRef.current?.onPaymentFailed?.(resumeResult);
74
+ }
75
+ }
76
+ catch (err) {
77
+ setError(err instanceof Error ? err : new Error(String(err)));
78
+ }
79
+ finally {
80
+ setIsProcessing(false);
81
+ }
82
+ };
83
+ void resume();
84
+ }, [client]); // eslint-disable-line react-hooks/exhaustive-deps
85
+ // ---------------------------------------------------------------------------
86
+ // Load payment setup
87
+ // ---------------------------------------------------------------------------
88
+ const loadPaymentSetup = useCallback(async (checkoutSessionId, opts) => {
89
+ if (loadedRef.current)
90
+ return;
91
+ loadedRef.current = true;
92
+ const setupOpts = opts?.paymentSetupConfig
93
+ ? { paymentSetupConfig: opts.paymentSetupConfig }
94
+ : optionsRef.current?.paymentSetupConfig
95
+ ? { paymentSetupConfig: optionsRef.current.paymentSetupConfig }
96
+ : undefined;
97
+ try {
98
+ const [setup, express, config] = await Promise.all([
99
+ client.payment.getPaymentSetup(checkoutSessionId, setupOpts),
100
+ client.payment.getExpressMethods(checkoutSessionId, setupOpts),
101
+ client.payment.getStoreConfig(),
102
+ ]);
103
+ setPaymentSetup(setup);
104
+ setExpressMethods(express);
105
+ setStoreConfig(config);
106
+ }
107
+ catch (err) {
108
+ loadedRef.current = false;
109
+ setError(err instanceof Error ? err : new Error(String(err)));
110
+ }
111
+ }, [client]);
112
+ // ---------------------------------------------------------------------------
113
+ // processPayment — high-level, handles everything
114
+ // ---------------------------------------------------------------------------
115
+ const processPayment = useCallback(async (opts) => {
116
+ setIsProcessing(true);
117
+ setError(null);
118
+ try {
119
+ const payResult = await client.payment.processPayment(opts);
120
+ if (payResult.status === 'requires_redirect') {
121
+ // Browser redirect — the hook will resume on return via the useEffect above
122
+ if (payResult.method === 'POST' && payResult.postData) {
123
+ const form = document.createElement('form');
124
+ form.method = 'POST';
125
+ form.action = payResult.redirectUrl;
126
+ for (const [key, value] of Object.entries(payResult.postData)) {
127
+ const input = document.createElement('input');
128
+ input.type = 'hidden';
129
+ input.name = key;
130
+ input.value = value;
131
+ form.appendChild(input);
132
+ }
133
+ document.body.appendChild(form);
134
+ form.submit();
135
+ }
136
+ else {
137
+ window.location.href = payResult.redirectUrl;
138
+ }
139
+ // Don't setIsProcessing(false) — page is navigating away
140
+ return payResult;
141
+ }
142
+ if (payResult.status === 'succeeded') {
143
+ optionsRef.current?.onPaymentSuccess?.(payResult);
144
+ }
145
+ else if (payResult.status === 'failed') {
146
+ setError(new Error(payResult.error));
147
+ optionsRef.current?.onPaymentFailed?.(payResult);
148
+ }
149
+ return payResult;
150
+ }
151
+ catch (err) {
152
+ const e = err instanceof Error ? err : new Error(String(err));
153
+ setError(e);
154
+ return { status: 'failed', error: e.message };
155
+ }
156
+ finally {
157
+ setIsProcessing(false);
158
+ }
159
+ }, [client]);
160
+ // ---------------------------------------------------------------------------
161
+ // Low-level pay (raw API, no action handling)
162
+ // ---------------------------------------------------------------------------
163
+ const wrapAsync = useCallback((fn) => async () => {
164
+ setIsProcessing(true);
165
+ setError(null);
166
+ try {
167
+ const r = await fn();
168
+ return r;
169
+ }
170
+ catch (err) {
171
+ const e = err instanceof Error ? err : new Error(String(err));
172
+ setError(e);
173
+ throw e;
174
+ }
175
+ finally {
176
+ setIsProcessing(false);
177
+ }
178
+ }, []);
179
+ const pay = useCallback(async (opts) => {
180
+ setIsProcessing(true);
181
+ setError(null);
182
+ try {
183
+ const r = await client.payment.pay(opts);
184
+ setResult(r);
185
+ return r;
186
+ }
187
+ catch (err) {
188
+ const e = err instanceof Error ? err : new Error(String(err));
189
+ setError(e);
190
+ throw e;
191
+ }
192
+ finally {
193
+ setIsProcessing(false);
194
+ }
195
+ }, [client]);
196
+ const tokenizeCard = useCallback((card) => client.payment.tokenizeCard(card), [client]);
197
+ const processApplePay = useCallback(async (opts) => {
198
+ const fn = wrapAsync(() => client.payment.processApplePay(opts));
199
+ const r = await fn();
200
+ setResult(r);
201
+ return r;
202
+ }, [client, wrapAsync]);
203
+ const processGooglePay = useCallback(async (opts) => {
204
+ const fn = wrapAsync(() => client.payment.processGooglePay(opts));
205
+ const r = await fn();
206
+ setResult(r);
207
+ return r;
208
+ }, [client, wrapAsync]);
209
+ const processApm = useCallback(async (opts) => {
210
+ const fn = wrapAsync(() => client.payment.processApm(opts));
211
+ const r = await fn();
212
+ setResult(r);
213
+ return r;
214
+ }, [client, wrapAsync]);
215
+ const pollStatus = useCallback((paymentId) => client.payment.pollPaymentStatus(paymentId), [client]);
216
+ return {
217
+ paymentSetup,
218
+ expressMethods,
219
+ storeConfig,
220
+ isProcessing,
221
+ result,
222
+ error,
223
+ loadPaymentSetup,
224
+ processPayment,
225
+ pay,
226
+ tokenizeCard,
227
+ processApplePay,
228
+ processGooglePay,
229
+ processApm,
230
+ pollStatus,
231
+ };
232
+ }
233
+ //# sourceMappingURL=usePayment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePayment.js","sourceRoot":"","sources":["../../../src/react/hooks/usePayment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { RxCaseSummary, RxQuestionsForProduct, RxRequiredForProduct, RxSubmitCaseInput, RxSubmitCaseResult } from '../../core/modules/rx.js';
2
+ export interface UseRxReturn {
3
+ /** Cases attached to the current order (populated by `pollOrder`). */
4
+ cases: RxCaseSummary[];
5
+ /** Result of the last `submitCase` call, kept for the thank-you page. */
6
+ lastSubmission: RxSubmitCaseResult | null;
7
+ /** True while ANY rx call is in flight. */
8
+ isLoading: boolean;
9
+ error: Error | null;
10
+ /**
11
+ * Ask whether a product needs an Rx case before submitting payment.
12
+ * Storefronts call this at product-page load to decide whether to
13
+ * render the intake step.
14
+ */
15
+ isRequiredForProduct: (productId: string, opts?: {
16
+ clinicalNetworkId?: string;
17
+ }) => Promise<RxRequiredForProduct>;
18
+ /** Fetch network-authored intake questions for a product. */
19
+ getQuestionsForProduct: (productId: string) => Promise<RxQuestionsForProduct>;
20
+ /**
21
+ * Submit a fresh case after the order is paid. The result is also
22
+ * stored in `lastSubmission` so the thank-you page can read it.
23
+ */
24
+ submitCase: (input: RxSubmitCaseInput) => Promise<RxSubmitCaseResult>;
25
+ /**
26
+ * Fetch the public summary of every case attached to a paid order.
27
+ * Useful for the thank-you page or order history.
28
+ */
29
+ fetchCasesForOrder: (input: {
30
+ orderId: string;
31
+ checkoutToken: string;
32
+ }) => Promise<RxCaseSummary[]>;
33
+ /**
34
+ * Auto-poll the cases for an order until they all reach a terminal
35
+ * status (approved / shipped / delivered / declined / cancelled /
36
+ * error). Returns a `stop()` function to cancel the polling.
37
+ */
38
+ pollOrder: (input: {
39
+ orderId: string;
40
+ checkoutToken: string;
41
+ }, opts?: {
42
+ intervalMs?: number;
43
+ onUpdate?: (cases: RxCaseSummary[]) => void;
44
+ }) => () => void;
45
+ }
46
+ /**
47
+ * React hook for Tagada Rx storefronts.
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * const { isRequiredForProduct, submitCase, lastSubmission, pollOrder } = useRx();
52
+ *
53
+ * useEffect(() => {
54
+ * if (orderId && checkoutToken) {
55
+ * const stop = pollOrder({ orderId, checkoutToken }, {
56
+ * onUpdate: (cases) => setCases(cases),
57
+ * });
58
+ * return stop;
59
+ * }
60
+ * }, [orderId, checkoutToken, pollOrder]);
61
+ * ```
62
+ */
63
+ export declare function useRx(): UseRxReturn;
64
+ //# sourceMappingURL=useRx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRx.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useRx.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,yEAAyE;IACzE,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB;;;;OAIG;IACH,oBAAoB,EAAE,CACpB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,KAClC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEnC,6DAA6D;IAC7D,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE9E;;;OAGG;IACH,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEtE;;;OAGG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAEpG;;;;OAIG;IACH,SAAS,EAAE,CACT,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,EACjD,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;KAAE,KACxE,MAAM,IAAI,CAAC;CACjB;AAWD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,IAAI,WAAW,CA+HnC"}
@@ -0,0 +1,145 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { useHeadlessClient } from '../provider.js';
3
+ const TERMINAL_STATUSES = new Set([
4
+ 'approved',
5
+ 'shipped',
6
+ 'delivered',
7
+ 'declined',
8
+ 'cancelled',
9
+ 'error',
10
+ ]);
11
+ /**
12
+ * React hook for Tagada Rx storefronts.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const { isRequiredForProduct, submitCase, lastSubmission, pollOrder } = useRx();
17
+ *
18
+ * useEffect(() => {
19
+ * if (orderId && checkoutToken) {
20
+ * const stop = pollOrder({ orderId, checkoutToken }, {
21
+ * onUpdate: (cases) => setCases(cases),
22
+ * });
23
+ * return stop;
24
+ * }
25
+ * }, [orderId, checkoutToken, pollOrder]);
26
+ * ```
27
+ */
28
+ export function useRx() {
29
+ const client = useHeadlessClient();
30
+ const [cases, setCases] = useState([]);
31
+ const [lastSubmission, setLastSubmission] = useState(null);
32
+ const [isLoading, setIsLoading] = useState(false);
33
+ const [error, setError] = useState(null);
34
+ const pollTimerRef = useRef(null);
35
+ useEffect(() => {
36
+ return () => {
37
+ if (pollTimerRef.current)
38
+ clearInterval(pollTimerRef.current);
39
+ };
40
+ }, []);
41
+ const isRequiredForProduct = useCallback(async (productId, opts) => {
42
+ setIsLoading(true);
43
+ setError(null);
44
+ try {
45
+ return await client.rx.isRequiredForProduct(productId, opts);
46
+ }
47
+ catch (err) {
48
+ const e = err instanceof Error ? err : new Error(String(err));
49
+ setError(e);
50
+ throw e;
51
+ }
52
+ finally {
53
+ setIsLoading(false);
54
+ }
55
+ }, [client]);
56
+ const getQuestionsForProduct = useCallback(async (productId) => {
57
+ setIsLoading(true);
58
+ setError(null);
59
+ try {
60
+ return await client.rx.getQuestionsForProduct(productId);
61
+ }
62
+ catch (err) {
63
+ const e = err instanceof Error ? err : new Error(String(err));
64
+ setError(e);
65
+ throw e;
66
+ }
67
+ finally {
68
+ setIsLoading(false);
69
+ }
70
+ }, [client]);
71
+ const submitCase = useCallback(async (input) => {
72
+ setIsLoading(true);
73
+ setError(null);
74
+ try {
75
+ const res = await client.rx.submitCase(input);
76
+ setLastSubmission(res);
77
+ return res;
78
+ }
79
+ catch (err) {
80
+ const e = err instanceof Error ? err : new Error(String(err));
81
+ setError(e);
82
+ throw e;
83
+ }
84
+ finally {
85
+ setIsLoading(false);
86
+ }
87
+ }, [client]);
88
+ const fetchCasesForOrder = useCallback(async (input) => {
89
+ setIsLoading(true);
90
+ setError(null);
91
+ try {
92
+ const res = await client.rx.getCasesForOrder(input);
93
+ setCases(res.cases);
94
+ return res.cases;
95
+ }
96
+ catch (err) {
97
+ const e = err instanceof Error ? err : new Error(String(err));
98
+ setError(e);
99
+ throw e;
100
+ }
101
+ finally {
102
+ setIsLoading(false);
103
+ }
104
+ }, [client]);
105
+ const pollOrder = useCallback(({ orderId, checkoutToken }, opts) => {
106
+ if (pollTimerRef.current)
107
+ clearInterval(pollTimerRef.current);
108
+ const intervalMs = opts?.intervalMs ?? 5000;
109
+ const tick = async () => {
110
+ try {
111
+ const res = await client.rx.getCasesForOrder({ orderId, checkoutToken });
112
+ setCases(res.cases);
113
+ opts?.onUpdate?.(res.cases);
114
+ if (res.cases.length > 0 && res.cases.every((c) => TERMINAL_STATUSES.has(c.status))) {
115
+ if (pollTimerRef.current)
116
+ clearInterval(pollTimerRef.current);
117
+ pollTimerRef.current = null;
118
+ }
119
+ }
120
+ catch (err) {
121
+ const e = err instanceof Error ? err : new Error(String(err));
122
+ setError(e);
123
+ }
124
+ };
125
+ void tick();
126
+ pollTimerRef.current = setInterval(tick, intervalMs);
127
+ return () => {
128
+ if (pollTimerRef.current)
129
+ clearInterval(pollTimerRef.current);
130
+ pollTimerRef.current = null;
131
+ };
132
+ }, [client]);
133
+ return {
134
+ cases,
135
+ lastSubmission,
136
+ isLoading,
137
+ error,
138
+ isRequiredForProduct,
139
+ getQuestionsForProduct,
140
+ submitCase,
141
+ fetchCasesForOrder,
142
+ pollOrder,
143
+ };
144
+ }
145
+ //# sourceMappingURL=useRx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRx.js","sourceRoot":"","sources":["../../../src/react/hooks/useRx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export { TagadaHeadlessProvider, useHeadlessClient } from './provider.js';
2
+ export type { TagadaHeadlessProviderProps } from './provider.js';
3
+ export { useCheckout } from './hooks/useCheckout.js';
4
+ export type { UseCheckoutReturn } from './hooks/useCheckout.js';
5
+ export { usePayment } from './hooks/usePayment.js';
6
+ export type { UsePaymentReturn, UsePaymentOptions } from './hooks/usePayment.js';
7
+ export { useOffers } from './hooks/useOffers.js';
8
+ export type { UseOffersReturn } from './hooks/useOffers.js';
9
+ export { useCustomer } from './hooks/useCustomer.js';
10
+ export type { UseCustomerReturn } from './hooks/useCustomer.js';
11
+ export { useCatalog } from './hooks/useCatalog.js';
12
+ export type { UseCatalogReturn } from './hooks/useCatalog.js';
13
+ export { useRx } from './hooks/useRx.js';
14
+ export type { UseRxReturn } from './hooks/useRx.js';
15
+ export { useGoogleAutocomplete } from './hooks/useGoogleAutocomplete.js';
16
+ export type { UseGoogleAutocompleteOptions, UseGoogleAutocompleteReturn } from './hooks/useGoogleAutocomplete.js';
17
+ export { useISOData, useCountryOptions, useRegionOptions } from './hooks/useISOData.js';
18
+ export type { UseISODataReturn } from './hooks/useISOData.js';
19
+ export type { GooglePrediction, GooglePlaceDetails, ExtractedAddress, FormattedAddress, SupportedLanguage, ISOCountry, ISORegion, Currency, } from '../core/helpers/index.js';
20
+ export { formatMoney, CurrencyUtils, ISODataCore, GoogleAutocompleteCore, loadGoogleMapsScript } from '../core/helpers/index.js';
21
+ export type { HeadlessConfig, Environment, CheckoutSession, CheckoutLineItem, CheckoutTotals, CheckoutCustomer, Address, ShippingRate, LineItem, PaymentSetupConfig, PaymentMethodConfig, ExpressMethods, ExpressMethod, StoreConfig, PayResult, PayOptions, PaymentStatus, ProcessPaymentOptions, ProcessPaymentResult, Offer, OfferLineItem, OfferPreview, OfferPreviewItem, OfferPayResult, Customer, Order, Subscription, CatalogProduct, CatalogVariant, CatalogPrice, CurrencyOption, StripeExpressOptions, } from '../core/types.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,YAAY,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAElH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,QAAQ,GACT,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEjI,YAAY,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,EACL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { TagadaHeadlessProvider, useHeadlessClient } from './provider.js';
2
+ export { useCheckout } from './hooks/useCheckout.js';
3
+ export { usePayment } from './hooks/usePayment.js';
4
+ export { useOffers } from './hooks/useOffers.js';
5
+ export { useCustomer } from './hooks/useCustomer.js';
6
+ export { useCatalog } from './hooks/useCatalog.js';
7
+ export { useRx } from './hooks/useRx.js';
8
+ // Helpers hooks
9
+ export { useGoogleAutocomplete } from './hooks/useGoogleAutocomplete.js';
10
+ export { useISOData, useCountryOptions, useRegionOptions } from './hooks/useISOData.js';
11
+ export { formatMoney, CurrencyUtils, ISODataCore, GoogleAutocompleteCore, loadGoogleMapsScript } from '../core/helpers/index.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGzC,gBAAgB;AAChB,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAexF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Try to claim ownership of resuming a payment. Returns `true` if the
3
+ * caller is the first one to claim it (and should proceed); `false` if
4
+ * another hook has already claimed it.
5
+ */
6
+ export declare function tryClaimResume(paymentId: string): boolean;
7
+ /** Reset the guard. Useful in tests and on hard refresh logic. */
8
+ export declare function resetResumeGuard(): void;
9
+ //# sourceMappingURL=redirectGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirectGuard.d.ts","sourceRoot":"","sources":["../../../src/react/internal/redirectGuard.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Module-level guard preventing two hooks (`usePayment`, `useOffers`) from
3
+ * both resuming the same payment after a 3DS / processor redirect.
4
+ *
5
+ * Each `paymentId` is processed at most once per page load. The first hook
6
+ * that wins the race calls `client.payment.resumeAfterRedirect` and fires
7
+ * its callback; the other hook becomes a no-op.
8
+ */
9
+ const RESUMED_PAYMENT_IDS = new Set();
10
+ /**
11
+ * Try to claim ownership of resuming a payment. Returns `true` if the
12
+ * caller is the first one to claim it (and should proceed); `false` if
13
+ * another hook has already claimed it.
14
+ */
15
+ export function tryClaimResume(paymentId) {
16
+ if (RESUMED_PAYMENT_IDS.has(paymentId))
17
+ return false;
18
+ RESUMED_PAYMENT_IDS.add(paymentId);
19
+ return true;
20
+ }
21
+ /** Reset the guard. Useful in tests and on hard refresh logic. */
22
+ export function resetResumeGuard() {
23
+ RESUMED_PAYMENT_IDS.clear();
24
+ }
25
+ //# sourceMappingURL=redirectGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirectGuard.js","sourceRoot":"","sources":["../../../src/react/internal/redirectGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB;IAC9B,mBAAmB,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { HeadlessClient } from '../core/client.js';
3
+ import type { HeadlessConfig, Environment } from '../core/types.js';
4
+ export interface TagadaHeadlessProviderProps {
5
+ /** Your TagadaPay store ID. */
6
+ storeId: string;
7
+ /** Environment. Defaults to "production". */
8
+ environment?: Environment;
9
+ /** Public API key for authenticated requests. */
10
+ apiKey?: string;
11
+ /** Override the base API URL. */
12
+ baseUrl?: string;
13
+ /** Full config object (alternative to individual props). */
14
+ config?: HeadlessConfig;
15
+ children: React.ReactNode;
16
+ }
17
+ /**
18
+ * Root provider for the TagadaPay Headless SDK React integration.
19
+ * Creates a single HeadlessClient and shares it via context.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <TagadaHeadlessProvider storeId="store_abc123" environment="production">
24
+ * <App />
25
+ * </TagadaHeadlessProvider>
26
+ * ```
27
+ */
28
+ export declare function TagadaHeadlessProvider({ storeId, environment, apiKey, baseUrl, config, children, }: TagadaHeadlessProviderProps): import("react/jsx-runtime.js").JSX.Element;
29
+ /** Access the HeadlessClient from context. Throws if used outside the provider. */
30
+ export declare function useHeadlessClient(): HeadlessClient;
31
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/react/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQpE,MAAM,WAAW,2BAA2B;IAC1C,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,WAAW,EACX,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE,2BAA2B,8CAa7B;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ import { createHeadlessClient } from '../core/client.js';
4
+ const TagadaHeadlessContext = createContext(null);
5
+ /**
6
+ * Root provider for the TagadaPay Headless SDK React integration.
7
+ * Creates a single HeadlessClient and shares it via context.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <TagadaHeadlessProvider storeId="store_abc123" environment="production">
12
+ * <App />
13
+ * </TagadaHeadlessProvider>
14
+ * ```
15
+ */
16
+ export function TagadaHeadlessProvider({ storeId, environment, apiKey, baseUrl, config, children, }) {
17
+ const client = useMemo(() => {
18
+ const cfg = config ?? { storeId, environment, apiKey, baseUrl };
19
+ return createHeadlessClient(cfg);
20
+ }, [storeId, environment, apiKey, baseUrl, config]);
21
+ const value = useMemo(() => ({ client }), [client]);
22
+ return (_jsx(TagadaHeadlessContext.Provider, { value: value, children: children }));
23
+ }
24
+ /** Access the HeadlessClient from context. Throws if used outside the provider. */
25
+ export function useHeadlessClient() {
26
+ const ctx = useContext(TagadaHeadlessContext);
27
+ if (!ctx) {
28
+ throw new Error('useHeadlessClient must be used within <TagadaHeadlessProvider>');
29
+ }
30
+ return ctx.client;
31
+ }
32
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/react/provider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAkB,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAOzE,MAAM,qBAAqB,GAAG,aAAa,CAAoC,IAAI,CAAC,CAAC;AAgBrF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,OAAO,EACP,WAAW,EACX,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,GACoB;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,MAAM,GAAG,GAAmB,MAAM,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAChF,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpD,OAAO,CACL,KAAC,qBAAqB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACzC,QAAQ,GACsB,CAClC,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC"}