@viu/emporix-sdk-react 2.13.0 → 2.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/{chunk-KOVOQJ5F.js → chunk-SXZCM2LE.js} +4 -2
- package/dist/chunk-SXZCM2LE.js.map +1 -0
- package/dist/hooks.cjs +2 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-KOVOQJ5F.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @viu/emporix-sdk-react
|
|
2
2
|
|
|
3
|
+
## 2.13.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#124](https://github.com/viuteam/emporix-sdk/pull/124) [`3b4c796`](https://github.com/viuteam/emporix-sdk/commit/3b4c79640f2030edf7f2609a30d1546cc5f3cd0f) Thanks [@amnael1](https://github.com/amnael1)! - Clear the anonymous (guest) session from storage on customer login. Once a customer token is set the anonymous session is dormant — `useReadAuth` always prefers the customer token — but it lingered in storage (`emporix.anonymousSession`) for the whole authenticated session. `useCustomerSession.login` (and the shared `applySession` path used by `socialLogin` / `exchangeToken`) now call `storage.setAnonymousSession(null)`, so only the customer session remains after login.
|
|
8
|
+
|
|
3
9
|
## 2.13.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -88,6 +88,7 @@ function useCustomerSession() {
|
|
|
88
88
|
const result = await client.customers.login(input);
|
|
89
89
|
storage.setCustomerToken(result.customerToken);
|
|
90
90
|
storage.setRefreshToken(result.refreshToken || null);
|
|
91
|
+
storage.setAnonymousSession(null);
|
|
91
92
|
setSession({
|
|
92
93
|
token: result.customerToken,
|
|
93
94
|
refreshToken: result.refreshToken || null,
|
|
@@ -120,6 +121,7 @@ function useCustomerSession() {
|
|
|
120
121
|
async (incoming) => {
|
|
121
122
|
storage.setCustomerToken(incoming.customerToken);
|
|
122
123
|
storage.setRefreshToken(incoming.refreshToken || null);
|
|
124
|
+
storage.setAnonymousSession(null);
|
|
123
125
|
setSession({
|
|
124
126
|
token: incoming.customerToken,
|
|
125
127
|
refreshToken: incoming.refreshToken || null,
|
|
@@ -1563,5 +1565,5 @@ function useUpdateApproval() {
|
|
|
1563
1565
|
}
|
|
1564
1566
|
|
|
1565
1567
|
export { useActiveCart, useActiveSite, useAddGroupMember, useAddToShoppingList, useAddressMutations, useApproval, useApprovals, useAssignContact, useAvailabilities, useAvailability, useCancelOrder, useCart, useCartMutations, useCategories, useCategoriesInfinite, useCategory, useCategoryTree, useChangePassword, useCheckout, useCloudFunction, useCompany, useCompanyContacts, useCompanyGroups, useCompanyLocations, useCompanySwitcher, useCreateApproval, useCreateCart, useCreateCompany, useCreateLocation, useCreateReturn, useCreateShoppingList, useCustomerAddresses, useCustomerSession, useDefaultSite, useDeleteCompany, useDeleteLocation, useDeleteShoppingList, useInvokeCloudFunction, useMatchPrices, useMatchPricesChunked, useMyCompanies, useMyOrders, useMyOrdersInfinite, useMyReturns, useMyRewardPoints, useMyRewardPointsSummary, useMySegmentCategories, useMySegmentCategoriesInfinite, useMySegmentCategoryTree, useMySegmentItems, useMySegmentProducts, useMySegmentProductsInfinite, useMySegments, useOrder, useOrderTransition, usePasswordReset, usePaymentModes, useProduct, useProductByCode, useProductMedia, useProductNameSearch, useProductSearch, useProducts, useProductsByCodes, useProductsInCategory, useProductsInCategoryInfinite, useProductsInfinite, useRedeemCoupon, useRedeemOptions, useRedeemRewardPoints, useRemoveFromShoppingList, useRemoveGroupMember, useReorder, useReturn, useSalesOrder, useSetShoppingListItemQuantity, useShoppingLists, useSiteContext, useSites, useSubcategories, useUnassignContact, useUpdateApproval, useUpdateCompany, useUpdateContactAssignment, useUpdateCustomer, useUpdateLocation, useUpdateSalesOrder, useValidateCoupon, useVariantChildren };
|
|
1566
|
-
//# sourceMappingURL=chunk-
|
|
1567
|
-
//# sourceMappingURL=chunk-
|
|
1568
|
+
//# sourceMappingURL=chunk-SXZCM2LE.js.map
|
|
1569
|
+
//# sourceMappingURL=chunk-SXZCM2LE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/internal/bootstrap-cart.ts","../src/hooks/internal/customer-session-store.ts","../src/hooks/use-customer-session.ts","../src/hooks/internal/use-read-auth.ts","../src/hooks/internal/use-read-site.ts","../src/hooks/internal/query-keys.ts","../src/hooks/internal/use-emporix-infinite.ts","../src/hooks/use-products.ts","../src/hooks/use-shopping-lists.ts","../src/hooks/use-variant-children.ts","../src/hooks/use-categories.ts","../src/hooks/use-cart.ts","../src/hooks/use-checkout.ts","../src/hooks/use-match-prices.ts","../src/hooks/use-match-prices-chunked.ts","../src/hooks/use-product-media.ts","../src/hooks/use-my-segments.ts","../src/hooks/use-customer-profile.ts","../src/hooks/use-customer-addresses.ts","../src/hooks/use-password-reset.ts","../src/hooks/use-site-context.ts","../src/hooks/use-sites.ts","../src/hooks/use-my-companies.ts","../src/hooks/use-company.ts","../src/hooks/use-company-contacts.ts","../src/hooks/use-company-locations.ts","../src/hooks/use-company-groups.ts","../src/hooks/use-company-mutations.ts","../src/hooks/use-company-switcher.ts","../src/hooks/use-cloud-functions.ts","../src/hooks/use-my-orders.ts","../src/hooks/use-my-orders-infinite.ts","../src/hooks/use-order.ts","../src/hooks/use-cancel-order.ts","../src/hooks/use-order-transition.ts","../src/hooks/use-reorder.ts","../src/hooks/use-sales-order.ts","../src/hooks/use-update-sales-order.ts","../src/hooks/use-availability.ts","../src/hooks/use-availabilities.ts","../src/hooks/use-coupons.ts","../src/hooks/use-reward-points.ts","../src/hooks/use-returns.ts","../src/hooks/use-approvals.ts"],"names":["auth","useContext","useQuery","useQueryClient","useMutation","useEffect","PRICES_STALE_TIME","useCallback","AVAILABILITY_STALE_TIME","INVALIDATE_KEY","STALE"],"mappings":"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","file":"chunk-SXZCM2LE.js","sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nimport type { AuthContext, Cart, EmporixClient } from \"@viu/emporix-sdk\";\n\n/**\n * Shared cart-bootstrap helper. Wraps `client.carts.getCurrent({create:true})`\n * in a `qc.fetchQuery` so concurrent callers (useActiveCart mount races, login\n * cart-onboarding) share one cache entry and trigger a single server call.\n *\n * Cache key omits `cartId` deliberately — bootstrap is the operation that\n * *creates* the cart-id. The fetched Cart's `id` is then written into the\n * storage by the caller; subsequent `useCart(id)` reads use their own\n * per-id cache key.\n *\n * `staleTime: Infinity` is safe because:\n * - useActiveCart's effect gates on `storage.cartId !== null` — won't run\n * bootstrap when storage already has one.\n * - Logout / discard clears `storage.cartId` AND\n * `qc.removeQueries([\"emporix\"])`, dropping the cache entry.\n * - Default `gcTime: 5min` evicts naturally on idle.\n */\nexport async function bootstrapCart(opts: {\n qc: QueryClient;\n client: EmporixClient;\n ctx: AuthContext;\n siteCode: string;\n type?: string;\n legalEntityId?: string;\n}): Promise<Cart | null> {\n return opts.qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"cart-bootstrap\",\n {\n tenant: opts.client.tenant,\n // ctx.kind is the discriminator of AuthContext — same string as the\n // legacy `authKind` param, derived directly so callers can't drift.\n authKind: opts.ctx.kind,\n siteCode: opts.siteCode,\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n ...(opts.legalEntityId !== undefined ? { legalEntityId: opts.legalEntityId } : {}),\n },\n ],\n queryFn: () =>\n opts.client.carts.getCurrent(opts.ctx, {\n siteCode: opts.siteCode,\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n ...(opts.legalEntityId !== undefined ? { legalEntityId: opts.legalEntityId } : {}),\n create: true,\n }),\n staleTime: Infinity,\n });\n}\n","import type { EmporixStorage } from \"../../storage\";\n\n/**\n * The three session tokens the customer session tracks. `token` is mirrored\n * from persistent storage; `refreshToken` and `saasToken` are in-memory only\n * (deliberately never persisted).\n */\nexport interface CustomerSessionState {\n token: string | null;\n refreshToken: string | null;\n saasToken: string | null;\n}\n\nexport interface CustomerSessionStore {\n getSnapshot: () => CustomerSessionState;\n setState: (\n next: CustomerSessionState | ((prev: CustomerSessionState) => CustomerSessionState),\n ) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\n// One store per storage instance. The storage object is the stable per-app\n// identity (a WeakMap lets it be GC'd with the app; each test gets a fresh\n// storage → a fresh isolated store).\nconst stores = new WeakMap<EmporixStorage, CustomerSessionStore>();\n\n/**\n * Shared in-memory store for the customer session, keyed by the storage\n * instance. Every `useCustomerSession()` consumer reads/writes the same store,\n * so a login in one component (e.g. the auth form) is visible to another\n * (e.g. the checkout page) — without this, the in-memory `saasToken` lived in\n * a single component's `useState` and customer checkout would 401 elsewhere.\n */\nexport function getCustomerSessionStore(storage: EmporixStorage): CustomerSessionStore {\n const existing = stores.get(storage);\n if (existing) return existing;\n\n let state: CustomerSessionState = {\n token: storage.getCustomerToken(),\n refreshToken: null,\n saasToken: null,\n };\n const listeners = new Set<() => void>();\n const store: CustomerSessionStore = {\n getSnapshot: () => state,\n setState: (next) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: CustomerSessionState) => CustomerSessionState)(state)\n : next;\n if (resolved === state) return;\n state = resolved;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n stores.set(storage, store);\n return store;\n}\n","import { useCallback, useContext, useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport { useQuery, useQueryClient, type QueryClient } from \"@tanstack/react-query\";\nimport { auth, type Customer, type EmporixClient } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"../storage\";\nimport { EmporixSiteContext, useEmporix, type SiteContextValue } from \"../provider\";\nimport { bootstrapCart } from \"./internal/bootstrap-cart\";\nimport {\n getCustomerSessionStore,\n type CustomerSessionState,\n} from \"./internal/customer-session-store\";\n\n/**\n * Internal: the three session tokens the hook tracks. Bundled so login/\n * applySession/logout/refresh all flip the session atomically — partial\n * updates use the setter-callback form (e.g. external storage notifications\n * that only change `token`). State lives in a per-storage shared store so\n * every consumer (auth form, checkout, header) observes the same session.\n */\ntype SessionState = CustomerSessionState;\n\nconst EMPTY_SESSION: SessionState = {\n token: null,\n refreshToken: null,\n saasToken: null,\n};\n\n/** Customer authentication state and actions. */\nexport interface CustomerSessionApi {\n customerToken: string | null;\n customer: Customer | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n /** Current refresh token (in-session; set by `login`). */\n refreshToken: string | null;\n /**\n * Current SaaS token (in-session; set by `login`/`exchangeToken`). Pass it to\n * `useCheckout().placeOrder({ ..., saasToken })` for customer checkout and to\n * saas-token-gated order reads.\n */\n saasToken: string | null;\n login: (input: { email: string; password: string }) => Promise<void>;\n signup: (input: { email: string; password: string }) => Promise<void>;\n /** Authorization-Code SSO: exchanges an IdP `code` for a customer session. */\n socialLogin: (input: {\n code: string;\n redirectUri: string;\n codeVerifier?: string;\n sessionId?: string;\n }) => Promise<void>;\n /** RFC 8693 token exchange: exchanges an external IdP JWT for a session. */\n exchangeToken: (input: { subjectToken: string; config?: string }) => Promise<void>;\n /** Server-side logout (best-effort), then clears the local session. */\n logout: () => Promise<void>;\n /** Refetches the `me` profile query. */\n refresh: () => Promise<void>;\n /**\n * Exchanges the stored refresh token for a fresh customer token (same\n * sessionId) and updates the stored token. No-op if there is no refresh\n * token. Throws if the refresh itself fails.\n */\n refreshSession: () => Promise<void>;\n}\n\n/** Manages the customer session: login/signup/logout and the `me` query. */\nexport function useCustomerSession(): CustomerSessionApi {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n // Optional — present when wrapped in an EmporixProvider (always true post-MS-2).\n const siteCtx = useContext(EmporixSiteContext);\n // Single session-state object held in a per-storage shared store so all\n // consumers see the same in-memory `refreshToken`/`saasToken`. `token` is\n // mirrored from storage; `refreshToken`/`saasToken` are in-session only.\n const store = useMemo(() => getCustomerSessionStore(storage), [storage]);\n const session = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const setSession = store.setState;\n\n useEffect(() => {\n // External token change (e.g. another tab) updates only the `token` slot.\n return storage.subscribe?.((t) => setSession((s) => ({ ...s, token: t })));\n }, [storage, setSession]);\n\n const meQuery = useQuery({\n queryKey: [\"emporix\", \"customer\", \"me\", { tenant: client.tenant, hasToken: session.token !== null }],\n enabled: session.token !== null,\n queryFn: () => client.customers.me(auth.customer(session.token as string)),\n // 30s — matches Balanced default. Lets honourPreferredSite's fetchQuery\n // (with staleTime: Infinity) reuse the cache instead of refetching.\n staleTime: 30_000,\n });\n\n const login = useCallback(\n async (input: { email: string; password: string }) => {\n const result = await client.customers.login(input);\n storage.setCustomerToken(result.customerToken);\n storage.setRefreshToken(result.refreshToken || null);\n // The guest (anonymous) session is dead weight once a customer token is\n // set — the auth layer always prefers the customer token, so the stored\n // anonymous session would just linger unused. Drop it on login.\n storage.setAnonymousSession(null);\n setSession({\n token: result.customerToken,\n refreshToken: result.refreshToken || null,\n saasToken: result.saasToken || null,\n });\n await onboardCustomerCart({\n qc,\n client,\n storage,\n customerToken: result.customerToken,\n });\n // Honour preferred site BEFORE invalidate — writes meQuery cache.\n await honourPreferredSite({\n qc,\n client,\n customerToken: result.customerToken,\n siteCtx,\n });\n // refetchType: \"none\" — mark stale but DO NOT trigger an immediate\n // refetch. The fresh /customer/me from honourPreferredSite already\n // updated the cache; remounts past 30s staleness will refetch.\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"customer\"], refetchType: \"none\" });\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"cart\"], refetchType: \"none\" });\n },\n [client, storage, qc, siteCtx, setSession],\n );\n\n const signup = useCallback(\n async (input: { email: string; password: string }) => {\n await client.customers.signup(input);\n },\n [client],\n );\n\n // Shared \"store a CustomerSession into hook state\" used by SSO flows.\n const applySession = useCallback(\n async (incoming: { customerToken: string; refreshToken: string; saasToken: string }) => {\n storage.setCustomerToken(incoming.customerToken);\n storage.setRefreshToken(incoming.refreshToken || null);\n // Drop the now-dormant guest session (see login()).\n storage.setAnonymousSession(null);\n setSession({\n token: incoming.customerToken,\n refreshToken: incoming.refreshToken || null,\n saasToken: incoming.saasToken || null,\n });\n await onboardCustomerCart({\n qc,\n client,\n storage,\n customerToken: incoming.customerToken,\n });\n await honourPreferredSite({\n qc,\n client,\n customerToken: incoming.customerToken,\n siteCtx,\n });\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"customer\"], refetchType: \"none\" });\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"cart\"], refetchType: \"none\" });\n },\n [client, storage, qc, siteCtx, setSession],\n );\n\n const socialLogin = useCallback(\n async (input: {\n code: string;\n redirectUri: string;\n codeVerifier?: string;\n sessionId?: string;\n }) => {\n await applySession(await client.customers.socialLogin(input));\n },\n [client, applySession],\n );\n\n const exchangeToken = useCallback(\n async (input: { subjectToken: string; config?: string }) => {\n await applySession(await client.customers.exchangeToken(input));\n },\n [client, applySession],\n );\n\n const logout = useCallback(async () => {\n if (session.token) {\n // Best-effort server invalidation; the local session is cleared\n // regardless (the token may already be expired/invalid).\n try {\n await client.customers.logout(auth.customer(session.token));\n } catch {\n /* ignore — proceed to clear locally */\n }\n }\n storage.setCustomerToken(null);\n storage.setRefreshToken(null);\n storage.setActiveLegalEntityId(null);\n // Drop the cart reference: the cart belonged to the customer and is not\n // accessible anonymously, so keeping it would make the cart query 403\n // right after logout. A fresh anonymous cart bootstraps on demand.\n storage.setCartId(null);\n setSession(EMPTY_SESSION);\n qc.removeQueries({ queryKey: [\"emporix\", \"customer\"] });\n qc.removeQueries({ queryKey: [\"emporix\", \"cart\"] });\n }, [client, session.token, storage, qc, setSession]);\n\n const refresh = useCallback(async () => {\n await meQuery.refetch();\n }, [meQuery]);\n\n const refreshSession = useCallback(async () => {\n if (!session.refreshToken) return;\n const refreshed = await client.customers.refresh({\n refreshToken: session.refreshToken,\n ...(session.saasToken ? { saasToken: session.saasToken } : {}),\n });\n storage.setCustomerToken(refreshed.customerToken);\n if (refreshed.refreshToken) storage.setRefreshToken(refreshed.refreshToken);\n setSession((s) => ({\n token: refreshed.customerToken,\n refreshToken: refreshed.refreshToken || s.refreshToken,\n saasToken: refreshed.saasToken || s.saasToken,\n }));\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"customer\"] });\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"cart\"] });\n }, [client, storage, qc, session.refreshToken, session.saasToken, setSession]);\n\n return {\n customerToken: session.token,\n refreshToken: session.refreshToken,\n saasToken: session.saasToken,\n customer: meQuery.data ?? null,\n isAuthenticated: session.token !== null,\n isLoading: meQuery.isLoading && session.token !== null,\n login,\n signup,\n socialLogin,\n exchangeToken,\n logout,\n refresh,\n refreshSession,\n };\n}\n\n/**\n * Best-effort customer cart onboarding right after a fresh customer token is\n * stored. Loads (or creates) the open customer cart for the configured\n * `siteCode`, merges any guest `cartId` from storage into it, and writes the\n * customer-cart-id back to `storage.setCartId(...)`. Never throws — failures\n * are swallowed so login does not block on cart trouble.\n */\n/**\n * After login, switch the active site to the customer's `preferredSite` if\n * one is set and differs from the current siteCode. Uses `qc.fetchQuery` with\n * the same key as `meQuery` so the post-login `/customer/me` call is shared\n * (no double-fetch). Best-effort: failure never blocks login.\n */\nasync function honourPreferredSite(opts: {\n qc: QueryClient;\n client: EmporixClient;\n customerToken: string;\n siteCtx: SiteContextValue | null;\n}): Promise<void> {\n const { qc, client, customerToken, siteCtx } = opts;\n if (!siteCtx) return;\n try {\n const me = (await qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"customer\",\n \"me\",\n { tenant: client.tenant, hasToken: true },\n ],\n queryFn: () => client.customers.me(auth.customer(customerToken)),\n // Reuse whatever meQuery already wrote (login flow runs meQuery in\n // parallel). Without this, fetchQuery refetches if meQuery's data is\n // already stale (default staleTime: 0 on meQuery).\n staleTime: Infinity,\n })) as { preferredSite?: string };\n const preferred = me.preferredSite;\n if (preferred && siteCtx.siteCode !== preferred) {\n await siteCtx.setSite(preferred);\n }\n } catch {\n // Best-effort — never block login on a preference lookup.\n }\n}\n\nasync function onboardCustomerCart(opts: {\n qc: QueryClient;\n client: EmporixClient;\n storage: EmporixStorage;\n customerToken: string;\n}): Promise<void> {\n const { qc, client, storage, customerToken } = opts;\n const siteCode = client.config?.credentials?.storefront?.context?.siteCode;\n if (!siteCode) return; // No site context configured → skip.\n const ctx = auth.customer(customerToken);\n try {\n const customerCart = await bootstrapCart({\n qc,\n client,\n ctx,\n siteCode,\n });\n // Cart uses `id`; only `CartCreated` exposes `cartId`. See generated types.\n const customerCartId = customerCart?.id;\n if (!customerCartId) return;\n const anonCartId = storage.getCartId();\n if (anonCartId && anonCartId !== customerCartId) {\n await client.carts.merge(customerCartId, [anonCartId], ctx);\n }\n storage.setCartId(customerCartId);\n } catch {\n // Cart onboarding is best-effort; never fail login on cart trouble.\n }\n}\n","import { auth, type AuthContext } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../../provider\";\n\n/** Options accepted by every read hook to override the per-call auth context. */\nexport interface QueryOpts {\n auth?: AuthContext;\n}\n\n/**\n * Picks the auth context for a read hook. If `override` is given, returns it.\n * Otherwise: customer if a token is in storage, anonymous as fallback.\n *\n * Callers compose `ctx.kind` into their query keys to separate cache entries\n * across auth boundaries — `ctx.kind` is the discriminator of AuthContext,\n * one of `\"service\" | \"anonymous\" | \"customer\" | \"raw\"`.\n */\nexport function useReadAuth(override?: AuthContext): { ctx: AuthContext } {\n const { storage } = useEmporix();\n if (override) return { ctx: override };\n const token = storage.getCustomerToken();\n return token ? { ctx: auth.customer(token) } : { ctx: auth.anonymous() };\n}\n\n/**\n * Returns a customer `AuthContext` from the stored token. Throws if no token\n * exists in storage — use for hooks that are intentionally customer-only\n * (profile updates, password change, address management, payment modes).\n */\nexport function useCustomerOnlyCtx(): AuthContext {\n const { storage } = useEmporix();\n const token = storage.getCustomerToken();\n if (!token) {\n throw new Error(\"Requires a logged-in customer (no token in storage)\");\n }\n return auth.customer(token);\n}\n","import { useContext } from \"react\";\nimport { EmporixSiteContext } from \"../../provider\";\n\n/**\n * Internal: returns the active `siteCode` and `language` from the\n * EmporixProvider's site context. Used by site-aware read hooks to compose\n * their query keys. Both are `null` when no site context is mounted — hooks\n * use `null` in the query key so cache entries are deterministic.\n */\nexport function useReadSite(): { siteCode: string | null; language: string | null } {\n const ctx = useContext(EmporixSiteContext);\n return { siteCode: ctx?.siteCode ?? null, language: ctx?.language ?? null };\n}\n","/**\n * Internal: build a stable, cache-keyed query identifier for SDK hooks.\n *\n * Shape: `[\"emporix\", resource, ...args, { tenant, authKind, siteCode? }]`\n *\n * The trailing meta object groups discriminators that differentiate cache\n * entries across tenants, auth-kinds, and (where applicable) active sites.\n * `siteCode` is included only when explicitly passed — non-site-aware\n * hooks (e.g. `useSites` itself) pass `undefined` and the field is dropped.\n *\n * Centralizing this shape ensures consistency across ~20 read hooks and\n * makes future field additions (e.g. `language`) a single-file change.\n */\nexport function emporixKey<TArgs extends readonly unknown[]>(\n resource: string,\n args: TArgs,\n context: {\n tenant: string;\n authKind: string;\n siteCode?: string | null;\n language?: string | null;\n },\n): readonly [\"emporix\", string, ...TArgs, Record<string, unknown>] {\n const meta: Record<string, unknown> = {\n tenant: context.tenant,\n authKind: context.authKind,\n };\n if (context.siteCode !== undefined) {\n meta.siteCode = context.siteCode;\n }\n if (context.language !== undefined) {\n meta.language = context.language;\n }\n return [\"emporix\", resource, ...args, meta] as const;\n}\n","import {\n useInfiniteQuery,\n type UseInfiniteQueryResult,\n} from \"@tanstack/react-query\";\nimport type { PaginatedItems } from \"@viu/emporix-sdk\";\n\n/**\n * Internal: standard Emporix paginated `useInfiniteQuery` wrapper.\n *\n * Centralizes the `initialPageParam: 1` + `getNextPageParam` cursor logic\n * shared by every paginated infinite hook (products, categories, segments).\n * Termination is `hasNextPage === false` on the last page — never a trailing\n * empty fetch.\n */\nexport function useEmporixInfinite<T>(opts: {\n queryKey: readonly unknown[];\n fetchPage: (pageNumber: number) => Promise<PaginatedItems<T>>;\n enabled?: boolean;\n staleTime?: number;\n}): UseInfiniteQueryResult<{ pages: PaginatedItems<T>[]; pageParams: number[] }> {\n return useInfiniteQuery({\n queryKey: opts.queryKey as unknown[],\n initialPageParam: 1,\n queryFn: ({ pageParam }) => opts.fetchPage(pageParam as number),\n getNextPageParam: (last: PaginatedItems<T>) =>\n last.hasNextPage ? last.pageNumber + 1 : undefined,\n ...(opts.enabled !== undefined ? { enabled: opts.enabled } : {}),\n ...(opts.staleTime !== undefined ? { staleTime: opts.staleTime } : {}),\n });\n}\n","import {\n useQuery,\n type UseQueryResult,\n type UseInfiniteQueryResult,\n} from \"@tanstack/react-query\";\nimport { type PaginatedItems, type Product } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth, type QueryOpts } from \"./internal/use-read-auth\";\nimport { useReadSite } from \"./internal/use-read-site\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useEmporixInfinite } from \"./internal/use-emporix-infinite\";\n\nconst PRODUCTS_STALE_TIME = 60_000; // 1 minute — catalog listings + prices.\n\n/** Fetches one product. Default auth: customer if logged in, else anonymous. */\nexport function useProduct(productId: string, options: QueryOpts = {}): UseQueryResult<Product> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product\", [productId], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n queryFn: () => client.products.get(productId, undefined, ctx),\n staleTime: PRODUCTS_STALE_TIME,\n });\n}\n\n/** Fetches one page of products. */\nexport function useProducts(\n params: { pageNumber?: number; pageSize?: number } = {},\n options: QueryOpts = {},\n): UseQueryResult<PaginatedItems<Product>> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n queryFn: () => client.products.list(params, ctx),\n staleTime: PRODUCTS_STALE_TIME,\n });\n}\n\n/** Infinite product list — terminates on `hasNextPage=false`. */\nexport function useProductsInfinite(\n params: { pageSize?: number } = {},\n options: QueryOpts = {},\n): UseInfiniteQueryResult<{ pages: PaginatedItems<Product>[]; pageParams: number[] }> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: emporixKey(\"products-infinite\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n fetchPage: (pageNumber) =>\n client.products.list(\n params.pageSize !== undefined ? { pageNumber, pageSize: params.pageSize } : { pageNumber },\n ctx,\n ),\n staleTime: PRODUCTS_STALE_TIME,\n });\n}\n\n/** Fetches one product by its `code` (URL slug). Disabled when code is empty. */\nexport function useProductByCode(\n code: string | undefined,\n options: QueryOpts = {},\n): UseQueryResult<Product> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-by-code\", [code], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n enabled: typeof code === \"string\" && code !== \"\",\n queryFn: () => client.products.getByCode(code as string, ctx),\n staleTime: PRODUCTS_STALE_TIME,\n });\n}\n\n/** Full-text product search. Disabled when query is empty/whitespace. */\nexport function useProductSearch(\n query: string | undefined,\n params: { pageNumber?: number; pageSize?: number } = {},\n options: QueryOpts = {},\n): UseQueryResult<PaginatedItems<Product>> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-search\", [query, params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n enabled: typeof query === \"string\" && query.trim() !== \"\",\n queryFn: () => client.products.search(query as string, params, ctx),\n staleTime: PRODUCTS_STALE_TIME,\n });\n}\n\n/** Free-text product search by name (builds the Emporix `name:(~…)` filter). Disabled when empty/whitespace. */\nexport function useProductNameSearch(\n term: string | undefined,\n params: { pageNumber?: number; pageSize?: number } = {},\n options: QueryOpts = {},\n): UseQueryResult<PaginatedItems<Product>> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-name-search\", [term, params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n enabled: typeof term === \"string\" && term.trim() !== \"\",\n queryFn: () => client.products.searchByName(term as string, params, ctx),\n staleTime: PRODUCTS_STALE_TIME,\n });\n}\n\n/**\n * Bulk-fetches products by `code`. Order is not guaranteed — re-index by\n * `code` if needed. Disabled when `codes` is empty.\n */\nexport function useProductsByCodes(\n codes: string[],\n options: { chunkSize?: number } & QueryOpts = {},\n): UseQueryResult<Product[]> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products-by-codes\", [codes, options.chunkSize], {\n tenant: client.tenant,\n authKind: ctx.kind,\n siteCode,\n language,\n }),\n enabled: codes.length > 0,\n queryFn: () =>\n client.products.searchByCodes(\n codes,\n options.chunkSize !== undefined ? { chunkSize: options.chunkSize } : {},\n ctx,\n ),\n staleTime: 30_000,\n });\n}\n","import {\n useQuery,\n useMutation,\n useQueryClient,\n type UseQueryResult,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport {\n type ShoppingList,\n type ShoppingListItem,\n type ShoppingListDraft,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useCustomerOnlyCtx } from \"./internal/use-read-auth\";\nimport { useReadSite } from \"./internal/use-read-site\";\nimport { emporixKey } from \"./internal/query-keys\";\n\nconst SHOPPING_LIST_STALE_TIME = 30_000;\nconst INVALIDATE_KEY = [\"emporix\", \"shopping-lists\"] as const;\n\n/** The caller's shopping lists (customer-only). Optionally filtered by name. */\nexport function useShoppingLists(\n opts: { name?: string } = {},\n): UseQueryResult<ShoppingList[]> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"shopping-lists\", [opts.name ?? null], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n queryFn: () => client.shoppingLists.list(ctx, opts),\n staleTime: SHOPPING_LIST_STALE_TIME,\n });\n}\n\n/** Create a shopping list. */\nexport function useCreateShoppingList(): UseMutationResult<{ id: string }, unknown, ShoppingListDraft> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (draft: ShoppingListDraft) => client.shoppingLists.create(draft, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n\n/** Delete a named list (or all the customer's lists when `name` is omitted). */\nexport function useDeleteShoppingList(): UseMutationResult<void, unknown, { customerId: string; name?: string }> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ customerId, name }: { customerId: string; name?: string }) =>\n client.shoppingLists.delete(customerId, ctx, name !== undefined ? { name } : {}),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n\n/** Add/replace an item in a list. */\nexport function useAddToShoppingList(): UseMutationResult<void, unknown, { customerId: string; listName: string; item: ShoppingListItem }> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ customerId, listName, item }: { customerId: string; listName: string; item: ShoppingListItem }) =>\n client.shoppingLists.addItem(customerId, listName, item, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n\n/** Remove an item from a list by productId. */\nexport function useRemoveFromShoppingList(): UseMutationResult<void, unknown, { customerId: string; listName: string; productId: string }> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ customerId, listName, productId }: { customerId: string; listName: string; productId: string }) =>\n client.shoppingLists.removeItem(customerId, listName, productId, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n\n/** Set an item's quantity (0 removes it). */\nexport function useSetShoppingListItemQuantity(): UseMutationResult<void, unknown, { customerId: string; listName: string; productId: string; quantity: number }> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ customerId, listName, productId, quantity }: { customerId: string; listName: string; productId: string; quantity: number }) =>\n client.shoppingLists.setItemQuantity(customerId, listName, productId, quantity, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type Product } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth, type QueryOpts } from \"./internal/use-read-auth\";\nimport { useReadSite } from \"./internal/use-read-site\";\nimport { emporixKey } from \"./internal/query-keys\";\n\nconst VARIANT_CHILDREN_STALE_TIME = 60_000; // 1 minute — catalog data.\n\nexport type UseVariantChildrenOptions = QueryOpts & { pageSize?: number };\n\n/**\n * Resolves the VARIANT children of a PARENT_VARIANT product via\n * `products.listVariantChildren`. The cache key contains `parentVariantId`.\n * Disabled until `parentVariantId` is a non-empty string.\n */\nexport function useVariantChildren(\n parentVariantId: string | undefined,\n options: UseVariantChildrenOptions = {},\n): UseQueryResult<Product[]> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\n \"variant-children\",\n [parentVariantId, { pageSize: options.pageSize }],\n { tenant: client.tenant, authKind: ctx.kind, siteCode, language },\n ),\n enabled: typeof parentVariantId === \"string\" && parentVariantId !== \"\",\n queryFn: () =>\n client.products.listVariantChildren(\n parentVariantId as string,\n options.pageSize !== undefined ? { pageSize: options.pageSize } : {},\n ctx,\n ),\n staleTime: VARIANT_CHILDREN_STALE_TIME,\n });\n}\n","import {\n useQuery,\n type UseQueryResult,\n type UseInfiniteQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n type PaginatedItems,\n type Category,\n type Product,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth, type QueryOpts } from \"./internal/use-read-auth\";\nimport { useReadSite } from \"./internal/use-read-site\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useEmporixInfinite } from \"./internal/use-emporix-infinite\";\n\nconst CATEGORIES_STALE_TIME = 5 * 60_000; // 5 minutes — catalog structure.\n\n/** Fetches one category. */\nexport function useCategory(\n categoryId: string,\n options: QueryOpts = {},\n): UseQueryResult<Category> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"category\", [categoryId], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n queryFn: () => client.categories.get(categoryId, ctx),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n\n/** Direct child categories of a category (hierarchy drill-down). Disabled when id is empty. */\nexport function useSubcategories(\n categoryId: string | undefined,\n params: { pageNumber?: number; pageSize?: number } = {},\n options: QueryOpts = {},\n): UseQueryResult<Category[]> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"subcategories\", [categoryId ?? null, params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n enabled: typeof categoryId === \"string\" && categoryId !== \"\",\n queryFn: () => client.categories.subcategories(categoryId as string, params, ctx),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n\n/** Fetches one page of categories. */\nexport function useCategories(\n params: { pageNumber?: number; pageSize?: number } = {},\n options: QueryOpts = {},\n): UseQueryResult<PaginatedItems<Category>> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"categories\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n queryFn: () => client.categories.list(params, ctx),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n\n/** Infinite category list — terminates on `hasNextPage=false`. */\nexport function useCategoriesInfinite(\n params: { pageSize?: number } = {},\n options: QueryOpts = {},\n): UseInfiniteQueryResult<{ pages: PaginatedItems<Category>[]; pageParams: number[] }> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useEmporixInfinite<Category>({\n queryKey: emporixKey(\"categories-infinite\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n fetchPage: (pageNumber) =>\n client.categories.list(\n params.pageSize !== undefined ? { pageNumber, pageSize: params.pageSize } : { pageNumber },\n ctx,\n ),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n\n/** The catalogue's root categories (published category trees) for top-level nav. */\nexport function useCategoryTree(options: QueryOpts = {}): UseQueryResult<Category[]> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"category-tree\", [], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n queryFn: () => client.categories.tree(ctx),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n\n/** One page of products in a category. Disabled when categoryId is empty. */\nexport function useProductsInCategory(\n categoryId: string | undefined,\n params: { pageNumber?: number; pageSize?: number } = {},\n options: QueryOpts = {},\n): UseQueryResult<PaginatedItems<Product>> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products-in-category\", [categoryId, params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n enabled: typeof categoryId === \"string\" && categoryId !== \"\",\n queryFn: () => client.categories.productsIn(categoryId as string, params, ctx),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n\n/** Infinite-scroll product list for a category. Terminates on `hasNextPage=false`. */\nexport function useProductsInCategoryInfinite(\n categoryId: string | undefined,\n params: { pageSize?: number } = {},\n options: QueryOpts = {},\n): UseInfiniteQueryResult<{ pages: PaginatedItems<Product>[]; pageParams: number[] }> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: emporixKey(\"products-in-category-infinite\", [categoryId, params], { tenant: client.tenant, authKind: ctx.kind, siteCode, language }),\n enabled: typeof categoryId === \"string\" && categoryId !== \"\",\n fetchPage: (pageNumber) =>\n client.categories.productsIn(\n categoryId as string,\n params.pageSize !== undefined ? { pageNumber, pageSize: params.pageSize } : { pageNumber },\n ctx,\n ),\n staleTime: CATEGORIES_STALE_TIME,\n });\n}\n","import { useEffect, useState } from \"react\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationResult,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n EmporixError,\n type AuthContext,\n type Cart,\n type CartAddress,\n type CartItemInput,\n type CartItemUpdate,\n type CartCreated,\n type CreateCartInput,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth, type QueryOpts } from \"./internal/use-read-auth\";\nimport { useReadSite } from \"./internal/use-read-site\";\nimport { bootstrapCart } from \"./internal/bootstrap-cart\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useActiveCompany } from \"../company-context\";\n\n/** Fetches a cart by id. Falls back to `storage.getCartId()` when no argument is passed; disabled when neither is set. */\nexport function useCart(cartId?: string, options: QueryOpts = {}): UseQueryResult<Cart> {\n const { client, storage } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n const { siteCode, language } = useReadSite();\n const { activeCompany } = useActiveCompany();\n const resolvedId = cartId ?? storage.getCartId() ?? undefined;\n return useQuery({\n queryKey: emporixKey(\n \"cart\",\n [resolvedId ?? null, activeCompany?.id ?? null],\n { tenant: client.tenant, authKind: ctx.kind, siteCode, language },\n ),\n enabled: resolvedId !== undefined,\n queryFn: () => client.carts.get(resolvedId as string, ctx),\n });\n}\n\ntype Mut<TVars> = UseMutationResult<Cart, unknown, TVars, { previous: Cart | undefined }>;\n\n/** Cart write operations with optimistic cache updates and rollback. */\nexport interface CartMutationsApi {\n addItem: Mut<CartItemInput>;\n updateItem: Mut<{ itemId: string; patch: CartItemUpdate; partial?: boolean }>;\n removeItem: Mut<{ itemId: string }>;\n clear: Mut<void>;\n applyCoupon: Mut<{ code: string }>;\n removeCoupon: Mut<{ code: string }>;\n setShippingAddress: Mut<CartAddress>;\n setBillingAddress: Mut<CartAddress>;\n}\n\n/**\n * Cart write operations with optimistic cache updates and rollback.\n *\n * `cartId` is optional — when omitted, `storage.getCartId()` is resolved at\n * **mutate-time** (inside `mutationFn`/`onMutate`), so post-mount writes from\n * `useActiveCart({ create: true })` work without a render race. Throws\n * `EmporixError(\"useCartMutations: no cartId available — …\")` when storage\n * is still empty at mutate-time.\n */\nexport function useCartMutations(cartId?: string): CartMutationsApi {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n const { ctx } = useReadAuth();\n const { siteCode, language } = useReadSite();\n const { activeCompany } = useActiveCompany();\n\n const resolveId = (): string => {\n const id = cartId ?? storage.getCartId();\n if (!id) {\n throw new EmporixError(\n \"useCartMutations: no cartId available — pass one explicitly or call useActiveCart({ create: true }) first\",\n );\n }\n return id;\n };\n const keyFor = (id: string) =>\n emporixKey(\n \"cart\",\n [id, activeCompany?.id ?? null],\n { tenant: client.tenant, authKind: ctx.kind, siteCode, language },\n );\n\n function make<TVars>(\n run: (id: string, vars: TVars) => Promise<Cart>,\n optimistic?: (prev: Cart | undefined, vars: TVars) => Cart | undefined,\n ): Mut<TVars> {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMutation<\n Cart,\n unknown,\n TVars,\n { previous: Cart | undefined; key: readonly unknown[] }\n >({\n mutationFn: async (vars) => run(resolveId(), vars),\n onMutate: async (vars) => {\n const id = resolveId();\n const key = keyFor(id);\n await qc.cancelQueries({ queryKey: key });\n const previous = qc.getQueryData<Cart>(key);\n if (optimistic) qc.setQueryData<Cart>(key, optimistic(previous, vars));\n return { previous, key };\n },\n onError: (_e, _v, c) => {\n if (c) qc.setQueryData(c.key, c.previous);\n },\n onSuccess: (cart, _v, c) => {\n if (!c) return;\n // Most cart writes echo the full updated cart. Some (e.g. a partial\n // quantity update → 204 No Content) resolve to `undefined`; passing\n // that to setQueryData is a no-op, leaving the UI stale. Adopt a real\n // cart body directly; otherwise refetch so the UI reflects the server.\n if (cart && Array.isArray((cart as Cart).items)) {\n qc.setQueryData(c.key, cart);\n } else {\n void qc.invalidateQueries({ queryKey: c.key });\n }\n },\n });\n }\n\n return {\n addItem: make(\n (id, v) => client.carts.addItem(id, v, ctx),\n (prev, v) =>\n prev\n ? {\n ...prev,\n // Optimistic placeholder; replaced by the real item on success.\n items: [\n ...(prev.items ?? []),\n {\n id: `optimistic-${v.product?.id ?? \"item\"}`,\n ...v,\n } as unknown as NonNullable<Cart[\"items\"]>[number],\n ],\n }\n : prev,\n ),\n updateItem: make((id, v) =>\n client.carts.updateItem(id, v.itemId, v.patch, ctx, v.partial ? { partial: true } : {}),\n ),\n removeItem: make(\n (id, v) => client.carts.removeItem(id, v.itemId, ctx),\n (prev, v) =>\n prev ? { ...prev, items: (prev.items ?? []).filter((i) => i.id !== v.itemId) } : prev,\n ),\n clear: make(\n (id) => client.carts.clear(id, ctx),\n (prev) => (prev ? { ...prev, items: [] } : prev),\n ),\n applyCoupon: make((id, v) => client.carts.applyCoupon(id, v.code, ctx)),\n removeCoupon: make((id, v) => client.carts.removeCoupon(id, v.code, ctx)),\n setShippingAddress: make((id, v) => client.carts.setShippingAddress(id, v, ctx)),\n setBillingAddress: make((id, v) => client.carts.setBillingAddress(id, v, ctx)),\n };\n}\n\n/**\n * Creates a cart. Auto-detects auth (customer if a token is stored, else\n * anonymous). On success, persists `cartId` via `storage.setCartId` so a later\n * page reload can resume the same cart with the same anonymous session, then\n * invalidates `[\"emporix\",\"cart\"]` so `useActiveCart` re-reads storage on the\n * next render.\n *\n * Note: the SDK's `carts.create` returns `CartCreated = { cartId, yrn }`, not\n * the full `Cart`. The full cart is loaded on demand by `useCart(cartId)` /\n * `useActiveCart()`.\n */\nexport function useCreateCart(): UseMutationResult<\n CartCreated,\n unknown,\n CreateCartInput | undefined\n> {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n const { ctx } = useReadAuth();\n return useMutation<CartCreated, unknown, CreateCartInput | undefined>({\n mutationFn: (input) => client.carts.create(input, ctx),\n onSuccess: async (cart) => {\n if (cart.cartId) storage.setCartId(cart.cartId);\n await qc.invalidateQueries({ queryKey: [\"emporix\", \"cart\"] });\n },\n });\n}\n\n/**\n * Resolves to \"the active cart\": the cart matching `storage.cartId` if one is\n * present. With `create: true`, bootstraps a new cart via\n * `client.carts.getCurrent({siteCode, create: true})` when storage is empty —\n * useful on cart-page mounts where you want a cart unconditionally.\n *\n * Internally delegates to `useCart` so both hooks share the canonical\n * `[\"emporix\",\"cart\", id, …]` cache entry — optimistic updates from\n * `useCartMutations` propagate automatically.\n *\n * Returns `UseQueryResult<Cart | null>`. `data: null` means \"no cart yet and\n * create was not requested\" — a deliberate signal so an empty-state can\n * render without confusing it with the loading state.\n */\nexport function useActiveCart(opts?: {\n create?: boolean;\n type?: string;\n legalEntityId?: string;\n auth?: AuthContext;\n}): UseQueryResult<Cart | null> {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n const { ctx } = useReadAuth(opts?.auth);\n const { siteCode: activeSite } = useReadSite();\n const { activeCompany } = useActiveCompany();\n\n const [cartId, setCartId] = useState<string | null>(() => storage.getCartId());\n // Explicit opt overrides; otherwise pick up the active company.\n const effectiveLegalEntityId = opts?.legalEntityId ?? activeCompany?.id;\n\n // Sync local cartId with external storage changes. Logout and post-order\n // cleanup clear `storage.cartId`; without this the cart query would keep\n // fetching the now-invalid cart id (a 403 after logout, a 404 after the cart\n // is closed on checkout). A re-set to a fresh id propagates the same way.\n useEffect(() => {\n if (!storage.subscribeAll) return;\n return storage.subscribeAll((key) => {\n if (key !== \"cartId\") return;\n const next = storage.getCartId();\n setCartId((prev) => (prev === next ? prev : next));\n });\n }, [storage]);\n\n useEffect(() => {\n if (cartId !== null) return;\n if (!opts?.create) return;\n // Prefer the active provider site (MS-2), fall back to static config.\n const siteCode = activeSite ?? client.config?.credentials?.storefront?.context?.siteCode;\n if (!siteCode) return;\n let cancelled = false;\n bootstrapCart({\n qc,\n client,\n ctx,\n siteCode,\n ...(opts.type !== undefined ? { type: opts.type } : {}),\n ...(effectiveLegalEntityId !== undefined ? { legalEntityId: effectiveLegalEntityId } : {}),\n })\n .then((cart) => {\n if (cancelled) return;\n if (cart?.id) {\n storage.setCartId(cart.id);\n setCartId(cart.id);\n }\n })\n .catch(() => {\n // Best-effort bootstrap; downstream useCart error surfaces real issues.\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cartId, opts?.create, opts?.type, effectiveLegalEntityId, ctx.kind, activeSite]);\n\n // Delegate to useCart with the canonical cache key. When cartId state is null,\n // wrap data → null to expose the documented empty-state signal.\n const inner = useCart(cartId ?? undefined, opts?.auth ? { auth: opts.auth } : {});\n const data: Cart | null | undefined = cartId === null ? null : inner.data;\n return { ...inner, data } as UseQueryResult<Cart | null>;\n}\n","import {\n useMutation,\n useQuery,\n type UseMutationResult,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n auth,\n type AuthContext,\n type CheckoutInput,\n type QuoteCheckoutInput,\n type CheckoutResult,\n type PaymentMode,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth } from \"./internal/use-read-auth\";\nimport { useReadSite } from \"./internal/use-read-site\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useActiveCompany } from \"../company-context\";\n\nconst PAYMENT_MODES_STALE_TIME = 10 * 60_000; // 10 minutes — admin-configured.\n\n// Lazy customer-only context resolver. Throws only when invoked — so the\n// `enabled: token !== null` gate above the queryFn is the actual guard.\n// Can't use the `useCustomerOnlyCtx` hook here because it would throw at\n// hook-render time, before the enabled-gate kicks in.\nfunction customerOnlyCtx(token: string | null): AuthContext {\n if (!token) throw new Error(\"usePaymentModes requires a logged-in customer token\");\n return auth.customer(token);\n}\n\n/** Checkout actions bound to the stored customer session. */\nexport interface CheckoutApi {\n placeOrder: UseMutationResult<\n CheckoutResult,\n unknown,\n { input: CheckoutInput; saasToken?: string; siteCode?: string }\n >;\n placeOrderFromQuote: UseMutationResult<\n CheckoutResult,\n unknown,\n { input: QuoteCheckoutInput; saasToken?: string; siteCode?: string }\n >;\n}\n\n/** React bindings for the checkout flow. */\nexport function useCheckout(): CheckoutApi {\n const { client } = useEmporix();\n const { ctx } = useReadAuth();\n const { activeCompany } = useActiveCompany();\n // Merge the active legal-entity id into the order payload when set; caller's\n // explicit value wins. Cast-through to keep CheckoutInput's typed-ness while\n // permitting a passthrough field the wire schema accepts but the generated\n // type may not yet name.\n const withLE = <T extends object>(input: T): T => {\n if (!activeCompany?.id) return input;\n if (\"legalEntityId\" in input) return input;\n return { ...input, legalEntityId: activeCompany.id } as T;\n };\n const placeOrder = useMutation({\n mutationFn: (v: { input: CheckoutInput; saasToken?: string; siteCode?: string }) =>\n client.checkout.placeOrder(withLE(v.input), ctx, {\n ...(v.saasToken !== undefined ? { saasToken: v.saasToken } : {}),\n ...(v.siteCode !== undefined ? { siteCode: v.siteCode } : {}),\n }),\n });\n const placeOrderFromQuote = useMutation({\n mutationFn: (v: { input: QuoteCheckoutInput; saasToken?: string; siteCode?: string }) =>\n client.checkout.placeOrderFromQuote(withLE(v.input), ctx, {\n ...(v.saasToken !== undefined ? { saasToken: v.saasToken } : {}),\n ...(v.siteCode !== undefined ? { siteCode: v.siteCode } : {}),\n }),\n });\n return { placeOrder, placeOrderFromQuote };\n}\n\n/** Lists frontend payment modes for the logged-in customer. */\nexport function usePaymentModes(\n options: { enabled?: boolean } = {},\n): UseQueryResult<PaymentMode[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode } = useReadSite();\n const { activeCompany } = useActiveCompany();\n return useQuery({\n queryKey: emporixKey(\n \"payment-modes\",\n [activeCompany?.id ?? null],\n { tenant: client.tenant, authKind: \"customer\", siteCode },\n ),\n enabled: (options.enabled ?? true) && token !== null,\n queryFn: () => client.payments.listPaymentModes(customerOnlyCtx(token)),\n staleTime: PAYMENT_MODES_STALE_TIME,\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport {\n auth,\n type AuthContext,\n type PriceMatch,\n type PriceMatchByContextInput,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\nconst PRICES_STALE_TIME = 60_000; // 1 minute — prices change with promotions.\n\n/**\n * Resolves prices for `input.items` via `prices.matchByContext`. Defaults to\n * the anonymous session token (context bound at anonymous-login); pass a\n * customer token for personalized pricing. The SDK does not cache prices —\n * control freshness via the query key / `enabled` (re-run before checkout).\n */\nexport function useMatchPrices(\n input: PriceMatchByContextInput,\n options: { enabled?: boolean; customerToken?: string | null } = {},\n): UseQueryResult<PriceMatch[]> {\n const { client } = useEmporix();\n const { siteCode } = useReadSite();\n const ctx: AuthContext = options.customerToken\n ? auth.customer(options.customerToken)\n : auth.anonymous();\n return useQuery({\n queryKey: [\n \"emporix\",\n \"match-prices\",\n { tenant: client.tenant, input, anon: !options.customerToken, siteCode },\n ],\n enabled: (options.enabled ?? true) && (input.items?.length ?? 0) > 0,\n queryFn: () => client.prices.matchByContext(input, ctx),\n staleTime: PRICES_STALE_TIME,\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport {\n auth,\n type AuthContext,\n type PriceMatch,\n type PriceMatchByContextInput,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\nconst PRICES_STALE_TIME = 60_000; // 1 minute — prices change with promotions.\n\n/**\n * Like {@link useMatchPrices} but chunks large `items` arrays via\n * `prices.matchByContextChunked` (default 50 items per request, 4 in flight).\n * Result order is not guaranteed — match by `priceId` / `itemRef.id`.\n */\nexport function useMatchPricesChunked(\n input: PriceMatchByContextInput,\n options: {\n enabled?: boolean;\n customerToken?: string | null;\n chunkSize?: number;\n concurrency?: number;\n } = {},\n): UseQueryResult<PriceMatch[]> {\n const { client } = useEmporix();\n const { siteCode } = useReadSite();\n const ctx: AuthContext = options.customerToken\n ? auth.customer(options.customerToken)\n : auth.anonymous();\n return useQuery({\n queryKey: [\n \"emporix\",\n \"match-prices-chunked\",\n {\n tenant: client.tenant,\n input,\n anon: !options.customerToken,\n siteCode,\n chunkSize: options.chunkSize,\n concurrency: options.concurrency,\n },\n ],\n enabled: (options.enabled ?? true) && (input.items?.length ?? 0) > 0,\n queryFn: () =>\n client.prices.matchByContextChunked(\n input,\n {\n ...(options.chunkSize !== undefined ? { chunkSize: options.chunkSize } : {}),\n ...(options.concurrency !== undefined ? { concurrency: options.concurrency } : {}),\n },\n ctx,\n ),\n staleTime: PRICES_STALE_TIME,\n });\n}\n","import type { Media } from \"@viu/emporix-sdk\";\nimport { useProduct } from \"./use-products\";\n\n/**\n * Reads `productMedia` from the existing product query — no Media-Service\n * call (those need a server-only scope). For admin/server flows, use\n * `client.media.listForProduct(productId)` instead.\n */\nexport function useProductMedia(productId: string): {\n data: Media[] | undefined;\n isLoading: boolean;\n error: unknown;\n} {\n const q = useProduct(productId);\n const data = (q.data as { productMedia?: Media[] } | undefined)?.productMedia;\n return { data, isLoading: q.isLoading, error: q.error };\n}\n","import {\n useQuery,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport { useEmporixInfinite } from \"./internal/use-emporix-infinite\";\nimport {\n auth,\n type AuthContext,\n type Segment,\n type SegmentItem,\n type SegmentCategoryTree,\n type Product,\n type Category,\n type PaginatedItems,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\nconst SEGMENTS_STALE_TIME = 5 * 60_000; // 5 minutes — segment membership is admin-driven.\n\nfunction customerCtx(token: string | null): AuthContext {\n if (!token) throw new Error(\"requires a customer token in storage\");\n return auth.customer(token);\n}\n\n/** Segments the logged-in customer belongs to (`segment_read_own`). */\nexport function useMySegments(\n query: { q?: string; pageNumber?: number; pageSize?: number } = {},\n): UseQueryResult<Segment[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"list\", { tenant: client.tenant, query, siteCode, language }],\n enabled: token !== null,\n queryFn: () => client.segments.list(query, customerCtx(token)),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n\n/** Item assignments (PRODUCT + CATEGORY) across the caller's active segments. */\nexport function useMySegmentItems(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n } = {},\n): UseQueryResult<SegmentItem[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"items\", { tenant: client.tenant, query, siteCode, language }],\n enabled: token !== null,\n queryFn: () => client.segments.listItems(query, customerCtx(token)),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n\n/** Category tree filtered to the caller's segments. */\nexport function useMySegmentCategoryTree(\n query: { siteCode?: string; legalEntityId?: string } = {},\n): UseQueryResult<SegmentCategoryTree> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"categoryTree\", { tenant: client.tenant, query, siteCode, language }],\n enabled: token !== null,\n queryFn: () => client.segments.getCategoryTree(query, customerCtx(token)),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n\n/** Hydrated PRODUCT page for the caller's segments (single-page). */\nexport function useMySegmentProducts(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n pageNumber?: number;\n pageSize?: number;\n } = {},\n): UseQueryResult<PaginatedItems<Product>> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"myProducts\", { tenant: client.tenant, query, siteCode, language }],\n enabled: token !== null,\n queryFn: () => client.segments.listMyProducts(query, customerCtx(token)),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n\n/**\n * Hydrated PRODUCT pages — infinite scroll. `data.pages` is an array of\n * pages; call `fetchNextPage()` to load the next one. Terminates when\n * the source segment-items page is not full.\n */\nexport function useMySegmentProductsInfinite(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n pageSize?: number;\n } = {},\n) {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: [\n \"emporix\",\n \"segment\",\n \"myProductsInfinite\",\n { tenant: client.tenant, query, siteCode, language },\n ],\n enabled: token !== null,\n fetchPage: (pageNumber) =>\n client.segments.listMyProducts(\n { ...query, pageNumber, pageSize: query.pageSize ?? 20 },\n customerCtx(token),\n ),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n\n/** Hydrated CATEGORY page for the caller's segments (single-page). */\nexport function useMySegmentCategories(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n pageNumber?: number;\n pageSize?: number;\n } = {},\n): UseQueryResult<PaginatedItems<Category>> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"myCategories\", { tenant: client.tenant, query, siteCode, language }],\n enabled: token !== null,\n queryFn: () => client.segments.listMyCategories(query, customerCtx(token)),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n\n/**\n * Hydrated CATEGORY pages — infinite scroll. Same semantics as\n * {@link useMySegmentProductsInfinite}.\n */\nexport function useMySegmentCategoriesInfinite(\n query: {\n q?: string;\n siteCode?: string;\n legalEntityId?: string;\n onlyActive?: boolean;\n pageSize?: number;\n } = {},\n) {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { siteCode, language } = useReadSite();\n return useEmporixInfinite<Category>({\n queryKey: [\n \"emporix\",\n \"segment\",\n \"myCategoriesInfinite\",\n { tenant: client.tenant, query, siteCode, language },\n ],\n enabled: token !== null,\n fetchPage: (pageNumber) =>\n client.segments.listMyCategories(\n { ...query, pageNumber, pageSize: query.pageSize ?? 20 },\n customerCtx(token),\n ),\n staleTime: SEGMENTS_STALE_TIME,\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n type Customer,\n type CustomerUpdateInput,\n type PasswordChangeInput,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useCustomerOnlyCtx } from \"./internal/use-read-auth\";\n\n/** Updates the logged-in customer's profile and invalidates the `me` query. */\nexport function useUpdateCustomer(): UseMutationResult<Customer, unknown, CustomerUpdateInput> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation<Customer, unknown, CustomerUpdateInput>({\n mutationFn: (patch) => client.customers.update(patch, ctx),\n onSuccess: () => {\n void qc.invalidateQueries({ queryKey: [\"emporix\", \"customer\", \"me\"] });\n },\n });\n}\n\n/**\n * Changes the customer's password. No cache invalidation — no read query\n * surfaces the password.\n */\nexport function useChangePassword(): UseMutationResult<void, unknown, PasswordChangeInput> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useMutation<void, unknown, PasswordChangeInput>({\n mutationFn: (input) => client.customers.changePassword(input, ctx),\n });\n}\n","import {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationResult,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n auth,\n type Address,\n type AddressCreateInput,\n type AddressUpdateInput,\n type AuthContext,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useCustomerOnlyCtx, type QueryOpts } from \"./internal/use-read-auth\";\nimport { useActiveCompany } from \"../company-context\";\n\nconst ADDRESSES_KEY = [\"emporix\", \"customer\", \"addresses\"] as const;\n\n/**\n * Lists the logged-in customer's addresses. Disabled when no customer token\n * is in storage (returns idle state, not an error).\n */\nexport function useCustomerAddresses(options: QueryOpts = {}): UseQueryResult<Address[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { activeCompany } = useActiveCompany();\n const ctx: AuthContext | null = options.auth ?? (token ? auth.customer(token) : null);\n return useQuery({\n queryKey: [\n ...ADDRESSES_KEY,\n { tenant: client.tenant, hasToken: token !== null, legalEntityId: activeCompany?.id ?? null },\n ],\n enabled: ctx !== null,\n queryFn: () => client.customers.addresses.list(ctx as AuthContext),\n });\n}\n\n/** Address CRUD mutations. Each invalidates `customer.addresses` on success. */\nexport interface AddressMutationsApi {\n add: UseMutationResult<Address, unknown, AddressCreateInput>;\n update: UseMutationResult<Address, unknown, { id: string; patch: AddressUpdateInput }>;\n remove: UseMutationResult<void, unknown, { id: string }>;\n}\n\nexport function useAddressMutations(): AddressMutationsApi {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n\n const invalidate = (): void => {\n void qc.invalidateQueries({ queryKey: ADDRESSES_KEY });\n };\n\n \n return {\n add: useMutation<Address, unknown, AddressCreateInput>({\n mutationFn: (input) => client.customers.addresses.add(input, ctx),\n onSuccess: invalidate,\n }),\n update: useMutation<Address, unknown, { id: string; patch: AddressUpdateInput }>({\n mutationFn: ({ id, patch }) => client.customers.addresses.update(id, patch, ctx),\n onSuccess: invalidate,\n }),\n remove: useMutation<void, unknown, { id: string }>({\n mutationFn: ({ id }) => client.customers.addresses.remove(id, ctx),\n onSuccess: invalidate,\n }),\n };\n \n}\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport {\n auth,\n type PasswordResetRequestInput,\n type PasswordResetConfirmInput,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\n/**\n * The 2-step anonymous password-reset flow. `request` triggers the reset\n * email; `confirm` consumes the token + new password. Both use anonymous\n * auth — the user is by definition locked out when running this flow.\n */\nexport interface PasswordResetApi {\n request: UseMutationResult<void, unknown, PasswordResetRequestInput>;\n confirm: UseMutationResult<void, unknown, PasswordResetConfirmInput>;\n}\n\nexport function usePasswordReset(): PasswordResetApi {\n const { client } = useEmporix();\n const anonCtx = auth.anonymous();\n \n return {\n request: useMutation<void, unknown, PasswordResetRequestInput>({\n mutationFn: (input) => client.customers.requestPasswordReset(input, anonCtx),\n }),\n confirm: useMutation<void, unknown, PasswordResetConfirmInput>({\n mutationFn: (input) => client.customers.confirmPasswordReset(input, anonCtx),\n }),\n };\n \n}\n","import { useContext } from \"react\";\nimport { EmporixSiteContext, type SiteContextValue } from \"../provider\";\n\n/**\n * Returns the active site context: `{ siteCode, currency, targetLocation,\n * setSite }`. In MS-2, `currency` and `targetLocation` are always `null`;\n * they auto-populate in MS-4. `setSite(code)` is sync void in MS-2; it\n * becomes async in MS-3 (PATCHing `/session-context/{tenant}/me/context`).\n */\nexport function useSiteContext(): SiteContextValue {\n const ctx = useContext(EmporixSiteContext);\n if (!ctx) {\n throw new Error(\"useSiteContext must be used within an EmporixProvider\");\n }\n return ctx;\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport type { Site } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth, type QueryOpts } from \"./internal/use-read-auth\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useSiteContext } from \"./use-site-context\";\n\nconst SITES_STALE_TIME = 10 * 60_000; // 10 minutes — sites change admin-side only.\n\n/** Lists active sites for the tenant. */\nexport function useSites(options: QueryOpts = {}): UseQueryResult<Site[]> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n return useQuery({\n queryKey: emporixKey(\"sites\", [], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.sites.list(ctx),\n staleTime: SITES_STALE_TIME,\n });\n}\n\n/** Convenience: the tenant's default site (the one flagged `default: true`). */\nexport function useDefaultSite(options: QueryOpts = {}): UseQueryResult<Site> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth(options.auth);\n return useQuery({\n queryKey: emporixKey(\"site-default\", [], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.sites.current(ctx),\n staleTime: SITES_STALE_TIME,\n });\n}\n\n/**\n * The active site — the one whose `code` matches `useSiteContext().siteCode`.\n * Returns `undefined` while the sites list is loading, when no site is active,\n * or when the active code has no match. Derives from the shared `useSites()`\n * query (React-Query dedupes — no extra request).\n */\nexport function useActiveSite(options: QueryOpts = {}): Site | undefined {\n const { siteCode } = useSiteContext();\n const { data: sites } = useSites(options);\n return siteCode ? sites?.find((s) => s.code === siteCode) : undefined;\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type LegalEntity } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\n/** Lists the legal entities the calling customer is assigned to. */\nexport function useMyCompanies(): UseQueryResult<LegalEntity[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n return useQuery({\n queryKey: emporixKey(\"companies\", [\"mine\"], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\n }),\n enabled: token !== null,\n queryFn: () => client.companies.listMine(auth.customer(token as string)),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type LegalEntity } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\n/** Fetches one legal entity by id. Disabled until a customer token is stored. */\nexport function useCompany(legalEntityId: string | undefined): UseQueryResult<LegalEntity> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n return useQuery({\n queryKey: emporixKey(\"companies\", [legalEntityId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\n }),\n enabled: token !== null && legalEntityId !== undefined,\n queryFn: () => client.companies.get(legalEntityId as string, auth.customer(token as string)),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type ContactAssignment } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\n/** Lists contact assignments for one legal entity. */\nexport function useCompanyContacts(\n legalEntityId: string | undefined,\n): UseQueryResult<ContactAssignment[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n return useQuery({\n queryKey: emporixKey(\"companies\", [\"contacts\", legalEntityId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\n }),\n enabled: token !== null && legalEntityId !== undefined,\n queryFn: () =>\n client.contacts.listForCompany(legalEntityId as string, auth.customer(token as string)),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type Location } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\n/** Lists locations owned by one legal entity. */\nexport function useCompanyLocations(\n legalEntityId: string | undefined,\n): UseQueryResult<Location[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n return useQuery({\n queryKey: emporixKey(\"companies\", [\"locations\", legalEntityId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\n }),\n enabled: token !== null && legalEntityId !== undefined,\n queryFn: () =>\n client.locations.listForCompany(legalEntityId as string, auth.customer(token as string)),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type IamGroup } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\n/** Lists IAM customer-groups for one legal entity. */\nexport function useCompanyGroups(\n legalEntityId: string | undefined,\n): UseQueryResult<IamGroup[]> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n return useQuery({\n queryKey: emporixKey(\"companies\", [\"groups\", legalEntityId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\n }),\n enabled: token !== null && legalEntityId !== undefined,\n queryFn: () =>\n client.customerGroups.listForCompany(legalEntityId as string, auth.customer(token as string)),\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport {\n auth,\n type AuthContext,\n type LegalEntity,\n type LegalEntityCreate,\n type LegalEntityUpdate,\n type ContactAssignment,\n type ContactAssignmentCreate,\n type ContactAssignmentUpdate,\n type Location,\n type LocationCreate,\n type LocationUpdate,\n type IamGroupMemberAssignment,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\n/**\n * Internal: build an `AuthContext` from the stored customer token. The\n * mutation throws inside `mutationFn` if the token is missing — this matches\n * `useAddressMutations` and produces a typed React-Query error.\n */\nfunction useCustomerAuthResolver(): () => AuthContext {\n const { storage } = useEmporix();\n return () => {\n const token = storage.getCustomerToken();\n if (!token) throw new Error(\"Mutation requires a logged-in customer token\");\n return auth.customer(token);\n };\n}\n\n// ---- Companies ----\n\nexport function useCreateCompany(): UseMutationResult<{ id: string }, unknown, LegalEntityCreate> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (input) => client.companies.create(input, resolveAuth()),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"emporix\", \"companies\", \"mine\"] }),\n });\n}\n\nexport function useUpdateCompany(): UseMutationResult<\n LegalEntity,\n unknown,\n { id: string; patch: Partial<LegalEntityUpdate> }\n> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ id, patch }) => client.companies.update(id, patch, resolveAuth()),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"emporix\", \"companies\"] }),\n });\n}\n\nexport function useDeleteCompany(): UseMutationResult<void, unknown, string> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (id) => client.companies.delete(id, resolveAuth()),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"emporix\", \"companies\"] }),\n });\n}\n\n// ---- Contacts ----\n\nexport function useAssignContact(): UseMutationResult<\n { id: string },\n unknown,\n ContactAssignmentCreate\n> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (input) => client.contacts.assign(input, resolveAuth()),\n onSuccess: () =>\n qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"contacts\") }),\n });\n}\n\nexport function useUpdateContactAssignment(): UseMutationResult<\n ContactAssignment,\n unknown,\n { id: string; patch: Partial<ContactAssignmentUpdate> }\n> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ id, patch }) => client.contacts.update(id, patch, resolveAuth()),\n onSuccess: () =>\n qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"contacts\") }),\n });\n}\n\nexport function useUnassignContact(): UseMutationResult<void, unknown, string> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (id) => client.contacts.unassign(id, resolveAuth()),\n onSuccess: () =>\n qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"contacts\") }),\n });\n}\n\n// ---- Locations ----\n\nexport function useCreateLocation(): UseMutationResult<{ id: string }, unknown, LocationCreate> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (input) => client.locations.create(input, resolveAuth()),\n onSuccess: () =>\n qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"locations\") }),\n });\n}\n\nexport function useUpdateLocation(): UseMutationResult<\n Location,\n unknown,\n { id: string; patch: Partial<LocationUpdate> }\n> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ id, patch }) => client.locations.update(id, patch, resolveAuth()),\n onSuccess: () =>\n qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"locations\") }),\n });\n}\n\nexport function useDeleteLocation(): UseMutationResult<void, unknown, string> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (id) => client.locations.delete(id, resolveAuth()),\n onSuccess: () =>\n qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"locations\") }),\n });\n}\n\n// ---- Group members ----\n\nexport function useAddGroupMember(): UseMutationResult<\n { id: string },\n unknown,\n { groupId: string; member: IamGroupMemberAssignment }\n> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ groupId, member }) =>\n client.customerGroups.addMember(groupId, member, resolveAuth()),\n onSuccess: () => qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"groups\") }),\n });\n}\n\nexport function useRemoveGroupMember(): UseMutationResult<\n void,\n unknown,\n { groupId: string; userId: string }\n> {\n const { client } = useEmporix();\n const resolveAuth = useCustomerAuthResolver();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ groupId, userId }) =>\n client.customerGroups.removeMember(groupId, userId, resolveAuth()),\n onSuccess: () => qc.invalidateQueries({ predicate: (q) => q.queryKey.includes(\"groups\") }),\n });\n}\n","import { useCallback } from \"react\";\nimport type { LegalEntity } from \"@viu/emporix-sdk\";\nimport { useActiveCompany } from \"../company-context\";\n\nexport interface CompanySwitcherApi {\n companies: LegalEntity[];\n active: LegalEntity | null;\n status: \"idle\" | \"loading\" | \"switching\" | \"error\";\n switch: (legalEntityId: string) => Promise<void>;\n clear: () => Promise<void>;\n}\n\n/** UI-friendly wrapper around useActiveCompany — exposes switch/clear pair. */\nexport function useCompanySwitcher(): CompanySwitcherApi {\n const ctx = useActiveCompany();\n const switchFn = useCallback(\n (legalEntityId: string) => ctx.setActiveCompany(legalEntityId),\n [ctx],\n );\n const clearFn = useCallback(() => ctx.setActiveCompany(null), [ctx]);\n return {\n companies: ctx.myCompanies,\n active: ctx.activeCompany,\n status: ctx.status,\n switch: switchFn,\n clear: clearFn,\n };\n}\n","import {\n useMutation,\n useQuery,\n type UseMutationResult,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\nimport {\n auth,\n type AuthContext,\n type InvokeCloudFunctionOptions,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\n/** Variables for {@link useInvokeCloudFunction}. */\nexport interface InvokeCloudFunctionVars<TReq = unknown>\n extends InvokeCloudFunctionOptions<TReq> {\n functionId: string;\n /** Override the auto-resolved auth (customer-if-token-else-anonymous). */\n auth?: AuthContext;\n}\n\n/**\n * Imperatively invoke a cloud function (any method). Auth is resolved\n * automatically (customer if a token is stored, else anonymous) unless an\n * explicit `auth` is passed in the variables. Service auth is intentionally\n * not exposed in React.\n */\nexport function useInvokeCloudFunction<TRes = unknown, TReq = unknown>(): UseMutationResult<\n TRes,\n unknown,\n InvokeCloudFunctionVars<TReq>\n> {\n const { client, storage } = useEmporix();\n return useMutation({\n mutationFn: (vars: InvokeCloudFunctionVars<TReq>) => {\n const { functionId, auth: authOverride, ...options } = vars;\n const token = storage.getCustomerToken();\n const authCtx = authOverride ?? (token ? auth.customer(token) : auth.anonymous());\n return client.cloudFunctions.invoke<TRes, TReq>(functionId, options, authCtx);\n },\n });\n}\n\n/**\n * Query a (read-style) cloud function with React-Query caching. Defaults to\n * GET. Disabled while `functionId` is `undefined`. Auth resolves like\n * {@link useInvokeCloudFunction}; pass `options.auth` to override.\n */\nexport function useCloudFunction<TRes = unknown>(\n functionId: string | undefined,\n options?: InvokeCloudFunctionOptions & { auth?: AuthContext },\n queryOptions?: { enabled?: boolean; staleTime?: number },\n): UseQueryResult<TRes> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { auth: authOverride, ...invokeOptions } = options ?? {};\n const authCtx = authOverride ?? (token ? auth.customer(token) : auth.anonymous());\n return useQuery({\n queryKey: emporixKey(\n \"cloud-function\",\n [functionId ?? null, invokeOptions.path ?? null, invokeOptions.query ?? null],\n { tenant: client.tenant, authKind: token ? \"customer\" : \"anonymous\" },\n ),\n enabled: (queryOptions?.enabled ?? true) && functionId !== undefined,\n ...(queryOptions?.staleTime !== undefined ? { staleTime: queryOptions.staleTime } : {}),\n queryFn: () =>\n client.cloudFunctions.invoke<TRes>(\n functionId as string,\n { method: \"GET\", ...invokeOptions },\n authCtx,\n ),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type Order, type OrderStatus, type PaginatedItems } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useActiveCompany } from \"../company-context\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\n/** Options for `useMyOrders`. Passing `legalEntityId: null` disables the active-company auto-default. */\nexport interface UseMyOrdersOptions {\n pageNumber?: number;\n pageSize?: number;\n status?: OrderStatus;\n /** `undefined` = default from `useActiveCompany`. `null` = no filter. */\n legalEntityId?: string | null;\n saasToken?: string;\n}\n\n/** Paginated read of the customer's own orders. Disabled without a customer token. */\nexport function useMyOrders(\n options: UseMyOrdersOptions = {},\n): UseQueryResult<PaginatedItems<Order>> {\n const { client, storage } = useEmporix();\n const { activeCompany } = useActiveCompany();\n const { siteCode, language } = useReadSite();\n const token = storage.getCustomerToken();\n const effectiveLE: string | undefined =\n options.legalEntityId === null\n ? undefined\n : (options.legalEntityId ?? activeCompany?.id);\n return useQuery({\n queryKey: emporixKey(\n \"orders\",\n [\"mine\", effectiveLE ?? null, options.status ?? null, options.pageNumber ?? 1, options.pageSize ?? null],\n { tenant: client.tenant, authKind: token ? \"customer\" : \"anonymous\", siteCode, language },\n ),\n enabled: token !== null,\n queryFn: () =>\n client.orders.listMine(auth.customer(token as string), {\n ...(options.pageNumber !== undefined ? { pageNumber: options.pageNumber } : {}),\n ...(options.pageSize !== undefined ? { pageSize: options.pageSize } : {}),\n ...(options.status !== undefined ? { status: options.status } : {}),\n ...(effectiveLE !== undefined ? { legalEntityId: effectiveLE } : {}),\n ...(siteCode ? { siteCode } : {}),\n ...(options.saasToken !== undefined ? { saasToken: options.saasToken } : {}),\n }),\n });\n}\n","import type { UseInfiniteQueryResult } from \"@tanstack/react-query\";\nimport { auth, type Order, type OrderStatus, type PaginatedItems } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useActiveCompany } from \"../company-context\";\nimport { useEmporixInfinite } from \"./internal/use-emporix-infinite\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\nexport interface UseMyOrdersInfiniteOptions {\n pageSize?: number;\n status?: OrderStatus;\n legalEntityId?: string | null;\n saasToken?: string;\n}\n\n/** Infinite paginated read of customer orders. Same defaulting rules as useMyOrders. */\nexport function useMyOrdersInfinite(\n options: UseMyOrdersInfiniteOptions = {},\n): UseInfiniteQueryResult<{ pages: PaginatedItems<Order>[]; pageParams: number[] }> {\n const { client, storage } = useEmporix();\n const { activeCompany } = useActiveCompany();\n const { siteCode, language } = useReadSite();\n const token = storage.getCustomerToken();\n const effectiveLE: string | undefined =\n options.legalEntityId === null\n ? undefined\n : (options.legalEntityId ?? activeCompany?.id);\n return useEmporixInfinite<Order>({\n queryKey: emporixKey(\n \"orders\",\n [\"mine-infinite\", effectiveLE ?? null, options.status ?? null, options.pageSize ?? null],\n { tenant: client.tenant, authKind: token ? \"customer\" : \"anonymous\", siteCode, language },\n ),\n enabled: token !== null,\n fetchPage: (pageNumber) =>\n client.orders.listMine(auth.customer(token as string), {\n pageNumber,\n ...(options.pageSize !== undefined ? { pageSize: options.pageSize } : {}),\n ...(options.status !== undefined ? { status: options.status } : {}),\n ...(effectiveLE !== undefined ? { legalEntityId: effectiveLE } : {}),\n ...(siteCode ? { siteCode } : {}),\n ...(options.saasToken !== undefined ? { saasToken: options.saasToken } : {}),\n }),\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type Order } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\nexport interface UseOrderOptions {\n saasToken?: string;\n}\n\n/** Single-order read by id. Disabled without a customer token or when orderId is undefined. */\nexport function useOrder(\n orderId: string | undefined,\n options: UseOrderOptions = {},\n): UseQueryResult<Order> {\n const { client, storage } = useEmporix();\n const token = storage.getCustomerToken();\n const { language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"orders\", [orderId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\n language,\n }),\n enabled: token !== null && orderId !== undefined,\n queryFn: () =>\n client.orders.get(\n orderId as string,\n auth.customer(token as string),\n options.saasToken ? { saasToken: options.saasToken } : {},\n ),\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { auth } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\nexport interface UseCancelOrderVars {\n orderId: string;\n saasToken?: string;\n}\n\n/** Cancels (transitions to DECLINED) a customer's order. Invalidates [\"emporix\",\"orders\"] on success. */\nexport function useCancelOrder(): UseMutationResult<void, unknown, string | UseCancelOrderVars> {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n return useMutation({\n mutationKey: [\"emporix\", \"orders\", \"cancel\"],\n mutationFn: async (input) => {\n const token = storage.getCustomerToken();\n if (!token) throw new Error(\"useCancelOrder: requires a logged-in customer\");\n const { orderId, saasToken } =\n typeof input === \"string\" ? { orderId: input, saasToken: undefined } : input;\n await client.orders.cancel(\n orderId,\n auth.customer(token),\n saasToken ? { saasToken } : {},\n );\n },\n onSuccess: () =>\n qc.invalidateQueries({\n predicate: (q) =>\n Array.isArray(q.queryKey) && q.queryKey[1] === \"orders\",\n }),\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { auth, type OrderStatus } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\nexport interface UseOrderTransitionVars {\n orderId: string;\n status: OrderStatus;\n comment?: string;\n saasToken?: string;\n}\n\n/** Generic status transition. Server enforces legality. Invalidates [\"emporix\",\"orders\"] on success. */\nexport function useOrderTransition(): UseMutationResult<void, unknown, UseOrderTransitionVars> {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n return useMutation({\n mutationKey: [\"emporix\", \"orders\", \"transition\"],\n mutationFn: async ({ orderId, status, comment, saasToken }) => {\n const token = storage.getCustomerToken();\n if (!token) throw new Error(\"useOrderTransition: requires a logged-in customer\");\n await client.orders.transition(\n orderId,\n status,\n auth.customer(token),\n {\n ...(comment !== undefined ? { comment } : {}),\n ...(saasToken !== undefined ? { saasToken } : {}),\n },\n );\n },\n onSuccess: () =>\n qc.invalidateQueries({\n predicate: (q) =>\n Array.isArray(q.queryKey) && q.queryKey[1] === \"orders\",\n }),\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { auth, type Order } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\n\nexport interface UseReorderVars {\n orderId: string;\n saasToken?: string;\n}\n\nexport interface UseReorderResult {\n added: number;\n errors: unknown[];\n}\n\n/**\n * Re-populates the active cart from a past order via a single\n * `cart.addItemsBatch` call. Best-effort: item-level failures land in\n * `errors[]` instead of throwing; partial-success result shape stays\n * `{ added, errors }`.\n *\n * Emporix's batch endpoint caps at 200 items per request. Orders with more\n * line-items are not supported here — extend with chunking if a real use\n * case appears.\n */\nexport function useReorder(): UseMutationResult<UseReorderResult, unknown, UseReorderVars> {\n const { client, storage } = useEmporix();\n const qc = useQueryClient();\n return useMutation<UseReorderResult, unknown, UseReorderVars>({\n mutationKey: [\"emporix\", \"orders\", \"reorder\"],\n mutationFn: async ({ orderId, saasToken }) => {\n const token = storage.getCustomerToken();\n if (!token) throw new Error(\"useReorder: requires a logged-in customer\");\n const ctx = auth.customer(token);\n\n const order = await qc.fetchQuery<Order>({\n queryKey: emporixKey(\"orders\", [orderId], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () =>\n client.orders.get(orderId, ctx, saasToken ? { saasToken } : {}),\n });\n\n const cartId = storage.getCartId();\n if (!cartId) throw new Error(\"useReorder: no active cart id in storage\");\n\n // The cart requires a price row (priceId + amounts) per item, so re-add\n // each order entry with the price it was ordered at. Entries lacking an\n // itemYrn or a complete price can't be re-added and are skipped.\n // (Prices are re-validated server-side at checkout; a stale priceId may\n // be rejected then — re-resolve via matchByContext if that matters.)\n const batchBody = (order.entries ?? [])\n .map((entry) => {\n const p = entry.price;\n if (\n !entry.itemYrn ||\n !p?.priceId ||\n p.originalAmount === undefined ||\n p.effectiveAmount === undefined ||\n !p.currency\n ) {\n return null;\n }\n return {\n itemYrn: entry.itemYrn,\n quantity: entry.orderedAmount ?? entry.amount,\n price: {\n priceId: p.priceId,\n originalAmount: p.originalAmount,\n effectiveAmount: p.effectiveAmount,\n currency: p.currency,\n },\n };\n })\n .filter((x): x is NonNullable<typeof x> => x !== null);\n if (batchBody.length === 0) return { added: 0, errors: [] };\n const res = await client.carts.addItemsBatch(cartId, batchBody as never, ctx);\n let added = 0;\n const errors: unknown[] = [];\n for (const entry of res) {\n if (entry.status >= 200 && entry.status < 300) {\n added += 1;\n } else {\n errors.push(\n new Error(\n `addItemsBatch entry ${entry.index ?? \"?\"}: status=${entry.status}${entry.errorMessage ? \" \" + entry.errorMessage : \"\"}`,\n ),\n );\n }\n }\n return { added, errors };\n },\n onSuccess: () => {\n qc.invalidateQueries({ predicate: (q) => Array.isArray(q.queryKey) && q.queryKey[1] === \"cart\" });\n },\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { type AuthContext, type Order } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { emporixKey } from \"./internal/query-keys\";\nimport { useReadSite } from \"./internal/use-read-site\";\n\n/** Service-account read of a single sales-order. Disabled when `auth` is undefined. */\nexport function useSalesOrder(\n orderId: string | undefined,\n authCtx: AuthContext | undefined,\n): UseQueryResult<Order> {\n const { client } = useEmporix();\n const { language } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"salesorders\", [orderId ?? null], {\n tenant: client.tenant,\n authKind: authCtx?.kind ?? \"anonymous\",\n language,\n }),\n enabled: orderId !== undefined && authCtx !== undefined,\n queryFn: () => client.salesOrders.get(orderId as string, authCtx as AuthContext),\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport { type AuthContext, type Order, type SalesOrderPatch } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\nexport interface UseUpdateSalesOrderVars {\n orderId: string;\n patch: SalesOrderPatch;\n auth: AuthContext;\n recalculate?: boolean;\n}\n\n/**\n * Service-account update of a sales-order. Invalidates both\n * [\"emporix\",\"salesorders\",id] and [\"emporix\",\"orders\",id] (the customer-view\n * cache for the same order) on success.\n */\nexport function useUpdateSalesOrder(): UseMutationResult<Order, unknown, UseUpdateSalesOrderVars> {\n const { client } = useEmporix();\n const qc = useQueryClient();\n return useMutation<Order, unknown, UseUpdateSalesOrderVars>({\n mutationKey: [\"emporix\", \"salesorders\", \"update\"],\n mutationFn: async ({ orderId, patch, auth, recalculate }) => {\n if (!auth) throw new Error(\"useUpdateSalesOrder: requires an auth context\");\n return client.salesOrders.update(\n orderId,\n patch,\n auth,\n recalculate !== undefined ? { recalculate } : {},\n );\n },\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({\n predicate: (q) =>\n Array.isArray(q.queryKey) &&\n (q.queryKey[1] === \"salesorders\" || (q.queryKey[1] === \"orders\" && q.queryKey[2] === vars.orderId)),\n });\n },\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type AuthContext, type Availability } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\nconst AVAILABILITY_STALE_TIME = 30_000; // 30s — stock changes, but not per render.\n\nexport interface UseAvailabilityOptions {\n enabled?: boolean;\n customerToken?: string | null;\n defaultAvailableOnNotFound?: boolean;\n}\n\n/**\n * Reads availability for one product on one site via `availability.get`.\n * Defaults to the anonymous token; pass `customerToken` for a customer context.\n */\nexport function useAvailability(\n productId: string,\n siteCode: string,\n options: UseAvailabilityOptions = {},\n): UseQueryResult<Availability> {\n const { client } = useEmporix();\n const ctx: AuthContext = options.customerToken\n ? auth.customer(options.customerToken)\n : auth.anonymous();\n return useQuery({\n queryKey: [\n \"emporix\",\n \"availability\",\n {\n tenant: client.tenant,\n productId,\n siteCode,\n anon: !options.customerToken,\n defaultAvailableOnNotFound: options.defaultAvailableOnNotFound ?? false,\n },\n ],\n enabled: (options.enabled ?? true) && Boolean(productId) && Boolean(siteCode),\n queryFn: () =>\n client.availability.get(productId, siteCode, ctx, {\n defaultAvailableOnNotFound: options.defaultAvailableOnNotFound ?? false,\n }),\n staleTime: AVAILABILITY_STALE_TIME,\n });\n}\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { auth, type AuthContext, type Availability } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\n\nconst AVAILABILITY_STALE_TIME = 30_000; // 30s — stock changes, but not per render.\n\nexport interface UseAvailabilitiesOptions {\n enabled?: boolean;\n customerToken?: string | null;\n defaultAvailableOnNotFound?: boolean;\n}\n\n/**\n * Reads availability for many products on one site via `availability.getMany`\n * (a single batch request). Returns records in input order; missing products\n * are `{ available: false }` (or `{ available: true }` with\n * `defaultAvailableOnNotFound`).\n */\nexport function useAvailabilities(\n productIds: string[],\n siteCode: string,\n options: UseAvailabilitiesOptions = {},\n): UseQueryResult<Availability[]> {\n const { client } = useEmporix();\n const ctx: AuthContext = options.customerToken\n ? auth.customer(options.customerToken)\n : auth.anonymous();\n return useQuery({\n queryKey: [\n \"emporix\",\n \"availabilities\",\n {\n tenant: client.tenant,\n productIds,\n siteCode,\n anon: !options.customerToken,\n defaultAvailableOnNotFound: options.defaultAvailableOnNotFound ?? false,\n },\n ],\n enabled: (options.enabled ?? true) && productIds.length > 0 && Boolean(siteCode),\n queryFn: () =>\n client.availability.getMany(productIds, siteCode, ctx, {\n defaultAvailableOnNotFound: options.defaultAvailableOnNotFound ?? false,\n }),\n staleTime: AVAILABILITY_STALE_TIME,\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\nimport type { RedemptionInput, RedemptionCreated } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useReadAuth } from \"./internal/use-read-auth\";\n\nconst INVALIDATE_KEY = [\"emporix\", \"coupons\"] as const;\n\n/** Variables for the coupon action hooks. */\nexport interface CouponActionVars {\n code: string;\n redemption: RedemptionInput;\n}\n\n/**\n * Check whether a coupon can be redeemed for the current shopper. Resolves on\n * success (redeemable); the mutation enters `isError` when the coupon is not\n * redeemable. Uses the browser auth context (customer if logged in, else\n * anonymous) — never the service token.\n */\nexport function useValidateCoupon(): UseMutationResult<void, unknown, CouponActionVars> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth();\n return useMutation({\n mutationFn: ({ code, redemption }: CouponActionVars) =>\n client.coupons.validateCoupon(code, redemption, ctx),\n });\n}\n\n/**\n * Redeem a coupon for the current shopper (creates a redemption). Invalidates\n * the `[\"emporix\", \"coupons\"]` cache on success.\n */\nexport function useRedeemCoupon(): UseMutationResult<RedemptionCreated, unknown, CouponActionVars> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ code, redemption }: CouponActionVars) =>\n client.coupons.redeemCoupon(code, redemption, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n","import {\n useQuery,\n useMutation,\n useQueryClient,\n type UseQueryResult,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type {\n PointsSummary,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useCustomerOnlyCtx, useReadAuth } from \"./internal/use-read-auth\";\nimport { emporixKey } from \"./internal/query-keys\";\n\nconst STALE = 30_000;\nconst INVALIDATE_KEY = [\"emporix\", \"reward-points\"] as const;\n\n/** The signed-in customer's reward-points balance (customer-only). */\nexport function useMyRewardPoints(): UseQueryResult<number> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useQuery({\n queryKey: emporixKey(\"reward-points\", [\"mine\"], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.rewardPoints.getMyPoints(ctx),\n staleTime: STALE,\n });\n}\n\n/** The signed-in customer's reward-points summary (customer-only). */\nexport function useMyRewardPointsSummary(): UseQueryResult<PointsSummary> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useQuery({\n queryKey: emporixKey(\"reward-points\", [\"mine\", \"summary\"], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.rewardPoints.getMySummary(ctx),\n staleTime: STALE,\n });\n}\n\n/** List redeem options (works for guests and customers). */\nexport function useRedeemOptions(): UseQueryResult<RedeemOptionList> {\n const { client } = useEmporix();\n const { ctx } = useReadAuth();\n return useQuery({\n queryKey: emporixKey(\"reward-points\", [\"redeem-options\"], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.rewardPoints.listRedeemOptions(ctx),\n staleTime: STALE,\n });\n}\n\n/** Redeem the signed-in customer's points for a coupon code. */\nexport function useRedeemRewardPoints(): UseMutationResult<RedeemCouponResult, unknown, RedeemMyPointsInput> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (input: RedeemMyPointsInput) => client.rewardPoints.redeemMyPoints(input, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n","import {\n useQuery,\n useMutation,\n useQueryClient,\n type UseQueryResult,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type { Return, ReturnList, ReturnInput, ReturnCreated } from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useCustomerOnlyCtx } from \"./internal/use-read-auth\";\nimport { emporixKey } from \"./internal/query-keys\";\n\nconst STALE = 30_000;\nconst INVALIDATE_KEY = [\"emporix\", \"returns\"] as const;\n\n/** The signed-in customer's returns (customer-only). */\nexport function useMyReturns(\n opts: { query?: Record<string, string | number> } = {},\n): UseQueryResult<ReturnList> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useQuery({\n queryKey: emporixKey(\"returns\", [opts.query ?? null], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.returns.listReturns(opts.query ?? {}, ctx),\n staleTime: STALE,\n });\n}\n\n/** A single return by id (customer-only). */\nexport function useReturn(returnId: string | undefined): UseQueryResult<Return> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useQuery({\n queryKey: emporixKey(\"returns\", [returnId ?? null], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.returns.getReturn(returnId as string, ctx),\n enabled: Boolean(returnId),\n staleTime: STALE,\n });\n}\n\n/** Create a return for the signed-in customer. Invalidates the returns list. */\nexport function useCreateReturn(): UseMutationResult<ReturnCreated, unknown, ReturnInput> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (input: ReturnInput) => client.returns.createReturn(input, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n","import {\n useQuery,\n useMutation,\n useQueryClient,\n type UseQueryResult,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n} from \"@viu/emporix-sdk\";\nimport { useEmporix } from \"../provider\";\nimport { useCustomerOnlyCtx } from \"./internal/use-read-auth\";\nimport { emporixKey } from \"./internal/query-keys\";\n\nconst STALE = 30_000;\nconst INVALIDATE_KEY = [\"emporix\", \"approvals\"] as const;\n\n/** The signed-in customer's approvals (customer-only). */\nexport function useApprovals(\n opts: { query?: Record<string, string | number> } = {},\n): UseQueryResult<ApprovalList> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useQuery({\n queryKey: emporixKey(\"approvals\", [opts.query ?? null], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.approvals.listApprovals(opts.query ?? {}, ctx),\n staleTime: STALE,\n });\n}\n\n/** A single approval by id (customer-only). */\nexport function useApproval(approvalId: string | undefined): UseQueryResult<Approval> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n return useQuery({\n queryKey: emporixKey(\"approvals\", [approvalId ?? null], { tenant: client.tenant, authKind: ctx.kind }),\n queryFn: () => client.approvals.getApproval(approvalId as string, ctx),\n enabled: Boolean(approvalId),\n staleTime: STALE,\n });\n}\n\n/** Create an approval request for the signed-in customer. Invalidates the list. */\nexport function useCreateApproval(): UseMutationResult<ApprovalCreated, unknown, ApprovalInput> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (input: ApprovalInput) => client.approvals.createApproval(input, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n\n/** Variables for {@link useUpdateApproval}. */\nexport interface UseUpdateApprovalVars {\n approvalId: string;\n /** JSON-Patch op-array — e.g. `[{ op: \"replace\", path: \"/status\", value: \"APPROVED\" }]`. */\n ops: ApprovalPatch;\n}\n\n/** Approve/reject/amend an approval via JSON-Patch (customer-only). Invalidates the list. */\nexport function useUpdateApproval(): UseMutationResult<void, unknown, UseUpdateApprovalVars> {\n const { client } = useEmporix();\n const ctx = useCustomerOnlyCtx();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ approvalId, ops }: UseUpdateApprovalVars) =>\n client.approvals.updateApproval(approvalId, ops, ctx),\n onSuccess: () => void qc.invalidateQueries({ queryKey: INVALIDATE_KEY }),\n });\n}\n"]}
|
package/dist/hooks.cjs
CHANGED
|
@@ -115,6 +115,7 @@ function useCustomerSession() {
|
|
|
115
115
|
const result = await client.customers.login(input);
|
|
116
116
|
storage.setCustomerToken(result.customerToken);
|
|
117
117
|
storage.setRefreshToken(result.refreshToken || null);
|
|
118
|
+
storage.setAnonymousSession(null);
|
|
118
119
|
setSession({
|
|
119
120
|
token: result.customerToken,
|
|
120
121
|
refreshToken: result.refreshToken || null,
|
|
@@ -147,6 +148,7 @@ function useCustomerSession() {
|
|
|
147
148
|
async (incoming) => {
|
|
148
149
|
storage.setCustomerToken(incoming.customerToken);
|
|
149
150
|
storage.setRefreshToken(incoming.refreshToken || null);
|
|
151
|
+
storage.setAnonymousSession(null);
|
|
150
152
|
setSession({
|
|
151
153
|
token: incoming.customerToken,
|
|
152
154
|
refreshToken: incoming.refreshToken || null,
|