@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,58 @@
1
+ import type { CheckoutSession, LineItem, ShippingRate, Address, CheckoutCustomer } from '../../core/types.js';
2
+ export interface UseCheckoutReturn {
3
+ session: CheckoutSession | null;
4
+ isLoading: boolean;
5
+ error: Error | null;
6
+ /** Reload the session from the server. */
7
+ refresh: () => Promise<void>;
8
+ /** Create a new checkout session (auto-loads it after creation). */
9
+ createSession: (opts: {
10
+ items: LineItem[];
11
+ currency?: string;
12
+ returnUrl?: string;
13
+ customerEmail?: string;
14
+ }) => Promise<void>;
15
+ /** Replace cart items. */
16
+ updateCart: (items: LineItem[]) => Promise<void>;
17
+ /** Update customer info on the session. */
18
+ updateCustomer: (customer: Partial<CheckoutCustomer>) => Promise<void>;
19
+ /** Update address on the session. */
20
+ updateAddress: (addresses: {
21
+ shippingAddress?: Address;
22
+ billingAddress?: Address;
23
+ }) => Promise<void>;
24
+ /**
25
+ * Update customer info AND address in a single call. Prefer this over
26
+ * calling `updateCustomer` then `updateAddress` separately — the
27
+ * underlying server action is destructive on partial saves
28
+ * (`customers.firstName = shippingAddress.firstName ?? null`), so
29
+ * sending the address without the customer name will silently wipe
30
+ * `customer.firstName` / `customer.lastName` from the session.
31
+ */
32
+ updateCustomerAndAddress: (data: {
33
+ customer: Partial<CheckoutCustomer>;
34
+ shippingAddress?: Address;
35
+ billingAddress?: Address;
36
+ }) => Promise<void>;
37
+ /** Apply a promo code. */
38
+ applyPromo: (code: string) => Promise<void>;
39
+ /** Remove the applied promo code. */
40
+ removePromo: (promotionId?: string) => Promise<void>;
41
+ /** Fetch shipping rates. */
42
+ getShippingRates: () => Promise<ShippingRate[]>;
43
+ /** Select a shipping rate. */
44
+ selectShippingRate: (rateId: string) => Promise<void>;
45
+ }
46
+ /**
47
+ * React hook for checkout session management.
48
+ *
49
+ * @param checkoutToken - The checkout token from the URL (e.g. `?checkoutToken=xxx`).
50
+ * @param sessionToken - Optional JWT session token (from URL param `token`).
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * const { session, isLoading, applyPromo, createSession } = useCheckout(checkoutToken, sessionToken);
55
+ * ```
56
+ */
57
+ export declare function useCheckout(checkoutToken: string | null | undefined, sessionToken?: string): UseCheckoutReturn;
58
+ //# sourceMappingURL=useCheckout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCheckout.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useCheckout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE9G,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,oEAAoE;IACpE,aAAa,EAAE,CAAC,IAAI,EAAE;QACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,0BAA0B;IAC1B,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,2CAA2C;IAC3C,cAAc,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,qCAAqC;IACrC,aAAa,EAAE,CAAC,SAAS,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG;;;;;;;OAOG;IACH,wBAAwB,EAAE,CAAC,IAAI,EAAE;QAC/B,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpC,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,0BAA0B;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,qCAAqC;IACrC,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,4BAA4B;IAC5B,gBAAgB,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChD,8BAA8B;IAC9B,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,CAgKnB"}
@@ -0,0 +1,177 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { useHeadlessClient } from '../provider.js';
3
+ /**
4
+ * React hook for checkout session management.
5
+ *
6
+ * @param checkoutToken - The checkout token from the URL (e.g. `?checkoutToken=xxx`).
7
+ * @param sessionToken - Optional JWT session token (from URL param `token`).
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { session, isLoading, applyPromo, createSession } = useCheckout(checkoutToken, sessionToken);
12
+ * ```
13
+ */
14
+ export function useCheckout(checkoutToken, sessionToken) {
15
+ const client = useHeadlessClient();
16
+ const [session, setSession] = useState(null);
17
+ const [isLoading, setIsLoading] = useState(false);
18
+ const [error, setError] = useState(null);
19
+ const loadSession = useCallback(async () => {
20
+ if (!checkoutToken)
21
+ return;
22
+ setIsLoading(true);
23
+ setError(null);
24
+ try {
25
+ const s = await client.checkout.loadSession(checkoutToken, sessionToken);
26
+ setSession(s);
27
+ }
28
+ catch (err) {
29
+ setError(err instanceof Error ? err : new Error(String(err)));
30
+ }
31
+ finally {
32
+ setIsLoading(false);
33
+ }
34
+ }, [client, checkoutToken, sessionToken]);
35
+ useEffect(() => {
36
+ loadSession();
37
+ }, [loadSession]);
38
+ const createSession = useCallback(async (opts) => {
39
+ setIsLoading(true);
40
+ setError(null);
41
+ try {
42
+ const result = await client.checkout.createSession(opts);
43
+ const newUrl = new URL(window.location.href);
44
+ newUrl.searchParams.set('checkoutToken', result.checkoutToken);
45
+ newUrl.searchParams.set('token', result.sessionToken);
46
+ window.history.replaceState({}, '', newUrl.toString());
47
+ const s = await client.checkout.loadSession(result.checkoutToken, result.sessionToken);
48
+ setSession(s);
49
+ }
50
+ catch (err) {
51
+ setError(err instanceof Error ? err : new Error(String(err)));
52
+ }
53
+ finally {
54
+ setIsLoading(false);
55
+ }
56
+ }, [client]);
57
+ const updateCart = useCallback(async (items) => {
58
+ if (!session)
59
+ return;
60
+ // `updateCart` returns mutation stats (counts), not a CheckoutSession.
61
+ // We previously assigned that result into `setSession`, which silently
62
+ // replaced the session with `{ success, updated, created, total }`.
63
+ // Mirror the same pattern as `updateAddress`: mutate, then reload.
64
+ setIsLoading(true);
65
+ try {
66
+ await client.checkout.updateCart(session.id, items);
67
+ await loadSession();
68
+ }
69
+ catch (err) {
70
+ setError(err instanceof Error ? err : new Error(String(err)));
71
+ }
72
+ finally {
73
+ setIsLoading(false);
74
+ }
75
+ }, [client, session, loadSession]);
76
+ const updateCustomer = useCallback(async (customer) => {
77
+ if (!session)
78
+ return;
79
+ await client.checkout.updateCustomer(session.id, customer);
80
+ }, [client, session]);
81
+ const updateAddress = useCallback(async (addresses) => {
82
+ if (!session)
83
+ return;
84
+ setIsLoading(true);
85
+ try {
86
+ await client.checkout.updateAddress(session.id, addresses);
87
+ await loadSession();
88
+ }
89
+ catch (err) {
90
+ setError(err instanceof Error ? err : new Error(String(err)));
91
+ }
92
+ finally {
93
+ setIsLoading(false);
94
+ }
95
+ }, [client, session, loadSession]);
96
+ const updateCustomerAndAddress = useCallback(async (data) => {
97
+ if (!session)
98
+ return;
99
+ setIsLoading(true);
100
+ try {
101
+ await client.checkout.updateCustomerAndAddress(session.id, data);
102
+ await loadSession();
103
+ }
104
+ catch (err) {
105
+ setError(err instanceof Error ? err : new Error(String(err)));
106
+ }
107
+ finally {
108
+ setIsLoading(false);
109
+ }
110
+ }, [client, session, loadSession]);
111
+ const applyPromo = useCallback(async (code) => {
112
+ if (!session)
113
+ return;
114
+ setIsLoading(true);
115
+ try {
116
+ await client.checkout.applyPromoCode(session.id, code);
117
+ await loadSession();
118
+ }
119
+ catch (err) {
120
+ setError(err instanceof Error ? err : new Error(String(err)));
121
+ }
122
+ finally {
123
+ setIsLoading(false);
124
+ }
125
+ }, [client, session, loadSession]);
126
+ const removePromo = useCallback(async (promotionId) => {
127
+ if (!session)
128
+ return;
129
+ setIsLoading(true);
130
+ try {
131
+ await client.checkout.removePromoCode(session.id, promotionId);
132
+ await loadSession();
133
+ }
134
+ catch (err) {
135
+ setError(err instanceof Error ? err : new Error(String(err)));
136
+ }
137
+ finally {
138
+ setIsLoading(false);
139
+ }
140
+ }, [client, session, loadSession]);
141
+ const getShippingRates = useCallback(async () => {
142
+ if (!session)
143
+ return [];
144
+ return client.checkout.getShippingRates(session.id);
145
+ }, [client, session]);
146
+ const selectShippingRate = useCallback(async (rateId) => {
147
+ if (!session)
148
+ return;
149
+ setIsLoading(true);
150
+ try {
151
+ await client.checkout.selectShippingRate(session.id, rateId);
152
+ await loadSession();
153
+ }
154
+ catch (err) {
155
+ setError(err instanceof Error ? err : new Error(String(err)));
156
+ }
157
+ finally {
158
+ setIsLoading(false);
159
+ }
160
+ }, [client, session, loadSession]);
161
+ return {
162
+ session,
163
+ isLoading,
164
+ error,
165
+ refresh: loadSession,
166
+ createSession,
167
+ updateCart,
168
+ updateCustomer,
169
+ updateAddress,
170
+ updateCustomerAndAddress,
171
+ applyPromo,
172
+ removePromo,
173
+ getShippingRates,
174
+ selectShippingRate,
175
+ };
176
+ }
177
+ //# sourceMappingURL=useCheckout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCheckout.js","sourceRoot":"","sources":["../../../src/react/hooks/useCheckout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Customer, Order, Subscription } from '../../core/types.js';
2
+ export interface UseCustomerReturn {
3
+ customer: Customer | null;
4
+ orders: Order[];
5
+ subscriptions: Subscription[];
6
+ isLoading: boolean;
7
+ error: Error | null;
8
+ /** Load customer profile by ID. */
9
+ loadCustomer: (customerId: string) => Promise<void>;
10
+ /** Load customer orders. */
11
+ loadOrders: (customerId: string) => Promise<void>;
12
+ /** Load customer subscriptions. */
13
+ loadSubscriptions: (customerId: string) => Promise<void>;
14
+ /** Update customer profile. */
15
+ updateProfile: (customerId: string, data: Partial<Pick<Customer, 'email' | 'firstName' | 'lastName' | 'phone'>>) => Promise<void>;
16
+ }
17
+ /**
18
+ * React hook for customer data -- profile, orders, subscriptions.
19
+ *
20
+ * @param customerId - Auto-loads the customer profile when provided.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const { customer, orders, loadOrders } = useCustomer(session?.customer?.id);
25
+ * ```
26
+ */
27
+ export declare function useCustomer(customerId?: string | null): UseCustomerReturn;
28
+ //# sourceMappingURL=useCustomer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCustomer.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useCustomer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,mCAAmC;IACnC,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,4BAA4B;IAC5B,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,mCAAmC;IACnC,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,+BAA+B;IAC/B,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnI;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAkEzE"}
@@ -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,26 @@
1
+ /**
2
+ * React hook for Google Places Autocomplete — handles script injection,
3
+ * debounced prediction search, place detail fetching, and address extraction.
4
+ */
5
+ import { type GooglePrediction, type GooglePlaceDetails, type ExtractedAddress, type FormattedAddress } from '../../core/helpers/autocomplete.js';
6
+ export type { GooglePrediction, GooglePlaceDetails, ExtractedAddress, FormattedAddress };
7
+ export interface UseGoogleAutocompleteOptions {
8
+ apiKey: string;
9
+ language?: string;
10
+ region?: string;
11
+ version?: string;
12
+ /** Defer script loading until searchPlaces() is first called. Default: false. */
13
+ defer?: boolean;
14
+ }
15
+ export interface UseGoogleAutocompleteReturn {
16
+ predictions: GooglePrediction[];
17
+ isLoading: boolean;
18
+ isScriptLoaded: boolean;
19
+ searchPlaces: (input: string, countryRestriction?: string) => void;
20
+ getPlaceDetails: (placeId: string) => Promise<GooglePlaceDetails | null>;
21
+ extractAddressComponents: (place: GooglePlaceDetails) => ExtractedAddress;
22
+ extractFormattedAddress: (place: GooglePlaceDetails) => FormattedAddress;
23
+ clearPredictions: () => void;
24
+ }
25
+ export declare function useGoogleAutocomplete(options: UseGoogleAutocompleteOptions): UseGoogleAutocompleteReturn;
26
+ //# sourceMappingURL=useGoogleAutocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGoogleAutocomplete.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useGoogleAutocomplete.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,oCAAoC,CAAC;AAE5C,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;AAEzF,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACzE,wBAAwB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,gBAAgB,CAAC;IAC1E,uBAAuB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,gBAAgB,CAAC;IACzE,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,2BAA2B,CA8ExG"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * React hook for Google Places Autocomplete — handles script injection,
3
+ * debounced prediction search, place detail fetching, and address extraction.
4
+ */
5
+ import { useCallback, useEffect, useRef, useState } from 'react';
6
+ import { GoogleAutocompleteCore, loadGoogleMapsScript, } from '../../core/helpers/autocomplete.js';
7
+ export function useGoogleAutocomplete(options) {
8
+ const { apiKey, language, region, version, defer = false } = options;
9
+ const [predictions, setPredictions] = useState([]);
10
+ const [isLoading, setIsLoading] = useState(false);
11
+ const [isScriptLoaded, setIsScriptLoaded] = useState(false);
12
+ const debounceRef = useRef(null);
13
+ const pendingRef = useRef(null);
14
+ const inject = useCallback(() => {
15
+ loadGoogleMapsScript(apiKey, { language, region, version }).then(() => setIsScriptLoaded(true));
16
+ }, [apiKey, language, region, version]);
17
+ // Eager load unless defer
18
+ useEffect(() => {
19
+ if (!apiKey || defer)
20
+ return;
21
+ inject();
22
+ }, [apiKey, defer, inject]);
23
+ // Replay pending search after deferred load
24
+ useEffect(() => {
25
+ if (isScriptLoaded && pendingRef.current) {
26
+ const { input, country } = pendingRef.current;
27
+ pendingRef.current = null;
28
+ doSearch(input, country);
29
+ }
30
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31
+ }, [isScriptLoaded]);
32
+ const doSearch = useCallback((input, countryRestriction) => {
33
+ if (!isScriptLoaded) {
34
+ if (defer) {
35
+ pendingRef.current = { input, country: countryRestriction };
36
+ inject();
37
+ }
38
+ return;
39
+ }
40
+ if (input.length < 3) {
41
+ setPredictions([]);
42
+ return;
43
+ }
44
+ if (debounceRef.current)
45
+ clearTimeout(debounceRef.current);
46
+ debounceRef.current = setTimeout(async () => {
47
+ setIsLoading(true);
48
+ const results = await GoogleAutocompleteCore.searchPlaces(input, {
49
+ componentRestrictions: countryRestriction ? { country: countryRestriction.toLowerCase() } : undefined,
50
+ });
51
+ setPredictions(results);
52
+ setIsLoading(false);
53
+ }, 300);
54
+ }, [isScriptLoaded, defer, inject]);
55
+ const getPlaceDetails = useCallback((placeId) => GoogleAutocompleteCore.getPlaceDetails(placeId), []);
56
+ const extractAddressComponents = useCallback((place) => GoogleAutocompleteCore.extractAddressComponents(place), []);
57
+ const extractFormattedAddress = useCallback((place) => GoogleAutocompleteCore.extractFormattedAddress(place), []);
58
+ const clearPredictions = useCallback(() => setPredictions([]), []);
59
+ return {
60
+ predictions,
61
+ isLoading,
62
+ isScriptLoaded,
63
+ searchPlaces: doSearch,
64
+ getPlaceDetails,
65
+ extractAddressComponents,
66
+ extractFormattedAddress,
67
+ clearPredictions,
68
+ };
69
+ }
70
+ //# sourceMappingURL=useGoogleAutocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGoogleAutocomplete.js","sourceRoot":"","sources":["../../../src/react/hooks/useGoogleAutocomplete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * React hooks for ISO country/region data — CDN-backed,
3
+ * with Google Places → ISO region mapping.
4
+ */
5
+ import { type ISOCountry, type ISORegion, type SupportedLanguage } from '../../core/helpers/countries.js';
6
+ export type { ISOCountry, ISORegion, SupportedLanguage };
7
+ export interface UseISODataReturn {
8
+ countries: Record<string, ISOCountry>;
9
+ getRegions: (countryCode: string) => ISORegion[];
10
+ findRegion: (countryCode: string, regionCode: string) => ISORegion | null;
11
+ mapGoogleToISO: (googleState: string, googleStateLong: string, countryCode: string) => ISORegion | null;
12
+ isLoaded: boolean;
13
+ }
14
+ export declare function useISOData(language?: SupportedLanguage): UseISODataReturn;
15
+ export declare function useCountryOptions(language?: SupportedLanguage): Array<{
16
+ value: string;
17
+ label: string;
18
+ }>;
19
+ export declare function useRegionOptions(countryCode: string, language?: SupportedLanguage): Array<{
20
+ value: string;
21
+ label: string;
22
+ }>;
23
+ //# sourceMappingURL=useISOData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useISOData.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useISOData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAMzD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IACjD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC;IAC1E,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC;IACxG,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,QAAQ,GAAE,iBAAwB,GAAG,gBAAgB,CA8B/E;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,iBAAwB,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ7G;AAMD,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,iBAAwB,GACjC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQzC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * React hooks for ISO country/region data — CDN-backed,
3
+ * with Google Places → ISO region mapping.
4
+ */
5
+ import { useEffect, useMemo, useState } from 'react';
6
+ import { ISODataCore, } from '../../core/helpers/countries.js';
7
+ import { ensureGeoDataLoaded, isLanguageLoaded } from '../../core/helpers/iso3166.js';
8
+ export function useISOData(language = 'en') {
9
+ const [isLoaded, setIsLoaded] = useState(isLanguageLoaded(language));
10
+ useEffect(() => {
11
+ let cancelled = false;
12
+ ensureGeoDataLoaded(language)
13
+ .then(() => { if (!cancelled)
14
+ setIsLoaded(true); })
15
+ .catch((err) => console.error('[headless-sdk] Failed to load geodata:', err));
16
+ return () => { cancelled = true; };
17
+ }, [language]);
18
+ return useMemo(() => {
19
+ if (!isLoaded) {
20
+ return {
21
+ countries: {},
22
+ getRegions: () => [],
23
+ findRegion: () => null,
24
+ mapGoogleToISO: () => null,
25
+ isLoaded: false,
26
+ };
27
+ }
28
+ return {
29
+ countries: ISODataCore.getCountries(language),
30
+ getRegions: (cc) => ISODataCore.getRegions(cc, language),
31
+ findRegion: (cc, rc) => ISODataCore.findRegion(cc, rc, language),
32
+ mapGoogleToISO: (gs, gsl, cc) => ISODataCore.mapGoogleToISO(gs, gsl, cc, language),
33
+ isLoaded: true,
34
+ };
35
+ }, [language, isLoaded]);
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // useCountryOptions — countries as select options
39
+ // ---------------------------------------------------------------------------
40
+ export function useCountryOptions(language = 'en') {
41
+ const { countries, isLoaded } = useISOData(language);
42
+ return useMemo(() => {
43
+ if (!isLoaded)
44
+ return [];
45
+ return Object.values(countries)
46
+ .map((c) => ({ value: c.iso, label: c.name }))
47
+ .sort((a, b) => a.label.localeCompare(b.label));
48
+ }, [countries, isLoaded]);
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // useRegionOptions — regions/states for a country as select options
52
+ // ---------------------------------------------------------------------------
53
+ export function useRegionOptions(countryCode, language = 'en') {
54
+ const { getRegions, isLoaded } = useISOData(language);
55
+ return useMemo(() => {
56
+ if (!isLoaded || !countryCode)
57
+ return [];
58
+ return getRegions(countryCode)
59
+ .map((r) => ({ value: r.iso, label: r.name }))
60
+ .sort((a, b) => a.label.localeCompare(b.label));
61
+ }, [countryCode, getRegions, isLoaded]);
62
+ }
63
+ //# sourceMappingURL=useISOData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useISOData.js","sourceRoot":"","sources":["../../../src/react/hooks/useISOData.ts"],"names":[],"mappings":"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"}