@doswiftly/storefront-sdk 19.0.0 → 19.2.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/CHANGELOG.md +138 -0
- package/dist/core/client/create-client.d.ts.map +1 -1
- package/dist/core/client/create-client.js +8 -1
- package/dist/core/client/remote-debug-transport.d.ts +48 -0
- package/dist/core/client/remote-debug-transport.d.ts.map +1 -0
- package/dist/core/client/remote-debug-transport.js +198 -0
- package/dist/core/client/types.d.ts +51 -1
- package/dist/core/client/types.d.ts.map +1 -1
- package/dist/core/generated/operation-types.d.ts +31 -0
- package/dist/core/generated/operation-types.d.ts.map +1 -1
- package/dist/core/generated/operation-types.js +8 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -0
- package/dist/core/operations/cart.d.ts.map +1 -1
- package/dist/core/operations/cart.js +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/react/cookies.d.ts +11 -1
- package/dist/react/cookies.d.ts.map +1 -1
- package/dist/react/cookies.js +11 -4
- package/dist/react/hooks/use-cart-manager.d.ts +7 -0
- package/dist/react/hooks/use-cart-manager.d.ts.map +1 -1
- package/dist/react/hooks/use-cart-manager.js +5 -2
- package/dist/react/providers/cart-manager-provider.d.ts +8 -1
- package/dist/react/providers/cart-manager-provider.d.ts.map +1 -1
- package/dist/react/providers/cart-manager-provider.js +2 -1
- package/dist/react/providers/storefront-provider.d.ts +12 -1
- package/dist/react/providers/storefront-provider.d.ts.map +1 -1
- package/dist/react/providers/storefront-provider.js +4 -3
- package/dist/react/stores/currency.store.d.ts +6 -1
- package/dist/react/stores/currency.store.d.ts.map +1 -1
- package/dist/react/stores/currency.store.js +49 -41
- package/dist/react/stores/language.store.d.ts +6 -1
- package/dist/react/stores/language.store.d.ts.map +1 -1
- package/dist/react/stores/language.store.js +46 -38
- package/package.json +1 -1
|
@@ -42,6 +42,7 @@ export const CartStatus = {
|
|
|
42
42
|
Recovered: 'RECOVERED'
|
|
43
43
|
};
|
|
44
44
|
export const CartWarningCode = {
|
|
45
|
+
DiscountCodeNotApplicable: 'DISCOUNT_CODE_NOT_APPLICABLE',
|
|
45
46
|
MerchandiseNotAvailable: 'MERCHANDISE_NOT_AVAILABLE',
|
|
46
47
|
MerchandiseNotEnoughStock: 'MERCHANDISE_NOT_ENOUGH_STOCK',
|
|
47
48
|
PaymentsAmountRegionMismatch: 'PAYMENTS_AMOUNT_REGION_MISMATCH',
|
|
@@ -300,6 +301,7 @@ export const DiscountErrorCode = {
|
|
|
300
301
|
Inactive: 'INACTIVE',
|
|
301
302
|
MinimumOrderNotMet: 'MINIMUM_ORDER_NOT_MET',
|
|
302
303
|
MinimumQuantityNotMet: 'MINIMUM_QUANTITY_NOT_MET',
|
|
304
|
+
NotApplicableToCart: 'NOT_APPLICABLE_TO_CART',
|
|
303
305
|
NotFound: 'NOT_FOUND',
|
|
304
306
|
NotStarted: 'NOT_STARTED',
|
|
305
307
|
ShopNotFound: 'SHOP_NOT_FOUND',
|
|
@@ -477,6 +479,12 @@ export const PaymentProvider = {
|
|
|
477
479
|
export const PaymentWarningCode = {
|
|
478
480
|
InstrumentClearedForRetry: 'INSTRUMENT_CLEARED_FOR_RETRY'
|
|
479
481
|
};
|
|
482
|
+
export const PickupSelectionMode = {
|
|
483
|
+
/** No browser widget — query points server-side (by city / postal code) and render your own list. `widgetToken` / `scriptUrl` are null for this mode. */
|
|
484
|
+
Search: 'SEARCH',
|
|
485
|
+
/** Render the carrier map widget (e.g. InPost Geowidget) initialised with `pickupConfig.widgetToken` + `pickupConfig.scriptUrl`. The buyer picks a point on the map. */
|
|
486
|
+
Widget: 'WIDGET'
|
|
487
|
+
};
|
|
480
488
|
export const ProductOptionInputType = {
|
|
481
489
|
ColorSwatch: 'COLOR_SWATCH',
|
|
482
490
|
Select: 'SELECT',
|
package/dist/core/index.d.ts
CHANGED
|
@@ -34,7 +34,9 @@
|
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
36
|
export { createStorefrontClient } from './client/create-client';
|
|
37
|
-
export type { StorefrontClient, StorefrontClientConfig, Middleware, ExecuteFn, GraphQLRequest, GraphQLResponse, GraphQLErrorInfo, UserError, CacheStrategy, CacheOptions, TypedDocumentString, } from './client/types';
|
|
37
|
+
export type { StorefrontClient, StorefrontClientConfig, Middleware, ExecuteFn, GraphQLRequest, GraphQLResponse, GraphQLErrorInfo, UserError, CacheStrategy, CacheOptions, TypedDocumentString, DebugOptions, DebugEvent, RemoteDebugOptions, RemoteDebugSink, } from './client/types';
|
|
38
|
+
export { createRemoteDebugTransport } from './client/remote-debug-transport';
|
|
39
|
+
export type { RemoteDebugTransport, RemoteDebugTransportConfig } from './client/remote-debug-transport';
|
|
38
40
|
export { authMiddleware } from './middleware/auth';
|
|
39
41
|
export { currencyMiddleware } from './middleware/currency';
|
|
40
42
|
export { languageMiddleware } from './middleware/language';
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.js
CHANGED
|
@@ -35,6 +35,9 @@
|
|
|
35
35
|
*/
|
|
36
36
|
// Client factory
|
|
37
37
|
export { createStorefrontClient } from './client/create-client';
|
|
38
|
+
// Remote debug transport — build one and share it across the client + cookie stores
|
|
39
|
+
// (`debug: { remote: transport }`) for a single debug channel / sessionId.
|
|
40
|
+
export { createRemoteDebugTransport } from './client/remote-debug-transport';
|
|
38
41
|
// Middleware
|
|
39
42
|
export { authMiddleware } from './middleware/auth';
|
|
40
43
|
export { currencyMiddleware } from './middleware/currency';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart.d.ts","sourceRoot":"","sources":["../../../src/core/operations/cart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"cart.d.ts","sourceRoot":"","sources":["../../../src/core/operations/cart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAibH,eAAO,MAAM,UAAU,QAOrB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qCAAqC,QAehD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,QAO1C,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAO/B,CAAC;AAMH,eAAO,MAAM,WAAW,QAWtB,CAAC;AAEH,eAAO,MAAM,cAAc,QAWzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAW5B,CAAC;AAEH,eAAO,MAAM,iBAAiB,QAW5B,CAAC;AAEH,eAAO,MAAM,0BAA0B,QAWrC,CAAC;AAEH,eAAO,MAAM,gBAAgB,QAW3B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAWjC,CAAC;AAEH,eAAO,MAAM,0BAA0B,QAWrC,CAAC;AAMH,eAAO,MAAM,yBAAyB,QAWpC,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAWnC,CAAC;AAEH,eAAO,MAAM,2BAA2B,QAWtC,CAAC;AAEH,eAAO,MAAM,0BAA0B,QAWrC,CAAC;AAEH,eAAO,MAAM,oBAAoB,QAW/B,CAAC;AAEH,eAAO,MAAM,qBAAqB,QAWhC,CAAC;AAEH,eAAO,MAAM,+BAA+B,QAW1C,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,QAWxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAWzB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,QAWvC,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,QAoBtC,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/react/cookies.d.ts
CHANGED
|
@@ -26,6 +26,16 @@ export declare function setCookie(name: string, value: string, options?: {
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function deleteCookie(name: string, path?: string): void;
|
|
28
28
|
import type { CartCookieStore } from '../core/cart/cart-recovery';
|
|
29
|
+
import type { DebugEvent } from '../core/client/types';
|
|
30
|
+
export interface BrowserCartCookieStoreOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Optional debug sink. When provided, every `set` / `clear` of the `cart-id` cookie emits a
|
|
33
|
+
* `phase: 'cookie'` {@link DebugEvent}. Wire it to the same transport the GraphQL client uses
|
|
34
|
+
* (one shared sessionId) to see exactly when the cart cookie is written or removed — e.g. the
|
|
35
|
+
* `clear()` that `complete()` performs after checkout.
|
|
36
|
+
*/
|
|
37
|
+
onDebug?: (event: DebugEvent) => void;
|
|
38
|
+
}
|
|
29
39
|
/**
|
|
30
40
|
* Build a browser-side `CartCookieStore` backed by `document.cookie`.
|
|
31
41
|
*
|
|
@@ -45,5 +55,5 @@ import type { CartCookieStore } from '../core/cart/cart-recovery';
|
|
|
45
55
|
* });
|
|
46
56
|
* ```
|
|
47
57
|
*/
|
|
48
|
-
export declare function createBrowserCartCookieStore(): CartCookieStore;
|
|
58
|
+
export declare function createBrowserCartCookieStore(options?: BrowserCartCookieStoreOptions): CartCookieStore;
|
|
49
59
|
//# sourceMappingURL=cookies.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/react/cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACpF,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,IAAI,CAG3D;AAGD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/react/cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACpF,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,IAAI,CAG3D;AAGD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,6BAA6B,GACtC,eAAe,CAcjB"}
|
package/dist/react/cookies.js
CHANGED
|
@@ -38,6 +38,7 @@ export function deleteCookie(name, path = '/') {
|
|
|
38
38
|
document.cookie = `${name}=;max-age=0;path=${path}`;
|
|
39
39
|
}
|
|
40
40
|
import { CART_COOKIE_NAME, CART_COOKIE_MAX_AGE } from '../core/cart/cookie-config';
|
|
41
|
+
import { cookieDebugEvent } from '../core/client/remote-debug-transport';
|
|
41
42
|
/**
|
|
42
43
|
* Build a browser-side `CartCookieStore` backed by `document.cookie`.
|
|
43
44
|
*
|
|
@@ -57,12 +58,18 @@ import { CART_COOKIE_NAME, CART_COOKIE_MAX_AGE } from '../core/cart/cookie-confi
|
|
|
57
58
|
* });
|
|
58
59
|
* ```
|
|
59
60
|
*/
|
|
60
|
-
export function createBrowserCartCookieStore() {
|
|
61
|
+
export function createBrowserCartCookieStore(options) {
|
|
62
|
+
const emit = options?.onDebug;
|
|
61
63
|
return {
|
|
62
64
|
get: () => getCookie(CART_COOKIE_NAME),
|
|
63
|
-
set: (cartId,
|
|
64
|
-
|
|
65
|
+
set: (cartId, setOptions) => {
|
|
66
|
+
const maxAge = setOptions?.maxAge ?? CART_COOKIE_MAX_AGE;
|
|
67
|
+
setCookie(CART_COOKIE_NAME, cartId, { maxAge });
|
|
68
|
+
emit?.(cookieDebugEvent(CART_COOKIE_NAME, 'set', cartId, maxAge));
|
|
69
|
+
},
|
|
70
|
+
clear: () => {
|
|
71
|
+
deleteCookie(CART_COOKIE_NAME);
|
|
72
|
+
emit?.(cookieDebugEvent(CART_COOKIE_NAME, 'clear'));
|
|
65
73
|
},
|
|
66
|
-
clear: () => deleteCookie(CART_COOKIE_NAME),
|
|
67
74
|
};
|
|
68
75
|
}
|
|
@@ -87,6 +87,7 @@
|
|
|
87
87
|
*/
|
|
88
88
|
import type { Cart, CartLineInput, CartLineUpdateInput, CartBuyerIdentityInput, CartAddressInput, CartAttributeInput, CartCompleteInput, CartSelectShippingMethodInput, CartSelectPaymentMethodInput, CartClearPaymentSelectionInput, CartApplyGiftCardInput, CartRemoveGiftCardInput, CartUpdateGiftCardRecipientInput, PaymentCreateInput, PaymentSession } from '../../core/cart/types';
|
|
89
89
|
import type { CartMutationOutcome, CartCompleteOutcome } from '../../core/cart/cart-client';
|
|
90
|
+
import type { DebugEvent } from '../../core/client/types';
|
|
90
91
|
import { type CartExpiredEvent } from '../../core/cart/cart-recovery';
|
|
91
92
|
/**
|
|
92
93
|
* Names of mutations exposed by the hook — narrows `status.operation` for
|
|
@@ -165,6 +166,12 @@ export interface UseCartManagerOptions extends CartManagerLifecycleCallbacks {
|
|
|
165
166
|
* customer service "view this cart", multi-cart B2B selectors.
|
|
166
167
|
*/
|
|
167
168
|
initialCartId?: string | null;
|
|
169
|
+
/**
|
|
170
|
+
* Optional debug sink — emits a `phase: 'cookie'` {@link DebugEvent} whenever the `cart-id`
|
|
171
|
+
* cookie is set or cleared (including the `clear()` that `complete()` performs after checkout).
|
|
172
|
+
* Wire it to the same transport the GraphQL client uses for a single shared debug timeline.
|
|
173
|
+
*/
|
|
174
|
+
cookieDebug?: (event: DebugEvent) => void;
|
|
168
175
|
}
|
|
169
176
|
export interface UseCartManagerResult {
|
|
170
177
|
getCart: () => Promise<Cart | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-cart-manager.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/use-cart-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AAMH,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,6BAA6B,EAC7B,4BAA4B,EAC5B,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,EAChC,kBAAkB,EAClB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAKL,KAAK,gBAAgB,EAEtB,MAAM,+BAA+B,CAAC;AAGvC;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,qBAAqB,GACrB,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,YAAY,GACZ,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,uBAAuB,GACvB,eAAe,GACf,gBAAgB,GAChB,yBAAyB,GACzB,UAAU,GACV,eAAe,CAAC;AAEpB;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,oBAAoB,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,6BAA6B;IAC5C,kEAAkE;IAClE,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC9D;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3E;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,6BAA6B;IAC1E;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"use-cart-manager.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/use-cart-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,8 +117,11 @@ function isDedicatedChannelError(err) {
|
|
|
117
117
|
export function useCartManager(options) {
|
|
118
118
|
const { cartClient } = useStorefrontClientContext();
|
|
119
119
|
const [status, setStatus] = useState({ type: 'idle' });
|
|
120
|
-
// Cookie store is stateless — keep one instance per hook mount.
|
|
121
|
-
|
|
120
|
+
// Cookie store is stateless — keep one instance per hook mount. A stable ref-backed wrapper lets
|
|
121
|
+
// the optional `cookieDebug` change without rebuilding the store (and therefore the runner).
|
|
122
|
+
const cookieDebugRef = useRef(options?.cookieDebug);
|
|
123
|
+
cookieDebugRef.current = options?.cookieDebug;
|
|
124
|
+
const cookieStore = useMemo(() => createBrowserCartCookieStore({ onDebug: (event) => cookieDebugRef.current?.(event) }), []);
|
|
122
125
|
// Latest-callback ref: the mutation wrapper reads `lifecycleRef.current` so it
|
|
123
126
|
// always fires the current callbacks while keeping its own deps array empty
|
|
124
127
|
// (a stable `wrapMutation` avoids rebuilding every mutation on each render).
|
|
@@ -29,19 +29,26 @@
|
|
|
29
29
|
*/
|
|
30
30
|
import { type ReactNode } from 'react';
|
|
31
31
|
import { type CartManagerLifecycleCallbacks, type UseCartManagerResult } from '../hooks/use-cart-manager';
|
|
32
|
+
import type { DebugEvent } from '../../core/client/types';
|
|
32
33
|
export interface CartManagerProviderProps extends CartManagerLifecycleCallbacks {
|
|
33
34
|
/**
|
|
34
35
|
* Server-known cart-id seed forwarded to `useCartManager`. Used only when the
|
|
35
36
|
* `cart-id` cookie is empty on mount — the cookie always wins when present.
|
|
36
37
|
*/
|
|
37
38
|
initialCartId?: string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Optional debug sink forwarded to `useCartManager` — emits a `phase: 'cookie'` {@link DebugEvent}
|
|
41
|
+
* on every `cart-id` set/clear (including the `complete()` clear). Wire it to the same transport
|
|
42
|
+
* the GraphQL client uses for one shared debug timeline.
|
|
43
|
+
*/
|
|
44
|
+
cookieDebug?: (event: DebugEvent) => void;
|
|
38
45
|
children: ReactNode;
|
|
39
46
|
}
|
|
40
47
|
/**
|
|
41
48
|
* Creates one `useCartManager` instance and exposes it to descendants via
|
|
42
49
|
* Context. Lifecycle callbacks are forwarded to the underlying hook.
|
|
43
50
|
*/
|
|
44
|
-
export declare function CartManagerProvider({ initialCartId, onMutationStart, onMutationSuccess, onMutationError, children, }: CartManagerProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
export declare function CartManagerProvider({ initialCartId, cookieDebug, onMutationStart, onMutationSuccess, onMutationError, children, }: CartManagerProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
45
52
|
/**
|
|
46
53
|
* Read the shared cart manager provided by the nearest `<CartManagerProvider>`.
|
|
47
54
|
* Throws when called outside a provider.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart-manager-provider.d.ts","sourceRoot":"","sources":["../../../src/react/providers/cart-manager-provider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"cart-manager-provider.d.ts","sourceRoot":"","sources":["../../../src/react/providers/cart-manager-provider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAK1D,MAAM,WAAW,wBAAyB,SAAQ,6BAA6B;IAC7E;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,QAAQ,GACT,EAAE,wBAAwB,2CAU1B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,oBAAoB,CAM5D"}
|
|
@@ -37,9 +37,10 @@ CartManagerContext.displayName = 'CartManagerContext';
|
|
|
37
37
|
* Creates one `useCartManager` instance and exposes it to descendants via
|
|
38
38
|
* Context. Lifecycle callbacks are forwarded to the underlying hook.
|
|
39
39
|
*/
|
|
40
|
-
export function CartManagerProvider({ initialCartId, onMutationStart, onMutationSuccess, onMutationError, children, }) {
|
|
40
|
+
export function CartManagerProvider({ initialCartId, cookieDebug, onMutationStart, onMutationSuccess, onMutationError, children, }) {
|
|
41
41
|
const manager = useCartManager({
|
|
42
42
|
initialCartId,
|
|
43
|
+
cookieDebug,
|
|
43
44
|
onMutationStart,
|
|
44
45
|
onMutationSuccess,
|
|
45
46
|
onMutationError,
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
*/
|
|
32
32
|
import { type StorefrontClientProviderProps } from './storefront-client-provider';
|
|
33
33
|
import { type CurrencyProviderProps } from './currency-provider';
|
|
34
|
+
import type { DebugEvent } from '../../core/client/types';
|
|
34
35
|
export interface StorefrontProviderProps extends StorefrontClientProviderProps {
|
|
35
36
|
shopData: CurrencyProviderProps['shopData'];
|
|
36
37
|
/**
|
|
@@ -91,6 +92,16 @@ export interface StorefrontProviderProps extends StorefrontClientProviderProps {
|
|
|
91
92
|
* scheduler arm on the first render (cold start) without a whoami round-trip.
|
|
92
93
|
*/
|
|
93
94
|
initialExpiresAt?: string | null;
|
|
95
|
+
/**
|
|
96
|
+
* Optional debug sink for cookie events. When provided, the currency and language stores emit a
|
|
97
|
+
* `phase: 'cookie'` {@link DebugEvent} whenever their cookie is written. Wire it to the same
|
|
98
|
+
* transport the GraphQL client uses (one shared sessionId) so cookie writes appear on the same
|
|
99
|
+
* timeline as GraphQL operations. (Cart-id events are wired separately on the cart cookie store.)
|
|
100
|
+
*
|
|
101
|
+
* Must be referentially stable (e.g. from a memoized module singleton) — the stores are created
|
|
102
|
+
* once at provider mount, so a later `cookieDebug` swap is not observed.
|
|
103
|
+
*/
|
|
104
|
+
cookieDebug?: (event: DebugEvent) => void;
|
|
94
105
|
}
|
|
95
|
-
export declare function StorefrontProvider({ children, config, middleware, shopData, initialIsAuthenticated, initialAccessToken, initialExpiresAt, initialLanguage, autoRefresh, authBasePath, }: StorefrontProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
106
|
+
export declare function StorefrontProvider({ children, config, middleware, shopData, initialIsAuthenticated, initialAccessToken, initialExpiresAt, initialLanguage, autoRefresh, authBasePath, cookieDebug, }: StorefrontProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
96
107
|
//# sourceMappingURL=storefront-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storefront-provider.d.ts","sourceRoot":"","sources":["../../../src/react/providers/storefront-provider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,EAA4B,KAAK,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"storefront-provider.d.ts","sourceRoot":"","sources":["../../../src/react/providers/storefront-provider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,EAA4B,KAAK,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAQnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,uBAAwB,SAAQ,6BAA6B;IAC5E,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC5C;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,EAAE,uBAAuB,2CAyCzB"}
|
|
@@ -45,10 +45,11 @@ import { BotProtectionWidget } from '../bot-protection/bot-protection-widget';
|
|
|
45
45
|
import { createSessionExpiredEmitter } from '../../core/auth/session-events';
|
|
46
46
|
import { SessionExpiredContext } from '../hooks/use-session-expired';
|
|
47
47
|
import { useSessionRefresh } from '../hooks/use-session-refresh';
|
|
48
|
-
export function StorefrontProvider({ children, config, middleware, shopData, initialIsAuthenticated, initialAccessToken, initialExpiresAt, initialLanguage, autoRefresh, authBasePath, }) {
|
|
48
|
+
export function StorefrontProvider({ children, config, middleware, shopData, initialIsAuthenticated, initialAccessToken, initialExpiresAt, initialLanguage, autoRefresh, authBasePath, cookieDebug, }) {
|
|
49
49
|
const authStoreRef = useRef(createAuthStore({ initialIsAuthenticated, initialAccessToken, initialExpiresAt }));
|
|
50
|
-
const
|
|
51
|
-
const
|
|
50
|
+
const cookieDebugOptions = cookieDebug ? { onDebug: cookieDebug } : undefined;
|
|
51
|
+
const currencyStoreRef = useRef(createCurrencyStore(cookieDebugOptions));
|
|
52
|
+
const languageStoreRef = useRef(createLanguageStore(initialLanguage, cookieDebugOptions));
|
|
52
53
|
const sessionExpiredRef = useRef(createSessionExpiredEmitter());
|
|
53
54
|
const botProtectionRef = useRef(shopData.botProtection ? createBotProtectionManager(shopData.botProtection) : null);
|
|
54
55
|
return (_jsx(AuthStoreContext.Provider, { value: authStoreRef.current, children: _jsx(CurrencyStoreContext.Provider, { value: currencyStoreRef.current, children: _jsx(LanguageStoreContext.Provider, { value: languageStoreRef.current, children: _jsx(StorefrontClientProvider, { config: config, middleware: middleware, botProtection: botProtectionRef.current, botProtectionOperations: shopData.botProtection?.protectedOperations, sessionExpiredEmitter: sessionExpiredRef.current, authBasePath: authBasePath, children: _jsx(BotProtectionContext.Provider, { value: { manager: botProtectionRef.current }, children: _jsx(CurrencyProvider, { shopData: shopData, children: _jsxs(LanguageProvider, { shopData: shopData, children: [_jsx(BotProtectionWidget, { manager: botProtectionRef.current }), _jsx(SessionRefreshRunner, { autoRefresh: autoRefresh, emitter: sessionExpiredRef.current }), _jsx(SessionExpiredContext.Provider, { value: sessionExpiredRef.current, children: children })] }) }) }) }) }) }) }));
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* through React Context — eliminates module duplication in Turbopack.
|
|
7
7
|
*/
|
|
8
8
|
import type { ShopConfig } from '../types/shop-config';
|
|
9
|
+
import type { DebugEvent } from '../../core/client/types';
|
|
10
|
+
export interface CreateCurrencyStoreOptions {
|
|
11
|
+
/** Optional debug sink — emits a `phase: 'cookie'` event whenever the currency cookie is written. */
|
|
12
|
+
onDebug?: (event: DebugEvent) => void;
|
|
13
|
+
}
|
|
9
14
|
/**
|
|
10
15
|
* @deprecated Use ShopConfig instead. Kept for backward compatibility of type exports.
|
|
11
16
|
*/
|
|
@@ -18,7 +23,7 @@ export interface CurrencyStore {
|
|
|
18
23
|
initialize: (shopData: ShopConfig) => void;
|
|
19
24
|
setCurrency: (currency: string) => void;
|
|
20
25
|
}
|
|
21
|
-
export declare const createCurrencyStore: () => import("zustand").StoreApi<CurrencyStore>;
|
|
26
|
+
export declare const createCurrencyStore: (options?: CreateCurrencyStoreOptions) => import("zustand").StoreApi<CurrencyStore>;
|
|
22
27
|
export declare const selectCurrency: (state: CurrencyStore) => string | null;
|
|
23
28
|
export declare const selectBaseCurrency: (state: CurrencyStore) => string | null;
|
|
24
29
|
export declare const selectSupportedCurrencies: (state: CurrencyStore) => string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currency.store.d.ts","sourceRoot":"","sources":["../../../src/react/stores/currency.store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"currency.store.d.ts","sourceRoot":"","sources":["../../../src/react/stores/currency.store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,WAAW,0BAA0B;IACzC,qGAAqG;IACrG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAE1C,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAGlB,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,mBAAmB,GAAI,UAAU,0BAA0B,8CA2DvE,CAAC;AAMF,eAAO,MAAM,cAAc,GAAI,OAAO,aAAa,kBAAmB,CAAC;AACvE,eAAO,MAAM,kBAAkB,GAAI,OAAO,aAAa,kBAAuB,CAAC;AAC/E,eAAO,MAAM,yBAAyB,GAAI,OAAO,aAAa,aAA8B,CAAC;AAC7F,eAAO,MAAM,cAAc,GAAI,OAAO,aAAa,YAAmB,CAAC"}
|
|
@@ -8,48 +8,56 @@
|
|
|
8
8
|
import { createStore } from 'zustand/vanilla';
|
|
9
9
|
import { CURRENCY_COOKIE_NAME, CURRENCY_COOKIE_MAX_AGE } from '../../core/currency/cookie-config';
|
|
10
10
|
import { getCookie, setCookie } from '../cookies';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
currency
|
|
15
|
-
isLoaded: false,
|
|
16
|
-
initialize: (shopData) => {
|
|
17
|
-
// 1. Try saved currency from cookie (SSR-safe)
|
|
18
|
-
const saved = getCookie(CURRENCY_COOKIE_NAME);
|
|
19
|
-
// 2. Try to detect from browser locale
|
|
20
|
-
let detected;
|
|
21
|
-
if (shopData.localeToCurrencyMap && typeof navigator !== 'undefined') {
|
|
22
|
-
const browserLocale = navigator.language;
|
|
23
|
-
const match = shopData.localeToCurrencyMap.find((m) => m.locale === browserLocale);
|
|
24
|
-
detected = match?.currency;
|
|
25
|
-
}
|
|
26
|
-
// 3. Determine final currency (priority: saved > detected > base)
|
|
27
|
-
const finalCurrency = saved && shopData.supportedCurrencies.includes(saved)
|
|
28
|
-
? saved
|
|
29
|
-
: detected && shopData.supportedCurrencies.includes(detected)
|
|
30
|
-
? detected
|
|
31
|
-
: shopData.currencyCode;
|
|
32
|
-
set({
|
|
33
|
-
baseCurrency: shopData.currencyCode,
|
|
34
|
-
supportedCurrencies: shopData.supportedCurrencies,
|
|
35
|
-
currency: finalCurrency,
|
|
36
|
-
isLoaded: true,
|
|
37
|
-
});
|
|
38
|
-
// Ensure cookie is set if we determined a currency
|
|
39
|
-
if (finalCurrency && !saved) {
|
|
40
|
-
setCookie(CURRENCY_COOKIE_NAME, finalCurrency, { maxAge: CURRENCY_COOKIE_MAX_AGE });
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
setCurrency: (currency) => {
|
|
44
|
-
const { supportedCurrencies } = get();
|
|
45
|
-
if (!supportedCurrencies.includes(currency)) {
|
|
46
|
-
console.warn(`[CurrencyStore] Currency ${currency} not supported`);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
set({ currency });
|
|
11
|
+
import { cookieDebugEvent } from '../../core/client/remote-debug-transport';
|
|
12
|
+
export const createCurrencyStore = (options) => {
|
|
13
|
+
const emit = options?.onDebug;
|
|
14
|
+
const persist = (currency) => {
|
|
50
15
|
setCookie(CURRENCY_COOKIE_NAME, currency, { maxAge: CURRENCY_COOKIE_MAX_AGE });
|
|
51
|
-
|
|
52
|
-
}
|
|
16
|
+
emit?.(cookieDebugEvent(CURRENCY_COOKIE_NAME, 'set', currency, CURRENCY_COOKIE_MAX_AGE));
|
|
17
|
+
};
|
|
18
|
+
return createStore()((set, get) => ({
|
|
19
|
+
baseCurrency: null,
|
|
20
|
+
supportedCurrencies: [],
|
|
21
|
+
currency: null,
|
|
22
|
+
isLoaded: false,
|
|
23
|
+
initialize: (shopData) => {
|
|
24
|
+
// 1. Try saved currency from cookie (SSR-safe)
|
|
25
|
+
const saved = getCookie(CURRENCY_COOKIE_NAME);
|
|
26
|
+
// 2. Try to detect from browser locale
|
|
27
|
+
let detected;
|
|
28
|
+
if (shopData.localeToCurrencyMap && typeof navigator !== 'undefined') {
|
|
29
|
+
const browserLocale = navigator.language;
|
|
30
|
+
const match = shopData.localeToCurrencyMap.find((m) => m.locale === browserLocale);
|
|
31
|
+
detected = match?.currency;
|
|
32
|
+
}
|
|
33
|
+
// 3. Determine final currency (priority: saved > detected > base)
|
|
34
|
+
const finalCurrency = saved && shopData.supportedCurrencies.includes(saved)
|
|
35
|
+
? saved
|
|
36
|
+
: detected && shopData.supportedCurrencies.includes(detected)
|
|
37
|
+
? detected
|
|
38
|
+
: shopData.currencyCode;
|
|
39
|
+
set({
|
|
40
|
+
baseCurrency: shopData.currencyCode,
|
|
41
|
+
supportedCurrencies: shopData.supportedCurrencies,
|
|
42
|
+
currency: finalCurrency,
|
|
43
|
+
isLoaded: true,
|
|
44
|
+
});
|
|
45
|
+
// Ensure cookie is set if we determined a currency
|
|
46
|
+
if (finalCurrency && !saved) {
|
|
47
|
+
persist(finalCurrency);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
setCurrency: (currency) => {
|
|
51
|
+
const { supportedCurrencies } = get();
|
|
52
|
+
if (!supportedCurrencies.includes(currency)) {
|
|
53
|
+
console.warn(`[CurrencyStore] Currency ${currency} not supported`);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
set({ currency });
|
|
57
|
+
persist(currency);
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
60
|
+
};
|
|
53
61
|
// ---------------------------------------------------------------------------
|
|
54
62
|
// Selectors (for use with useCurrencyStore(selector))
|
|
55
63
|
// ---------------------------------------------------------------------------
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
* - SDK language store (X-Lang header, framework-agnostic)
|
|
18
18
|
*/
|
|
19
19
|
import type { ShopConfig } from '../types/shop-config';
|
|
20
|
+
import type { DebugEvent } from '../../core/client/types';
|
|
21
|
+
export interface CreateLanguageStoreOptions {
|
|
22
|
+
/** Optional debug sink — emits a `phase: 'cookie'` event whenever the language cookie is written. */
|
|
23
|
+
onDebug?: (event: DebugEvent) => void;
|
|
24
|
+
}
|
|
20
25
|
export interface LanguageStore {
|
|
21
26
|
defaultLanguage: string | null;
|
|
22
27
|
supportedLanguages: string[];
|
|
@@ -25,7 +30,7 @@ export interface LanguageStore {
|
|
|
25
30
|
initialize: (shopData: ShopConfig) => void;
|
|
26
31
|
setLanguage: (language: string) => void;
|
|
27
32
|
}
|
|
28
|
-
export declare const createLanguageStore: (initialLanguage?: string | null) => import("zustand").StoreApi<LanguageStore>;
|
|
33
|
+
export declare const createLanguageStore: (initialLanguage?: string | null, options?: CreateLanguageStoreOptions) => import("zustand").StoreApi<LanguageStore>;
|
|
29
34
|
export declare const selectLanguage: (state: LanguageStore) => string | null;
|
|
30
35
|
export declare const selectDefaultLanguage: (state: LanguageStore) => string | null;
|
|
31
36
|
export declare const selectSupportedLanguages: (state: LanguageStore) => string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.store.d.ts","sourceRoot":"","sources":["../../../src/react/stores/language.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"language.store.d.ts","sourceRoot":"","sources":["../../../src/react/stores/language.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,WAAW,0BAA0B;IACzC,qGAAqG;IACrG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAE5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAGlB,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,mBAAmB,GAC9B,kBAAkB,MAAM,GAAG,IAAI,EAC/B,UAAU,0BAA0B,8CAmDrC,CAAC;AAMF,eAAO,MAAM,cAAc,GAAI,OAAO,aAAa,kBAAmB,CAAC;AACvE,eAAO,MAAM,qBAAqB,GAAI,OAAO,aAAa,kBAA0B,CAAC;AACrF,eAAO,MAAM,wBAAwB,GAAI,OAAO,aAAa,aAA6B,CAAC;AAC3F,eAAO,MAAM,sBAAsB,GAAI,OAAO,aAAa,YAAmB,CAAC"}
|
|
@@ -19,45 +19,53 @@
|
|
|
19
19
|
import { createStore } from 'zustand/vanilla';
|
|
20
20
|
import { LANGUAGE_COOKIE_NAME, LANGUAGE_COOKIE_MAX_AGE } from '../../core/language/cookie-config';
|
|
21
21
|
import { getCookie, setCookie } from '../cookies';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
language
|
|
26
|
-
isLoaded: false,
|
|
27
|
-
initialize: (shopData) => {
|
|
28
|
-
const supported = shopData.supportedLanguages ?? [];
|
|
29
|
-
const current = get().language;
|
|
30
|
-
const saved = getCookie(LANGUAGE_COOKIE_NAME);
|
|
31
|
-
// Priority: current (from initialLanguage/URL) > cookie (validated) > default
|
|
32
|
-
const finalLanguage = current && (supported.length === 0 || supported.includes(current))
|
|
33
|
-
? current
|
|
34
|
-
: saved && (supported.length === 0 || supported.includes(saved))
|
|
35
|
-
? saved
|
|
36
|
-
: shopData.defaultLanguage ?? null;
|
|
37
|
-
set({
|
|
38
|
-
defaultLanguage: shopData.defaultLanguage ?? null,
|
|
39
|
-
supportedLanguages: supported,
|
|
40
|
-
language: finalLanguage,
|
|
41
|
-
isLoaded: true,
|
|
42
|
-
});
|
|
43
|
-
// Persist cookie if determined from fallback (not already saved)
|
|
44
|
-
if (finalLanguage && finalLanguage !== saved) {
|
|
45
|
-
setCookie(LANGUAGE_COOKIE_NAME, finalLanguage, { maxAge: LANGUAGE_COOKIE_MAX_AGE });
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
setLanguage: (language) => {
|
|
49
|
-
const { supportedLanguages } = get();
|
|
50
|
-
// Validate vs supported (bypass if empty — LanguageSyncProvider may call before initialize)
|
|
51
|
-
if (supportedLanguages.length > 0 && !supportedLanguages.includes(language)) {
|
|
52
|
-
console.warn(`[LanguageStore] Language ${language} not supported`);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
if (get().language === language)
|
|
56
|
-
return;
|
|
22
|
+
import { cookieDebugEvent } from '../../core/client/remote-debug-transport';
|
|
23
|
+
export const createLanguageStore = (initialLanguage, options) => {
|
|
24
|
+
const emit = options?.onDebug;
|
|
25
|
+
const persist = (language) => {
|
|
57
26
|
setCookie(LANGUAGE_COOKIE_NAME, language, { maxAge: LANGUAGE_COOKIE_MAX_AGE });
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
27
|
+
emit?.(cookieDebugEvent(LANGUAGE_COOKIE_NAME, 'set', language, LANGUAGE_COOKIE_MAX_AGE));
|
|
28
|
+
};
|
|
29
|
+
return createStore()((set, get) => ({
|
|
30
|
+
defaultLanguage: null,
|
|
31
|
+
supportedLanguages: [],
|
|
32
|
+
language: initialLanguage ?? null,
|
|
33
|
+
isLoaded: false,
|
|
34
|
+
initialize: (shopData) => {
|
|
35
|
+
const supported = shopData.supportedLanguages ?? [];
|
|
36
|
+
const current = get().language;
|
|
37
|
+
const saved = getCookie(LANGUAGE_COOKIE_NAME);
|
|
38
|
+
// Priority: current (from initialLanguage/URL) > cookie (validated) > default
|
|
39
|
+
const finalLanguage = current && (supported.length === 0 || supported.includes(current))
|
|
40
|
+
? current
|
|
41
|
+
: saved && (supported.length === 0 || supported.includes(saved))
|
|
42
|
+
? saved
|
|
43
|
+
: shopData.defaultLanguage ?? null;
|
|
44
|
+
set({
|
|
45
|
+
defaultLanguage: shopData.defaultLanguage ?? null,
|
|
46
|
+
supportedLanguages: supported,
|
|
47
|
+
language: finalLanguage,
|
|
48
|
+
isLoaded: true,
|
|
49
|
+
});
|
|
50
|
+
// Persist cookie if determined from fallback (not already saved)
|
|
51
|
+
if (finalLanguage && finalLanguage !== saved) {
|
|
52
|
+
persist(finalLanguage);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
setLanguage: (language) => {
|
|
56
|
+
const { supportedLanguages } = get();
|
|
57
|
+
// Validate vs supported (bypass if empty — LanguageSyncProvider may call before initialize)
|
|
58
|
+
if (supportedLanguages.length > 0 && !supportedLanguages.includes(language)) {
|
|
59
|
+
console.warn(`[LanguageStore] Language ${language} not supported`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (get().language === language)
|
|
63
|
+
return;
|
|
64
|
+
persist(language);
|
|
65
|
+
set({ language });
|
|
66
|
+
},
|
|
67
|
+
}));
|
|
68
|
+
};
|
|
61
69
|
// ---------------------------------------------------------------------------
|
|
62
70
|
// Selectors (for use with useLanguageStore(selector))
|
|
63
71
|
// ---------------------------------------------------------------------------
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@doswiftly/storefront-sdk",
|
|
3
|
-
"version": "19.
|
|
3
|
+
"version": "19.2.0",
|
|
4
4
|
"description": "Storefront runtime SDK for DoSwiftly Commerce — layered transport, middleware pipeline, React providers, Zustand stores, cache strategies. 0 runtime dependencies in core.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|