@tagadapay/headless-sdk 1.0.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.
- package/README.md +110 -0
- package/dist/core/client.d.ts +48 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +61 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/errors.d.ts +46 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +57 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/http.d.ts +27 -0
- package/dist/core/http.d.ts.map +1 -0
- package/dist/core/http.js +116 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/modules/analytics.d.ts +79 -0
- package/dist/core/modules/analytics.d.ts.map +1 -0
- package/dist/core/modules/analytics.js +265 -0
- package/dist/core/modules/analytics.js.map +1 -0
- package/dist/core/modules/checkout.d.ts +67 -0
- package/dist/core/modules/checkout.d.ts.map +1 -0
- package/dist/core/modules/checkout.js +164 -0
- package/dist/core/modules/checkout.js.map +1 -0
- package/dist/core/modules/customer.d.ts +33 -0
- package/dist/core/modules/customer.d.ts.map +1 -0
- package/dist/core/modules/customer.js +53 -0
- package/dist/core/modules/customer.js.map +1 -0
- package/dist/core/modules/offers.d.ts +43 -0
- package/dist/core/modules/offers.d.ts.map +1 -0
- package/dist/core/modules/offers.js +56 -0
- package/dist/core/modules/offers.js.map +1 -0
- package/dist/core/modules/payment.d.ts +123 -0
- package/dist/core/modules/payment.d.ts.map +1 -0
- package/dist/core/modules/payment.js +279 -0
- package/dist/core/modules/payment.js.map +1 -0
- package/dist/core/types.d.ts +276 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/react/hooks/useAnalytics.d.ts +59 -0
- package/dist/react/hooks/useAnalytics.d.ts.map +1 -0
- package/dist/react/hooks/useAnalytics.js +49 -0
- package/dist/react/hooks/useAnalytics.js.map +1 -0
- package/dist/react/hooks/useCheckout.d.ts +45 -0
- package/dist/react/hooks/useCheckout.d.ts.map +1 -0
- package/dist/react/hooks/useCheckout.js +113 -0
- package/dist/react/hooks/useCheckout.js.map +1 -0
- package/dist/react/hooks/useCustomer.d.ts +28 -0
- package/dist/react/hooks/useCustomer.d.ts.map +1 -0
- package/dist/react/hooks/useCustomer.js +77 -0
- package/dist/react/hooks/useCustomer.js.map +1 -0
- package/dist/react/hooks/useOffers.d.ts +45 -0
- package/dist/react/hooks/useOffers.d.ts.map +1 -0
- package/dist/react/hooks/useOffers.js +88 -0
- package/dist/react/hooks/useOffers.js.map +1 -0
- package/dist/react/hooks/usePayment.d.ts +63 -0
- package/dist/react/hooks/usePayment.d.ts.map +1 -0
- package/dist/react/hooks/usePayment.js +114 -0
- package/dist/react/hooks/usePayment.js.map +1 -0
- package/dist/react/index.d.ts +14 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +7 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/provider.d.ts +31 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +32 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/tagada-headless-react.min.js +8 -0
- package/dist/tagada-headless-react.min.js.map +7 -0
- package/dist/tagada-headless.js +1093 -0
- package/dist/tagada-headless.min.js +8 -0
- package/dist/tagada-headless.min.js.map +7 -0
- package/package.json +72 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { useHeadlessClient } from '../provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* React hook for customer data -- profile, orders, subscriptions.
|
|
5
|
+
*
|
|
6
|
+
* @param customerId - Auto-loads the customer profile when provided.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const { customer, orders, loadOrders } = useCustomer(session?.customer?.id);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export function useCustomer(customerId) {
|
|
14
|
+
const client = useHeadlessClient();
|
|
15
|
+
const [customer, setCustomer] = useState(null);
|
|
16
|
+
const [orders, setOrders] = useState([]);
|
|
17
|
+
const [subscriptions, setSubscriptions] = useState([]);
|
|
18
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
19
|
+
const [error, setError] = useState(null);
|
|
20
|
+
const loadCustomer = useCallback(async (id) => {
|
|
21
|
+
setIsLoading(true);
|
|
22
|
+
setError(null);
|
|
23
|
+
try {
|
|
24
|
+
const c = await client.customer.getProfile(id);
|
|
25
|
+
setCustomer(c);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
setIsLoading(false);
|
|
32
|
+
}
|
|
33
|
+
}, [client]);
|
|
34
|
+
const loadOrders = useCallback(async (id) => {
|
|
35
|
+
try {
|
|
36
|
+
const res = await client.customer.getOrders(id);
|
|
37
|
+
setOrders(res.orders);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
41
|
+
}
|
|
42
|
+
}, [client]);
|
|
43
|
+
const loadSubscriptions = useCallback(async (id) => {
|
|
44
|
+
try {
|
|
45
|
+
const subs = await client.customer.getSubscriptions(id);
|
|
46
|
+
setSubscriptions(subs);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
50
|
+
}
|
|
51
|
+
}, [client]);
|
|
52
|
+
const updateProfile = useCallback(async (id, data) => {
|
|
53
|
+
try {
|
|
54
|
+
const updated = await client.customer.updateProfile(id, data);
|
|
55
|
+
setCustomer(updated);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
59
|
+
}
|
|
60
|
+
}, [client]);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (customerId)
|
|
63
|
+
loadCustomer(customerId);
|
|
64
|
+
}, [customerId, loadCustomer]);
|
|
65
|
+
return {
|
|
66
|
+
customer,
|
|
67
|
+
orders,
|
|
68
|
+
subscriptions,
|
|
69
|
+
isLoading,
|
|
70
|
+
error,
|
|
71
|
+
loadCustomer,
|
|
72
|
+
loadOrders,
|
|
73
|
+
loadSubscriptions,
|
|
74
|
+
updateProfile,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=useCustomer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCustomer.js","sourceRoot":"","sources":["../../../src/react/hooks/useCustomer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Offer, OfferResult } from '../../core/types.js';
|
|
2
|
+
export interface UseOffersReturn {
|
|
3
|
+
/** Current loaded offer. */
|
|
4
|
+
offer: Offer | null;
|
|
5
|
+
/** Whether an offer operation is in progress. */
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
/** Last error. */
|
|
8
|
+
error: Error | null;
|
|
9
|
+
/** Last result from accept/decline. */
|
|
10
|
+
result: OfferResult | null;
|
|
11
|
+
/** Load an offer by ID. */
|
|
12
|
+
loadOffer: (offerId: string) => Promise<Offer>;
|
|
13
|
+
/** List all offers for the store. */
|
|
14
|
+
listOffers: (opts?: {
|
|
15
|
+
type?: 'upsell' | 'orderbump';
|
|
16
|
+
}) => Promise<Offer[]>;
|
|
17
|
+
/** Accept an offer (one-click upsell). */
|
|
18
|
+
acceptOffer: (opts: {
|
|
19
|
+
offerId: string;
|
|
20
|
+
checkoutSessionId: string;
|
|
21
|
+
}) => Promise<OfferResult>;
|
|
22
|
+
/** Decline an offer. */
|
|
23
|
+
declineOffer: (opts: {
|
|
24
|
+
offerId: string;
|
|
25
|
+
checkoutSessionId: string;
|
|
26
|
+
}) => Promise<OfferResult>;
|
|
27
|
+
/** List order bumps for a checkout session. */
|
|
28
|
+
listOrderBumps: (checkoutSessionId: string) => Promise<Offer[]>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* React hook for post-purchase offers -- upsells, downsells, order bumps.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* const { offer, loadOffer, acceptOffer, declineOffer } = useOffers();
|
|
36
|
+
*
|
|
37
|
+
* useEffect(() => { loadOffer('offer_xxx'); }, []);
|
|
38
|
+
*
|
|
39
|
+
* <button onClick={() => acceptOffer({ offerId: offer.id, checkoutSessionId })}>
|
|
40
|
+
* Yes, add it!
|
|
41
|
+
* </button>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useOffers(): UseOffersReturn;
|
|
45
|
+
//# sourceMappingURL=useOffers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOffers.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useOffers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,uCAAuC;IACvC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,2BAA2B;IAC3B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,qCAAqC;IACrC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3E,0CAA0C;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5F,wBAAwB;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7F,+CAA+C;IAC/C,cAAc,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;CACjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,IAAI,eAAe,CA4E3C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useHeadlessClient } from '../provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* React hook for post-purchase offers -- upsells, downsells, order bumps.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const { offer, loadOffer, acceptOffer, declineOffer } = useOffers();
|
|
9
|
+
*
|
|
10
|
+
* useEffect(() => { loadOffer('offer_xxx'); }, []);
|
|
11
|
+
*
|
|
12
|
+
* <button onClick={() => acceptOffer({ offerId: offer.id, checkoutSessionId })}>
|
|
13
|
+
* Yes, add it!
|
|
14
|
+
* </button>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function useOffers() {
|
|
18
|
+
const client = useHeadlessClient();
|
|
19
|
+
const [offer, setOffer] = useState(null);
|
|
20
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
21
|
+
const [error, setError] = useState(null);
|
|
22
|
+
const [result, setResult] = useState(null);
|
|
23
|
+
const loadOffer = useCallback(async (offerId) => {
|
|
24
|
+
setIsLoading(true);
|
|
25
|
+
setError(null);
|
|
26
|
+
try {
|
|
27
|
+
const o = await client.offers.loadOffer(offerId);
|
|
28
|
+
setOffer(o);
|
|
29
|
+
return o;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
33
|
+
setError(e);
|
|
34
|
+
throw e;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
setIsLoading(false);
|
|
38
|
+
}
|
|
39
|
+
}, [client]);
|
|
40
|
+
const listOffers = useCallback((opts) => client.offers.listOffers(opts), [client]);
|
|
41
|
+
const acceptOffer = useCallback(async (opts) => {
|
|
42
|
+
setIsLoading(true);
|
|
43
|
+
setError(null);
|
|
44
|
+
try {
|
|
45
|
+
const r = await client.offers.acceptOffer(opts);
|
|
46
|
+
setResult(r);
|
|
47
|
+
return r;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
51
|
+
setError(e);
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setIsLoading(false);
|
|
56
|
+
}
|
|
57
|
+
}, [client]);
|
|
58
|
+
const declineOffer = useCallback(async (opts) => {
|
|
59
|
+
setIsLoading(true);
|
|
60
|
+
setError(null);
|
|
61
|
+
try {
|
|
62
|
+
const r = await client.offers.declineOffer(opts);
|
|
63
|
+
setResult(r);
|
|
64
|
+
return r;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
68
|
+
setError(e);
|
|
69
|
+
throw e;
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
setIsLoading(false);
|
|
73
|
+
}
|
|
74
|
+
}, [client]);
|
|
75
|
+
const listOrderBumps = useCallback((checkoutSessionId) => client.offers.listOrderBumps(checkoutSessionId), [client]);
|
|
76
|
+
return {
|
|
77
|
+
offer,
|
|
78
|
+
isLoading,
|
|
79
|
+
error,
|
|
80
|
+
result,
|
|
81
|
+
loadOffer,
|
|
82
|
+
listOffers,
|
|
83
|
+
acceptOffer,
|
|
84
|
+
declineOffer,
|
|
85
|
+
listOrderBumps,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=useOffers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOffers.js","sourceRoot":"","sources":["../../../src/react/hooks/useOffers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { PaymentSetupConfig, ExpressMethods, StoreConfig, PayResult, PayOptions, PaymentStatus } from '../../core/types.js';
|
|
2
|
+
export interface UsePaymentReturn {
|
|
3
|
+
/** Full payment setup config (all methods with their enabled/disabled state). */
|
|
4
|
+
paymentSetup: PaymentSetupConfig | null;
|
|
5
|
+
/** Express methods (Apple Pay, Google Pay, etc.) with browser availability. */
|
|
6
|
+
expressMethods: ExpressMethods | null;
|
|
7
|
+
/** Store-level config (3DS flags, etc.). */
|
|
8
|
+
storeConfig: StoreConfig | null;
|
|
9
|
+
/** Whether a payment is currently being processed. */
|
|
10
|
+
isProcessing: boolean;
|
|
11
|
+
/** Last payment result. */
|
|
12
|
+
result: PayResult | null;
|
|
13
|
+
/** Last error. */
|
|
14
|
+
error: Error | null;
|
|
15
|
+
/** Load payment setup for a checkout session. Call this once when the session is ready. */
|
|
16
|
+
loadPaymentSetup: (checkoutSessionId: string) => Promise<void>;
|
|
17
|
+
/** Tokenize a card and process payment in one call. */
|
|
18
|
+
pay: (opts: PayOptions) => Promise<PayResult>;
|
|
19
|
+
/** Tokenize a card (returns tagadaToken). Requires @tagadapay/core-js. */
|
|
20
|
+
tokenizeCard: (card: {
|
|
21
|
+
cardNumber: string;
|
|
22
|
+
expiryDate: string;
|
|
23
|
+
cvc: string;
|
|
24
|
+
cardholderName?: string;
|
|
25
|
+
}) => Promise<{
|
|
26
|
+
tagadaToken: string;
|
|
27
|
+
rawToken: Record<string, unknown>;
|
|
28
|
+
}>;
|
|
29
|
+
/** Process Apple Pay. */
|
|
30
|
+
processApplePay: (opts: {
|
|
31
|
+
checkoutSessionId: string;
|
|
32
|
+
applePayToken: unknown;
|
|
33
|
+
}) => Promise<PayResult>;
|
|
34
|
+
/** Process Google Pay. */
|
|
35
|
+
processGooglePay: (opts: {
|
|
36
|
+
checkoutSessionId: string;
|
|
37
|
+
googlePayToken: string;
|
|
38
|
+
}) => Promise<PayResult>;
|
|
39
|
+
/** Process redirect-based APM (Klarna, iDEAL, etc.). */
|
|
40
|
+
processApm: (opts: {
|
|
41
|
+
checkoutSessionId: string;
|
|
42
|
+
paymentMethod: string;
|
|
43
|
+
processorId: string;
|
|
44
|
+
}) => Promise<PayResult>;
|
|
45
|
+
/** Poll a payment until terminal status. */
|
|
46
|
+
pollStatus: (paymentId: string) => Promise<PaymentStatus>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* React hook for payment processing.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```tsx
|
|
53
|
+
* const { paymentSetup, pay, isProcessing } = usePayment();
|
|
54
|
+
*
|
|
55
|
+
* // On mount
|
|
56
|
+
* useEffect(() => { loadPaymentSetup(session.id); }, [session]);
|
|
57
|
+
*
|
|
58
|
+
* // On submit
|
|
59
|
+
* const result = await pay({ checkoutSessionId: session.id, tagadaToken });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function usePayment(): UsePaymentReturn;
|
|
63
|
+
//# sourceMappingURL=usePayment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePayment.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/usePayment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,+EAA+E;IAC/E,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,4CAA4C;IAC5C,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,sDAAsD;IACtD,YAAY,EAAE,OAAO,CAAC;IACtB,2BAA2B;IAC3B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,kBAAkB;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,2FAA2F;IAC3F,gBAAgB,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,uDAAuD;IACvD,GAAG,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,0EAA0E;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC1E,yBAAyB;IACzB,eAAe,EAAE,CAAC,IAAI,EAAE;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,OAAO,CAAC;KACxB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,0BAA0B;IAC1B,gBAAgB,EAAE,CAAC,IAAI,EAAE;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,wDAAwD;IACxD,UAAU,EAAE,CAAC,IAAI,EAAE;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,4CAA4C;IAC5C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CAC3D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CA0H7C"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { useState, useCallback, useRef } from 'react';
|
|
2
|
+
import { useHeadlessClient } from '../provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* React hook for payment processing.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const { paymentSetup, pay, isProcessing } = usePayment();
|
|
9
|
+
*
|
|
10
|
+
* // On mount
|
|
11
|
+
* useEffect(() => { loadPaymentSetup(session.id); }, [session]);
|
|
12
|
+
*
|
|
13
|
+
* // On submit
|
|
14
|
+
* const result = await pay({ checkoutSessionId: session.id, tagadaToken });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function usePayment() {
|
|
18
|
+
const client = useHeadlessClient();
|
|
19
|
+
const [paymentSetup, setPaymentSetup] = useState(null);
|
|
20
|
+
const [expressMethods, setExpressMethods] = useState(null);
|
|
21
|
+
const [storeConfig, setStoreConfig] = useState(null);
|
|
22
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
23
|
+
const [result, setResult] = useState(null);
|
|
24
|
+
const [error, setError] = useState(null);
|
|
25
|
+
const loadedRef = useRef(false);
|
|
26
|
+
const loadPaymentSetup = useCallback(async (checkoutSessionId) => {
|
|
27
|
+
if (loadedRef.current)
|
|
28
|
+
return;
|
|
29
|
+
loadedRef.current = true;
|
|
30
|
+
try {
|
|
31
|
+
const [setup, express, config] = await Promise.all([
|
|
32
|
+
client.payment.getPaymentSetup(checkoutSessionId),
|
|
33
|
+
client.payment.getExpressMethods(checkoutSessionId),
|
|
34
|
+
client.payment.getStoreConfig(),
|
|
35
|
+
]);
|
|
36
|
+
setPaymentSetup(setup);
|
|
37
|
+
setExpressMethods(express);
|
|
38
|
+
setStoreConfig(config);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
loadedRef.current = false;
|
|
42
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
43
|
+
}
|
|
44
|
+
}, [client]);
|
|
45
|
+
const wrapAsync = useCallback((fn) => async () => {
|
|
46
|
+
setIsProcessing(true);
|
|
47
|
+
setError(null);
|
|
48
|
+
try {
|
|
49
|
+
const r = await fn();
|
|
50
|
+
return r;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
54
|
+
setError(e);
|
|
55
|
+
throw e;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
setIsProcessing(false);
|
|
59
|
+
}
|
|
60
|
+
}, []);
|
|
61
|
+
const pay = useCallback(async (opts) => {
|
|
62
|
+
setIsProcessing(true);
|
|
63
|
+
setError(null);
|
|
64
|
+
try {
|
|
65
|
+
const r = await client.payment.pay(opts);
|
|
66
|
+
setResult(r);
|
|
67
|
+
return r;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
71
|
+
setError(e);
|
|
72
|
+
throw e;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
setIsProcessing(false);
|
|
76
|
+
}
|
|
77
|
+
}, [client]);
|
|
78
|
+
const tokenizeCard = useCallback((card) => client.payment.tokenizeCard(card), [client]);
|
|
79
|
+
const processApplePay = useCallback(async (opts) => {
|
|
80
|
+
const fn = wrapAsync(() => client.payment.processApplePay(opts));
|
|
81
|
+
const r = await fn();
|
|
82
|
+
setResult(r);
|
|
83
|
+
return r;
|
|
84
|
+
}, [client, wrapAsync]);
|
|
85
|
+
const processGooglePay = useCallback(async (opts) => {
|
|
86
|
+
const fn = wrapAsync(() => client.payment.processGooglePay(opts));
|
|
87
|
+
const r = await fn();
|
|
88
|
+
setResult(r);
|
|
89
|
+
return r;
|
|
90
|
+
}, [client, wrapAsync]);
|
|
91
|
+
const processApm = useCallback(async (opts) => {
|
|
92
|
+
const fn = wrapAsync(() => client.payment.processApm(opts));
|
|
93
|
+
const r = await fn();
|
|
94
|
+
setResult(r);
|
|
95
|
+
return r;
|
|
96
|
+
}, [client, wrapAsync]);
|
|
97
|
+
const pollStatus = useCallback((paymentId) => client.payment.pollPaymentStatus(paymentId), [client]);
|
|
98
|
+
return {
|
|
99
|
+
paymentSetup,
|
|
100
|
+
expressMethods,
|
|
101
|
+
storeConfig,
|
|
102
|
+
isProcessing,
|
|
103
|
+
result,
|
|
104
|
+
error,
|
|
105
|
+
loadPaymentSetup,
|
|
106
|
+
pay,
|
|
107
|
+
tokenizeCard,
|
|
108
|
+
processApplePay,
|
|
109
|
+
processGooglePay,
|
|
110
|
+
processApm,
|
|
111
|
+
pollStatus,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=usePayment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePayment.js","sourceRoot":"","sources":["../../../src/react/hooks/usePayment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAsDnD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAA4B,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,EAAE,iBAAyB,EAAE,EAAE;QACvE,IAAI,SAAS,CAAC,OAAO;YAAE,OAAO;QAC9B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC;gBACjD,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,CAAC;gBACnD,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE;aAChC,CAAC,CAAC;YACH,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAK,EAAoB,EAAE,EAAE,CAC3B,KAAK,IAAgB,EAAE;QACrB,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EACH,EAAE,CACH,CAAC;IAEF,MAAM,GAAG,GAAG,WAAW,CACrB,KAAK,EAAE,IAAgB,EAAsB,EAAE;QAC7C,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,SAAS,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,IAAsF,EAAE,EAAE,CACzF,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EACnC,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,KAAK,EAAE,IAA2D,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;QACrB,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,CAAC,CACpB,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,IAA2D,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;QACrB,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,CAAC,CACpB,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,KAAK,EAAE,IAA+E,EAAE,EAAE;QACxF,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;QACrB,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,CAAC,CACpB,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,SAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAClE,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,cAAc;QACd,WAAW;QACX,YAAY;QACZ,MAAM;QACN,KAAK;QACL,gBAAgB;QAChB,GAAG;QACH,YAAY;QACZ,eAAe;QACf,gBAAgB;QAChB,UAAU;QACV,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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 } 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 { useAnalytics } from './hooks/useAnalytics.js';
|
|
12
|
+
export type { UseAnalyticsReturn } from './hooks/useAnalytics.js';
|
|
13
|
+
export type { HeadlessConfig, Environment, CheckoutSession, CheckoutLineItem, CheckoutTotals, CheckoutCustomer, Address, ShippingRate, LineItem, PaymentSetupConfig, PaymentMethodConfig, ExpressMethods, ExpressMethod, StoreConfig, PayResult, PayOptions, PaymentStatus, Offer, OfferResult, Customer, Order, Subscription, PixelConfig, } from '../core/types.js';
|
|
14
|
+
//# 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,MAAM,uBAAuB,CAAC;AAE9D,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,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,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,KAAK,EACL,WAAW,EACX,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
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 { useAnalytics } from './hooks/useAnalytics.js';
|
|
7
|
+
//# 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,YAAY,EAAE,MAAM,yBAAyB,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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tagadapay/headless-sdk v1.0.0
|
|
3
|
+
* Headless checkout, payments, analytics, and CRM
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
"use strict";var TagadaHeadlessReactBundle=(()=>{var oe=Object.create;var U=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var A=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var de=(r,e)=>{for(var t in e)U(r,t,{get:e[t],enumerable:!0})},K=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ae(e))!ue.call(r,s)&&s!==t&&U(r,s,{get:()=>e[s],enumerable:!(n=ie(e,s))||n.enumerable});return r};var pe=(r,e,t)=>(t=r!=null?oe(ce(r)):{},K(e||!r||!r.__esModule?U(t,"default",{value:r,enumerable:!0}):t,r)),le=r=>K(U({},"__esModule",{value:!0}),r);var me={};de(me,{TagadaHeadlessProvider:()=>X,useAnalytics:()=>se,useCheckout:()=>Z,useCustomer:()=>ne,useHeadlessClient:()=>R,useOffers:()=>te,usePayment:()=>ee});var O=A("react");var x=class extends Error{constructor(e,t,n,s){super(e),this.name="TagadaError",this.code=t,this.statusCode=n,this.details=s}},j=class extends x{constructor(e="Authentication failed. Check your API key or checkout token."){super(e,"auth_error",401),this.name="TagadaAuthError"}},N=class extends x{constructor(e,t=[]){super(e,"validation_error",422,{errors:t}),this.name="TagadaValidationError",this.errors=t}},$=class extends x{constructor(e,t){super(`${e} "${t}" not found.`,"not_found",404),this.name="TagadaNotFoundError"}},L=class extends x{constructor(e=1e3){super(`Rate limited. Retry after ${e}ms.`,"rate_limit",429),this.name="TagadaRateLimitError",this.retryAfterMs=e}};var H=class extends x{constructor(e="Network request failed. Check your connection."){super(e,"network_error"),this.name="TagadaNetworkError"}};var B={production:"https://app.tagadapay.com",development:"https://app.dev.tagadapay.com",local:"http://localhost:3000"},q=class{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.timeout=e.timeout,this.apiKey=e.apiKey,this.getToken=e.getToken}static resolveBaseUrl(e,t){return t??B[e]??B.production}async request(e,t={}){var g;let{method:n="GET",body:s,headers:a={},params:o,token:p,signal:u}=t,l=`${this.baseUrl}${e}`;if(o){let i=new URLSearchParams;for(let[f,d]of Object.entries(o))d!==void 0&&i.set(f,String(d));let m=i.toString();m&&(l+=`?${m}`)}let h={"Content-Type":"application/json",...a},y=p??this.apiKey??((g=this.getToken)==null?void 0:g.call(this));y&&(h["x-cms-token"]=y);let c=new AbortController,P=setTimeout(()=>c.abort(),this.timeout);try{let i=await fetch(l,{method:n,headers:h,body:s!=null?JSON.stringify(s):void 0,signal:u??c.signal});if(clearTimeout(P),i.ok){let m=await i.text();return m?JSON.parse(m):{}}throw await this.handleErrorResponse(i,e),new x("Unexpected error","unknown",i.status)}catch(i){throw clearTimeout(P),i instanceof x?i:i instanceof DOMException&&i.name==="AbortError"?new H(`Request to ${e} timed out after ${this.timeout}ms.`):new H(i instanceof Error?i.message:"Network request failed.")}}get(e,t){return this.request(e,{...t,method:"GET"})}post(e,t,n){return this.request(e,{...n,method:"POST",body:t})}patch(e,t,n){return this.request(e,{...n,method:"PATCH",body:t})}put(e,t,n){return this.request(e,{...n,method:"PUT",body:t})}delete(e,t){return this.request(e,{...t,method:"DELETE"})}async handleErrorResponse(e,t){let n={};try{n=await e.json()}catch{}let s=n.message??n.error??`Request failed: ${e.status} ${e.statusText} on ${t}`;switch(e.status){case 401:case 403:throw new j(s);case 404:throw new $(t,"");case 422:{let a=Array.isArray(n.errors)?n.errors:[];throw new N(s,a)}case 429:{let a=Number(e.headers.get("Retry-After")??"1")*1e3;throw new L(a)}default:throw new x(s,"api_error",e.status,n)}}};var _=class{constructor(e,t,n){this.http=e;this.storeId=t;this.onTokenChange=n}async loadSession(e,t){var s;t&&(this.sessionToken=t,(s=this.onTokenChange)==null||s.call(this,t));let n=await this.http.get(`/api/v1/checkout-sessions/${e}/v2`,{params:{skipAsyncWait:"false"},token:this.sessionToken});return this.normalizeSession(n)}async createSession(e){var p;let t=e.items.map(u=>({variantId:u.variantId,priceId:u.priceId,quantity:u.quantity})),n={storeId:this.storeId,lineItems:t};e.currency&&(n.currency=e.currency),e.returnUrl&&(n.returnUrl=e.returnUrl),e.customerEmail&&(n.customer={email:e.customerEmail,firstName:e.customerFirstName,lastName:e.customerLastName,currency:e.currency});let s=await this.http.post("/api/v1/checkout/session/init",n),o=new URL(s.checkoutUrl).searchParams.get("token")??"";return this.sessionToken=o,o&&((p=this.onTokenChange)==null||p.call(this,o)),{checkoutUrl:s.checkoutUrl,checkoutToken:s.checkoutToken,sessionToken:o,customerId:s.customerId}}async updateCart(e,t){return this.http.post(`/api/v1/checkout-sessions/${e}/items`,{items:t},{token:this.sessionToken})}async updateCustomer(e,t){return this.http.patch(`/api/v1/checkout-sessions/${e}/customer`,{data:t},{token:this.sessionToken})}async updateAddress(e,t){return this.http.post(`/api/v1/checkout-sessions/${e}/address`,{data:t},{token:this.sessionToken})}async applyPromoCode(e,t){return this.http.post(`/api/v1/checkout-sessions/${e}/promo`,{code:t},{token:this.sessionToken})}async removePromoCode(e){return this.http.delete(`/api/v1/checkout-sessions/${e}/promo`,{token:this.sessionToken})}async getShippingRates(e){return(await this.http.get(`/api/v1/checkout-sessions/${e}/shipping-rates`,{token:this.sessionToken})).rates}async selectShippingRate(e,t){return this.http.post(`/api/v1/checkout-sessions/${e}/shipping-rates`,{rateId:t},{token:this.sessionToken})}normalizeSession(e){let t=e.checkoutSession,n=t.orderSummaries??[],s=e.summary??t.summary??n[0]??{},a=t.sessionLineItems??[],o=t.customer,p=a.map(l=>{let h=l.price,y=(h==null?void 0:h.variant)??{},c=y.product??{},P=(h==null?void 0:h.currencyOptions)??{},g=P.USD??P[Object.keys(P)[0]];return{id:l.id,variantId:l.variantId,priceId:l.priceId,productName:c.name??"",variantName:y.name??"",quantity:l.quantity??1,unitAmount:(g==null?void 0:g.amount)??0,totalAmount:((g==null?void 0:g.amount)??0)*(l.quantity??1),currency:t.selectedPresentmentCurrency??"USD",imageUrl:y.imageUrl??""}}),u=s.items??[];return{id:t.id,storeId:t.storeId,checkoutToken:t.checkoutToken,currency:t.selectedPresentmentCurrency??"USD",items:p,totals:{subtotal:s.subtotalAmount??0,discount:s.totalPromotionAmount??0,shipping:s.shippingCost??0,tax:s.totalTaxAmount??0,total:s.totalAmount??u.reduce((l,h)=>l+(h.amount??0),0),currency:s.currency??t.selectedPresentmentCurrency??"USD"},customer:o?{id:o.id,email:o.email,firstName:o.firstName,lastName:o.lastName}:void 0,shippingAddress:t.shippingAddress,billingAddress:t.billingAddress,metadata:t.metadata}}};var D=class{constructor(e,t,n){this.http=e;this.storeId=t;this.environment=n}async getPaymentSetup(e){let t=await this.http.get("/api/v1/payment-methods",{params:{checkoutSessionId:e}}),n={};for(let s of t.methods??[]){let a=s.provider?`${s.method}:${s.provider}`:s.method;n[a]=s}return n}async getExpressMethods(e){var s,a;let t=await this.getPaymentSetup(e),n={};for(let[,o]of Object.entries(t)){if(!o.enabled||!o.express)continue;let p=o.method,u={type:p,available:!0,processorId:o.processorId,publishableKey:o.publishableKey,metadata:o.metadata};if(p==="apple_pay"||o.type==="apple_pay"){let l=typeof window<"u"&&"ApplePaySession"in window&&((a=(s=window.ApplePaySession)==null?void 0:s.canMakePayments)==null?void 0:a.call(s));n.applePay={...u,available:!!l}}else p==="google_pay"||o.type==="google_pay"?n.googlePay=u:p==="paypal"?n.paypal=u:p==="klarna"||p==="klarna_express"?n.klarna=u:p==="link"&&(n.link=u)}return n}async getStoreConfig(){let e=await this.http.get("/api/v1/checkout/config",{params:{storeId:this.storeId}});return e.config??e}async getEnabledMethods(e){let t=await this.getPaymentSetup(e);return Object.entries(t).filter(([,n])=>n.enabled).map(([n])=>n)}async tokenizeCard(e){let t=await this.loadCoreJs(),n=new t.Tokenizer({environment:this.environment});await n.initialize();let s={cardNumber:e.cardNumber,expiryDate:e.expiryDate,cvc:e.cvc};e.cardholderName&&(s.cardholderName=e.cardholderName);let[a,o]=await Promise.all([n.tokenizeCard(s),n.tokenizeCardRaw(s)]);return{tagadaToken:a,rawToken:o}}async createInstrument(e){return this.http.post("/api/v1/payment/create-instrument-from-token",{tagadaToken:e.tagadaToken})}async create3dsSession(e){return this.http.post("/api/public/v1/threeds/create-session",{provider:e.provider??"basis_theory",storeId:this.storeId,paymentInstrumentId:e.paymentInstrumentId,sessionData:e.sessionData})}async pay(e){return e.tagadaToken&&!e.paymentInstrumentId?this.http.post("/api/v1/payment/pay-with-token",{tagadaToken:e.tagadaToken,checkoutSessionId:e.checkoutSessionId,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,metadata:e.metadata}):this.http.post("/api/public/v1/checkout/pay-v2",{checkoutSessionId:e.checkoutSessionId,paymentInstrumentId:e.paymentInstrumentId,storeId:this.storeId,paymentFlowId:e.paymentFlowId,threedsSessionId:e.threedsSessionId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,metadata:e.metadata})}async payDirect(e){return this.http.post("/api/public/v1/checkout/pay-v2",{checkoutSessionId:e.checkoutSessionId,paymentInstrumentId:e.paymentInstrumentId??"",storeId:this.storeId,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,threedsSessionId:e.threedsSessionId})}async processApplePay(e){let t=await this.loadCoreJs(),n=new t.Tokenizer({environment:this.environment});await n.initialize();let{tagadaToken:s}=await n.tokenizeApplePay(e.applePayToken);return this.pay({checkoutSessionId:e.checkoutSessionId,tagadaToken:s,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:"apple_pay",isExpress:!0})}async processGooglePay(e){let t=await this.loadCoreJs(),n=new t.Tokenizer({environment:this.environment});await n.initialize();let{tagadaToken:s}=await n.tokenizeGooglePay(e.googlePayToken);return this.pay({checkoutSessionId:e.checkoutSessionId,tagadaToken:s,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:"google_pay",isExpress:!0})}async processApm(e){return this.payDirect({checkoutSessionId:e.checkoutSessionId,paymentMethod:e.paymentMethod,processorId:e.processorId,paymentFlowId:e.paymentFlowId})}async getPaymentStatus(e){return this.http.get(`/api/v1/payments/${e}`)}async pollPaymentStatus(e,t){let n=(t==null?void 0:t.intervalMs)??1500,s=(t==null?void 0:t.timeoutMs)??6e4,a=Date.now();for(;Date.now()-a<s;){let o=await this.getPaymentStatus(e);if(o.status==="succeeded"||o.status==="failed"||o.status==="declined")return o;await new Promise(p=>setTimeout(p,n))}throw new Error(`Payment ${e} did not reach terminal status within ${s}ms.`)}async completeAfter3ds(e){return this.http.post("/api/v1/payments/complete-after-3ds",{paymentId:e})}async loadCoreJs(){try{return await import("@tagadapay/core-js")}catch{throw new Error("This method requires @tagadapay/core-js. Install it: npm install @tagadapay/core-js")}}};var V=class{constructor(e,t){this.http=e;this.storeId=t;this.pixels={loaded:!1};this.eventQueue=[];this.dedupeSet=new Set}async init(e){if(this.pixels.loaded)return;let t=e==null?void 0:e.pixelConfig;if(!t)try{t=(await this.http.get("/api/v1/checkout/config",{params:{storeId:this.storeId}})).pixels}catch{}this.pixels={loaded:!0,config:t},typeof window<"u"&&t&&this.loadPixelScripts(t),this.flushQueue()}trackPageView(e){this.fireEvent("PageView",{page:e??this.getCurrentPath()})}trackViewContent(e){this.fireEvent("ViewContent",e)}trackAddToCart(e){this.fireEvent("AddToCart",e)}trackInitiateCheckout(e){this.fireEvent("InitiateCheckout",e??{})}trackAddPaymentInfo(e){this.fireEvent("AddPaymentInfo",e??{})}trackPurchase(e){this.fireEvent("Purchase",e,!0)}trackCustomEvent(e,t){this.fireEvent(e,t??{})}trackStep(e){this.fireEvent("FunnelStep",e),this.http.post("/api/v1/funnel-tracking/step",{storeId:this.storeId,...e}).catch(()=>{})}trackConversion(e){this.fireEvent("Conversion",e,!0)}fireEvent(e,t,n=!1){if(n){let s=`${e}:${JSON.stringify(t)}`;if(this.dedupeSet.has(s))return;this.dedupeSet.add(s)}if(!this.pixels.loaded){this.eventQueue.push({event:e,data:t});return}this.sendToMeta(e,t),this.sendToTikTok(e,t),this.sendToSnapchat(e,t),this.sendToGTM(e,t),this.sendToGA(e,t)}flushQueue(){let e=[...this.eventQueue];this.eventQueue=[];for(let{event:t,data:n}of e)this.fireEvent(t,n)}getCurrentPath(){return typeof window<"u"?window.location.pathname:"/"}loadPixelScripts(e){e.metaPixelId&&this.loadMetaPixel(e.metaPixelId),e.tiktokPixelId&&this.loadTikTokPixel(e.tiktokPixelId),e.snapchatPixelId&&this.loadSnapchatPixel(e.snapchatPixelId),e.gtmId&&this.loadGTM(e.gtmId),e.gaId&&this.loadGA(e.gaId)}loadMetaPixel(e){if(typeof window>"u")return;let t=window;if(t.fbq)return;let n=t.fbq=function(...s){n.callMethod?n.callMethod(...s):n.queue.push(s)};n.queue=[],n.loaded=!0,n.version="2.0",this.injectScript("https://connect.facebook.net/en_US/fbevents.js"),t.fbq("init",e)}loadTikTokPixel(e){if(typeof window>"u")return;let t=window;if(t.ttq)return;let n={};n.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],n.setAndDefer=function(s,a){s[a]=function(...o){s.push([a,...o])}},t.ttq=n,this.injectScript("https://analytics.tiktok.com/i18n/pixel/events.js?sdkid="+e)}loadSnapchatPixel(e){if(typeof window>"u")return;let t=window;t.snaptr||(t.snaptr=function(...n){t.snaptr.handleRequest?t.snaptr.handleRequest(...n):t.snaptr.queue.push(n)},t.snaptr.queue=[],this.injectScript("https://sc-static.net/scevent.min.js"),t.snaptr("init",e))}loadGTM(e){if(typeof window>"u")return;let t=window;t.dataLayer=t.dataLayer??[],t.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),this.injectScript(`https://www.googletagmanager.com/gtm.js?id=${e}`)}loadGA(e){if(typeof window>"u")return;this.injectScript(`https://www.googletagmanager.com/gtag/js?id=${e}`);let t=window;t.dataLayer=t.dataLayer??[],t.gtag=function(...n){t.dataLayer.push(n)},t.gtag("js",new Date),t.gtag("config",e)}injectScript(e){if(typeof document>"u")return;let t=document.createElement("script");t.async=!0,t.src=e,document.head.appendChild(t)}sendToMeta(e,t){let n=typeof window<"u"?window:null,s=n==null?void 0:n.fbq;if(!s)return;let o={PageView:"PageView",ViewContent:"ViewContent",AddToCart:"AddToCart",InitiateCheckout:"InitiateCheckout",AddPaymentInfo:"AddPaymentInfo",Purchase:"Purchase"}[e];o?s("track",o,t):s("trackCustom",e,t)}sendToTikTok(e,t){var a,o;let n=typeof window<"u"?window:null,s=n==null?void 0:n.ttq;s&&(e==="PageView"?(a=s.page)==null||a.call(s):(o=s.track)==null||o.call(s,e,t))}sendToSnapchat(e,t){let n=typeof window<"u"?window:null,s=n==null?void 0:n.snaptr;if(!s)return;let o={PageView:"PAGE_VIEW",ViewContent:"VIEW_CONTENT",AddToCart:"ADD_CART",InitiateCheckout:"START_CHECKOUT",Purchase:"PURCHASE"}[e];o&&s("track",o,t)}sendToGTM(e,t){let n=typeof window<"u"?window:null,s=n==null?void 0:n.dataLayer;s&&s.push({event:e,...t})}sendToGA(e,t){let n=typeof window<"u"?window:null,s=n==null?void 0:n.gtag;s&&s("event",e,t)}};var z=class{constructor(e,t){this.http=e;this.storeId=t}async loadOffer(e){return(await this.http.get(`/api/v1/checkout-offers/${e}`,{params:{storeId:this.storeId}})).offer}async listOffers(e){return(await this.http.get("/api/v1/checkout-offers",{params:{storeId:this.storeId,type:e==null?void 0:e.type}})).offers}async acceptOffer(e){return this.http.post("/api/v1/checkout-offers/accept",{offerId:e.offerId,checkoutSessionId:e.checkoutSessionId,storeId:this.storeId,paymentInstrumentId:e.paymentInstrumentId})}async declineOffer(e){return this.http.post("/api/v1/checkout-offers/decline",{offerId:e.offerId,checkoutSessionId:e.checkoutSessionId,storeId:this.storeId})}async listOrderBumps(e){return(await this.http.get("/api/v1/checkout-offers",{params:{storeId:this.storeId,checkoutSessionId:e,type:"orderbump"}})).offers}async toggleOrderBump(e){await this.http.post(`/api/v1/checkout-sessions/${e.checkoutSessionId}/order-bumps`,{offerId:e.offerId,selected:e.selected})}};var F=class{constructor(e,t){this.http=e;this.storeId=t}async getProfile(e){return(await this.http.get(`/api/v1/customers/${e}`,{params:{storeId:this.storeId}})).customer}async getByEmail(e){try{return(await this.http.get("/api/v1/customers/by-email",{params:{email:e,storeId:this.storeId}})).customer}catch{return null}}async updateProfile(e,t){return(await this.http.patch(`/api/v1/customers/${e}`,{storeId:this.storeId,...t})).customer}async getOrders(e,t){return this.http.get(`/api/v1/customers/${e}/orders`,{params:{storeId:this.storeId,limit:t==null?void 0:t.limit,offset:t==null?void 0:t.offset}})}async getOrder(e){return(await this.http.get(`/api/v1/orders/${e}`,{params:{storeId:this.storeId}})).order}async getSubscriptions(e){return(await this.http.get(`/api/v1/customers/${e}/subscriptions`,{params:{storeId:this.storeId}})).subscriptions}async getSubscription(e){return(await this.http.get(`/api/v1/subscriptions/${e}`,{params:{storeId:this.storeId}})).subscription}};var J=class{constructor(e){let t=e.environment??"production",n=q.resolveBaseUrl(t,e.baseUrl);this.config={...e,environment:t,baseUrl:n,timeout:e.timeout??3e4},this.http=new q({baseUrl:n,timeout:this.config.timeout,apiKey:e.apiKey,getToken:()=>this._sessionToken});let s=a=>{this._sessionToken=a};this.checkout=new _(this.http,this.config.storeId,s),this.payment=new D(this.http,this.config.storeId,t),this.analytics=new V(this.http,this.config.storeId),this.offers=new z(this.http,this.config.storeId),this.customer=new F(this.http,this.config.storeId)}setSessionToken(e){this._sessionToken=e}};function Q(r){return new J(r)}var Y=A("react/jsx-runtime"),W=(0,O.createContext)(null);function X({storeId:r,environment:e,apiKey:t,baseUrl:n,config:s,children:a}){let o=(0,O.useMemo)(()=>Q(s??{storeId:r,environment:e,apiKey:t,baseUrl:n}),[r,e,t,n,s]),p=(0,O.useMemo)(()=>({client:o}),[o]);return(0,Y.jsx)(W.Provider,{value:p,children:a})}function R(){let r=(0,O.useContext)(W);if(!r)throw new Error("useHeadlessClient must be used within <TagadaHeadlessProvider>");return r.client}var S=A("react");function Z(r,e){let t=R(),[n,s]=(0,S.useState)(null),[a,o]=(0,S.useState)(!1),[p,u]=(0,S.useState)(null),l=(0,S.useCallback)(async()=>{if(r){o(!0),u(null);try{let d=await t.checkout.loadSession(r,e);s(d)}catch(d){u(d instanceof Error?d:new Error(String(d)))}finally{o(!1)}}},[t,r,e]);(0,S.useEffect)(()=>{l()},[l]);let h=(0,S.useCallback)(async d=>{o(!0),u(null);try{let k=await t.checkout.createSession(d),M=new URL(window.location.href);M.searchParams.set("checkoutToken",k.checkoutToken),M.searchParams.set("token",k.sessionToken),window.history.replaceState({},"",M.toString());let G=await t.checkout.loadSession(k.checkoutToken,k.sessionToken);s(G)}catch(k){u(k instanceof Error?k:new Error(String(k)))}finally{o(!1)}},[t]),y=(0,S.useCallback)(async d=>{if(!n)return;let k=await t.checkout.updateCart(n.id,d);s(k)},[t,n]),c=(0,S.useCallback)(async d=>{if(!n)return;let k=await t.checkout.updateCustomer(n.id,d);s(k)},[t,n]),P=(0,S.useCallback)(async d=>{if(!n)return;let k=await t.checkout.updateAddress(n.id,d);s(k)},[t,n]),g=(0,S.useCallback)(async d=>{if(!n)return;let k=await t.checkout.applyPromoCode(n.id,d);s(k)},[t,n]),i=(0,S.useCallback)(async()=>{if(!n)return;let d=await t.checkout.removePromoCode(n.id);s(d)},[t,n]),m=(0,S.useCallback)(async()=>n?t.checkout.getShippingRates(n.id):[],[t,n]),f=(0,S.useCallback)(async d=>{if(!n)return;let k=await t.checkout.selectShippingRate(n.id,d);s(k)},[t,n]);return{session:n,isLoading:a,error:p,refresh:l,createSession:h,updateCart:y,updateCustomer:c,updateAddress:P,applyPromo:g,removePromo:i,getShippingRates:m,selectShippingRate:f}}var I=A("react");function ee(){let r=R(),[e,t]=(0,I.useState)(null),[n,s]=(0,I.useState)(null),[a,o]=(0,I.useState)(null),[p,u]=(0,I.useState)(!1),[l,h]=(0,I.useState)(null),[y,c]=(0,I.useState)(null),P=(0,I.useRef)(!1),g=(0,I.useCallback)(async v=>{if(!P.current){P.current=!0;try{let[w,C,re]=await Promise.all([r.payment.getPaymentSetup(v),r.payment.getExpressMethods(v),r.payment.getStoreConfig()]);t(w),s(C),o(re)}catch(w){P.current=!1,c(w instanceof Error?w:new Error(String(w)))}}},[r]),i=(0,I.useCallback)(v=>async()=>{u(!0),c(null);try{return await v()}catch(w){let C=w instanceof Error?w:new Error(String(w));throw c(C),C}finally{u(!1)}},[]),m=(0,I.useCallback)(async v=>{u(!0),c(null);try{let w=await r.payment.pay(v);return h(w),w}catch(w){let C=w instanceof Error?w:new Error(String(w));throw c(C),C}finally{u(!1)}},[r]),f=(0,I.useCallback)(v=>r.payment.tokenizeCard(v),[r]),d=(0,I.useCallback)(async v=>{let C=await i(()=>r.payment.processApplePay(v))();return h(C),C},[r,i]),k=(0,I.useCallback)(async v=>{let C=await i(()=>r.payment.processGooglePay(v))();return h(C),C},[r,i]),M=(0,I.useCallback)(async v=>{let C=await i(()=>r.payment.processApm(v))();return h(C),C},[r,i]),G=(0,I.useCallback)(v=>r.payment.pollPaymentStatus(v),[r]);return{paymentSetup:e,expressMethods:n,storeConfig:a,isProcessing:p,result:l,error:y,loadPaymentSetup:g,pay:m,tokenizeCard:f,processApplePay:d,processGooglePay:k,processApm:M,pollStatus:G}}var E=A("react");function te(){let r=R(),[e,t]=(0,E.useState)(null),[n,s]=(0,E.useState)(!1),[a,o]=(0,E.useState)(null),[p,u]=(0,E.useState)(null),l=(0,E.useCallback)(async g=>{s(!0),o(null);try{let i=await r.offers.loadOffer(g);return t(i),i}catch(i){let m=i instanceof Error?i:new Error(String(i));throw o(m),m}finally{s(!1)}},[r]),h=(0,E.useCallback)(g=>r.offers.listOffers(g),[r]),y=(0,E.useCallback)(async g=>{s(!0),o(null);try{let i=await r.offers.acceptOffer(g);return u(i),i}catch(i){let m=i instanceof Error?i:new Error(String(i));throw o(m),m}finally{s(!1)}},[r]),c=(0,E.useCallback)(async g=>{s(!0),o(null);try{let i=await r.offers.declineOffer(g);return u(i),i}catch(i){let m=i instanceof Error?i:new Error(String(i));throw o(m),m}finally{s(!1)}},[r]),P=(0,E.useCallback)(g=>r.offers.listOrderBumps(g),[r]);return{offer:e,isLoading:n,error:a,result:p,loadOffer:l,listOffers:h,acceptOffer:y,declineOffer:c,listOrderBumps:P}}var b=A("react");function ne(r){let e=R(),[t,n]=(0,b.useState)(null),[s,a]=(0,b.useState)([]),[o,p]=(0,b.useState)([]),[u,l]=(0,b.useState)(!1),[h,y]=(0,b.useState)(null),c=(0,b.useCallback)(async m=>{l(!0),y(null);try{let f=await e.customer.getProfile(m);n(f)}catch(f){y(f instanceof Error?f:new Error(String(f)))}finally{l(!1)}},[e]),P=(0,b.useCallback)(async m=>{try{let f=await e.customer.getOrders(m);a(f.orders)}catch(f){y(f instanceof Error?f:new Error(String(f)))}},[e]),g=(0,b.useCallback)(async m=>{try{let f=await e.customer.getSubscriptions(m);p(f)}catch(f){y(f instanceof Error?f:new Error(String(f)))}},[e]),i=(0,b.useCallback)(async(m,f)=>{try{let d=await e.customer.updateProfile(m,f);n(d)}catch(d){y(d instanceof Error?d:new Error(String(d)))}},[e]);return(0,b.useEffect)(()=>{r&&c(r)},[r,c]),{customer:t,orders:s,subscriptions:o,isLoading:u,error:h,loadCustomer:c,loadOrders:P,loadSubscriptions:g,updateProfile:i}}var T=A("react");function se(r){let e=R(),t=(0,T.useRef)(!1);(0,T.useEffect)(()=>{t.current||(t.current=!0,e.analytics.init({pixelConfig:r==null?void 0:r.pixelConfig}))},[e,r==null?void 0:r.pixelConfig]);let n=(0,T.useCallback)(c=>e.analytics.trackPageView(c),[e]),s=(0,T.useCallback)(c=>e.analytics.trackViewContent(c),[e]),a=(0,T.useCallback)(c=>e.analytics.trackAddToCart(c),[e]),o=(0,T.useCallback)(c=>e.analytics.trackInitiateCheckout(c),[e]),p=(0,T.useCallback)(c=>e.analytics.trackAddPaymentInfo(c),[e]),u=(0,T.useCallback)(c=>e.analytics.trackPurchase(c),[e]),l=(0,T.useCallback)(c=>e.analytics.trackStep(c),[e]),h=(0,T.useCallback)(c=>e.analytics.trackConversion(c),[e]),y=(0,T.useCallback)((c,P)=>e.analytics.trackCustomEvent(c,P),[e]);return{trackPageView:n,trackViewContent:s,trackAddToCart:a,trackInitiateCheckout:o,trackAddPaymentInfo:p,trackPurchase:u,trackStep:l,trackConversion:h,trackCustomEvent:y}}return le(me);})();
|
|
7
|
+
if(typeof window!=="undefined"&&TagadaHeadlessReactBundle){ window.TagadaHeadlessReact=TagadaHeadlessReactBundle;}
|
|
8
|
+
//# sourceMappingURL=tagada-headless-react.min.js.map
|