@viu/emporix-sdk-react 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/dist/{chunk-TJXNTSXN.js → chunk-GRGWUXNB.js} +60 -15
- package/dist/chunk-GRGWUXNB.js.map +1 -0
- package/dist/hooks.cjs +57 -12
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.cts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.cjs +57 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{use-returns-FGAfGMpY.d.ts → use-returns-96kuAgjF.d.ts} +7 -0
- package/dist/{use-returns-BMcuyi9J.d.cts → use-returns-D9g9zYu1.d.cts} +7 -0
- package/package.json +3 -3
- package/dist/chunk-TJXNTSXN.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/local-storage.ts","../src/storage/cookie.ts","../src/storage/index.ts","../src/storage/memory.ts","../src/telemetry.ts","../src/company-context.tsx","../src/provider.tsx","../src/hooks/internal/bootstrap-cart.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-sites.ts","../src/hooks/use-site-context.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-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/errors.tsx","../src/ssr.ts"],"names":["createContext","useContext","useQueryClient","useState","useRef","useCallback","auth","useEffect","useMemo","jsx","QueryClient","storage","QueryClientProvider","useQuery","useInfiniteQuery","useMutation","EmporixError","PRICES_STALE_TIME","AVAILABILITY_STALE_TIME","INVALIDATE_KEY","STALE","Component","EmporixAuthError"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_KEY = \"emporix.customerToken\";\nconst CART_KEY = \"emporix.cartId\";\nconst ANON_KEY = \"emporix.anonymousSession\";\nconst SITE_KEY = \"emporix.siteCode\";\nconst ACTIVE_LE_KEY = \"emporix.activeLegalEntityId\";\nconst REFRESH_KEY = \"emporix.refreshToken\";\n\n/** Browser `localStorage`-backed store. Falls back to memory on the server. */\nexport function createLocalStorageStorage(opts: { key?: string } = {}): EmporixStorage {\n const tokenKey = opts.key ?? DEFAULT_TOKEN_KEY;\n const available =\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { localStorage?: Storage }).localStorage !== \"undefined\";\n if (!available) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n const ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => ls.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) ls.removeItem(tokenKey);\n else ls.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => ls.getItem(CART_KEY),\n setCartId: (id) => {\n if (id === null) ls.removeItem(CART_KEY);\n else ls.setItem(CART_KEY, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(ls.getItem(ANON_KEY)),\n setAnonymousSession: (s) => {\n if (s === null) ls.removeItem(ANON_KEY);\n else ls.setItem(ANON_KEY, JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }));\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => ls.getItem(SITE_KEY),\n setSiteCode: (code) => {\n if (code === null) ls.removeItem(SITE_KEY);\n else ls.setItem(SITE_KEY, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => ls.getItem(ACTIVE_LE_KEY),\n setActiveLegalEntityId: (id) => {\n if (id === null) ls.removeItem(ACTIVE_LE_KEY);\n else ls.setItem(ACTIVE_LE_KEY, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => ls.getItem(REFRESH_KEY),\n setRefreshToken: (t) => {\n if (t === null) ls.removeItem(REFRESH_KEY);\n else ls.setItem(REFRESH_KEY, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_NAME = \"emporix.customerToken\";\nconst CART_NAME = \"emporix.cartId\";\nconst ANON_NAME = \"emporix.anonymousSession\";\nconst SITE_NAME = \"emporix.siteCode\";\nconst ACTIVE_LE_NAME = \"emporix.activeLegalEntityId\";\nconst REFRESH_NAME = \"emporix.refreshToken\";\n\n/** Cookie-backed store. Consumer must set SameSite/Secure for CSRF safety. */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const tokenName = opts.name ?? DEFAULT_TOKEN_NAME;\n const sameSite = opts.sameSite ?? \"lax\";\n const secure = opts.secure ?? false;\n if (typeof document === \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const readCookie = (name: string): string | null => {\n for (const part of document.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n };\n const writeCookie = (name: string, value: string | null): void => {\n document.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n };\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => readCookie(tokenName),\n setCustomerToken: (t) => {\n writeCookie(tokenName, t);\n all.notify(\"customerToken\");\n },\n getCartId: () => readCookie(CART_NAME),\n setCartId: (id) => {\n writeCookie(CART_NAME, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(readCookie(ANON_NAME)),\n setAnonymousSession: (s) => {\n writeCookie(\n ANON_NAME,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => readCookie(SITE_NAME),\n setSiteCode: (code) => {\n writeCookie(SITE_NAME, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => readCookie(ACTIVE_LE_NAME),\n setActiveLegalEntityId: (id) => {\n writeCookie(ACTIVE_LE_NAME, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => readCookie(REFRESH_NAME),\n setRefreshToken: (t) => {\n writeCookie(REFRESH_NAME, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(\n listener: (key: EmporixStorageKey) => void,\n ): () => void;\n}\n\n/** Minimal subset of `AnonymousSession` that needs to outlive a page load. */\nexport interface PersistedAnonymousSession {\n refreshToken: string;\n sessionId: string;\n}\n\n/** Backward-compat alias. New code should prefer `EmporixStorage`. */\nexport type TokenStorage = EmporixStorage;\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\";\n\n/**\n * Internal: create a swallow-on-throw listener set used by all three storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/**\n * Internal: parses a raw `anonymousSession` JSON payload (from localStorage\n * or a cookie) into a {@link PersistedAnonymousSession}. Returns `null` for\n * any malformed or missing input.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n if (typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\") {\n return { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport { createMemoryStorage } from \"./memory\";\nexport { createLocalStorageStorage } from \"./local-storage\";\nexport { createCookieStorage } from \"./cookie\";\n","import {\n createListenerSet,\n type EmporixStorage,\n type EmporixStorageKey,\n type PersistedAnonymousSession,\n} from \"./index\";\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import { createContext, useContext } from \"react\";\n\n/**\n * All telemetry events emitted through the EmporixProvider's `onTelemetry`\n * callback. Discriminated by `type` — exhaustive switch is type-safe.\n *\n * Consumers can emit their own `{ type: \"custom\" }` events via\n * {@link useEmporixTelemetry}. Namespace `name` with an app-specific\n * prefix (e.g. `\"app.checkout-cta-click\"`) to avoid collisions with\n * future SDK event types.\n */\nexport type EmporixTelemetryEvent =\n // Cache lifecycle (React-Query QueryCache)\n | { type: \"cache.hit\"; queryKey: readonly unknown[]; tenant: string }\n | {\n type: \"cache.miss\";\n queryKey: readonly unknown[];\n tenant: string;\n durationMs: number;\n }\n | {\n type: \"query.refetch\";\n queryKey: readonly unknown[];\n tenant: string;\n reason: \"invalidate\" | \"focus\" | \"stale\";\n }\n | {\n type: \"query.error\";\n queryKey: readonly unknown[];\n tenant: string;\n error: unknown;\n }\n // Mutation lifecycle\n | {\n type: \"mutation.success\";\n mutationKey?: readonly unknown[];\n tenant: string;\n durationMs: number;\n }\n | {\n type: \"mutation.error\";\n mutationKey?: readonly unknown[];\n tenant: string;\n error: unknown;\n durationMs: number;\n }\n // Auth refresh (SDK-side)\n | {\n type: \"auth.refresh\";\n kind: \"anonymous\" | \"customer\";\n tenant: string;\n success: boolean;\n }\n // Storage writes\n | {\n type: \"storage.write\";\n key: \"customerToken\" | \"cartId\" | \"siteCode\" | \"anonymousSession\" | \"activeLegalEntityId\" | \"refreshToken\";\n }\n // Active-company switch (B2B)\n | {\n type: \"company:switched\";\n from: string | null;\n to: string | null;\n durationMs: number;\n }\n // Consumer-emitted\n | { type: \"custom\"; name: string; props?: Record<string, unknown> };\n\n/** Internal: the React context carrying the emit function down the tree. */\nexport const EmporixTelemetryContext = createContext<{\n emit: (event: EmporixTelemetryEvent) => void;\n} | null>(null);\n\n/**\n * Hook to emit custom telemetry events through the same channel as SDK\n * events. Throws when used outside an {@link EmporixProvider}.\n *\n * When the provider has no `onTelemetry` callback configured, `emit` is a\n * no-op — calling it is safe and incurs no overhead.\n */\nexport function useEmporixTelemetry(): {\n emit: (event: EmporixTelemetryEvent) => void;\n} {\n const ctx = useContext(EmporixTelemetryContext);\n if (!ctx) {\n throw new Error(\"useEmporixTelemetry must be used within an EmporixProvider\");\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { auth, type EmporixClient, type LegalEntity } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"./storage\";\nimport { useEmporixTelemetry } from \"./telemetry\";\n\nexport type CompanyMode = \"b2c\" | \"b2b\" | \"unresolved\";\n\nexport interface CompanyContextValue {\n /** Active legal entity. `null` = B2C mode. */\n activeCompany: LegalEntity | null;\n /** All legal entities the customer is assigned to. */\n myCompanies: LegalEntity[];\n /**\n * `b2b` = a company is active; `b2c` = none active (and ≤1 available);\n * `unresolved` = multiple companies available, none picked yet — the\n * storefront must render a picker.\n */\n mode: CompanyMode;\n status: \"idle\" | \"loading\" | \"switching\" | \"error\";\n error: unknown;\n /**\n * Switch the active company. Eagerly calls\n * `client.customers.refresh({ legalEntityId })` so the customer token is\n * rescoped server-side, drops the cart id, then invalidates company-scoped\n * queries. Falls back to a local-state-only update when no refresh token\n * is in storage (e.g. fresh page load with memory storage).\n */\n setActiveCompany: (legalEntityId: string | null) => Promise<void>;\n refetchMyCompanies: () => Promise<void>;\n}\n\nconst NULL_CTX: CompanyContextValue = {\n activeCompany: null,\n myCompanies: [],\n mode: \"b2c\",\n status: \"idle\",\n error: null,\n setActiveCompany: async () => {\n throw new Error(\"CompanyContextProvider not mounted\");\n },\n refetchMyCompanies: async () => {},\n};\n\nexport const EmporixCompanyContext = createContext<CompanyContextValue>(NULL_CTX);\n\n/** Returns the active-company context. Safe outside the provider — returns idle B2C defaults. */\nexport function useActiveCompany(): CompanyContextValue {\n return useContext(EmporixCompanyContext);\n}\n\nexport interface CompanyContextProviderProps {\n client: EmporixClient;\n storage: EmporixStorage;\n initialActiveLegalEntityId?: string | null;\n children: ReactNode;\n}\n\nexport function CompanyContextProvider({\n client,\n storage,\n initialActiveLegalEntityId,\n children,\n}: CompanyContextProviderProps): React.JSX.Element {\n const qc = useQueryClient();\n const { emit } = useEmporixTelemetry();\n const [myCompanies, setMyCompanies] = useState<LegalEntity[]>([]);\n const [activeCompany, setActive] = useState<LegalEntity | null>(null);\n const [status, setStatus] = useState<CompanyContextValue[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>(null);\n // Ref so switchTo can capture the latest `activeCompany` for telemetry `from`.\n const activeRef = useRef<LegalEntity | null>(null);\n activeRef.current = activeCompany;\n\n /** Internal: eager refresh + storage write + state update. */\n const switchTo = useCallback(\n async (target: LegalEntity | null) => {\n const start = Date.now();\n const from = activeRef.current?.id ?? null;\n const refreshToken = storage.getRefreshToken();\n const token = storage.getCustomerToken();\n if (!refreshToken || !token) {\n // Local-state-only fallback — no rescope possible.\n setActive(target);\n storage.setActiveLegalEntityId(target?.id ?? null);\n } else {\n const next = await client.customers.refresh({\n refreshToken,\n ...(target ? { legalEntityId: target.id } : {}),\n });\n storage.setCustomerToken(next.customerToken);\n if (next.refreshToken) storage.setRefreshToken(next.refreshToken);\n storage.setCartId(null);\n storage.setActiveLegalEntityId(target?.id ?? null);\n setActive(target);\n qc.invalidateQueries({\n predicate: (q) =>\n Array.isArray(q.queryKey) &&\n q.queryKey.some(\n (k) =>\n k === \"cart\" ||\n k === \"companies\" ||\n k === \"customer\" ||\n k === from ||\n (target !== null && k === target.id),\n ),\n });\n }\n emit({\n type: \"company:switched\",\n from,\n to: target?.id ?? null,\n durationMs: Date.now() - start,\n });\n },\n [client, storage, qc, emit],\n );\n\n const load = useCallback(async () => {\n const token = storage.getCustomerToken();\n if (!token) {\n setMyCompanies([]);\n setActive(null);\n setStatus(\"idle\");\n return;\n }\n setStatus(\"loading\");\n try {\n const companies = await client.companies.listMine(auth.customer(token));\n setMyCompanies(companies);\n const persisted = initialActiveLegalEntityId ?? storage.getActiveLegalEntityId();\n const matched = persisted ? companies.find((c) => c.id === persisted) ?? null : null;\n if (matched) {\n setActive(matched);\n if (storage.getActiveLegalEntityId() !== matched.id) {\n storage.setActiveLegalEntityId(matched.id);\n }\n } else if (companies.length === 1) {\n await switchTo(companies[0] ?? null);\n } else {\n setActive(null);\n if (persisted && !matched) storage.setActiveLegalEntityId(null);\n }\n setStatus(\"idle\");\n } catch (e) {\n setError(e);\n setStatus(\"error\");\n }\n }, [client, storage, initialActiveLegalEntityId, switchTo]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n // Re-run bootstrap only on token-presence transitions (login/logout). A\n // mid-session token swap (e.g. switch-driven refresh) keeps prev/next both\n // truthy and is ignored — otherwise the auto-pick branch would clobber an\n // explicit B2C choice as soon as the new token is written.\n useEffect(() => {\n let prev = storage.getCustomerToken();\n return storage.subscribe?.((next) => {\n const becameAuth = !prev && next;\n const becameUnauth = prev && !next;\n prev = next;\n if (becameAuth || becameUnauth) void load();\n });\n }, [storage, load]);\n\n const setActiveCompany = useCallback(\n async (legalEntityId: string | null) => {\n setStatus(\"switching\");\n try {\n if (legalEntityId === null) {\n await switchTo(null);\n } else {\n const target = myCompanies.find((c) => c.id === legalEntityId) ?? null;\n if (!target) throw new Error(`setActiveCompany: unknown legalEntityId ${legalEntityId}`);\n await switchTo(target);\n }\n setStatus(\"idle\");\n } catch (e) {\n setError(e);\n setStatus(\"error\");\n throw e;\n }\n },\n [myCompanies, switchTo],\n );\n\n const value = useMemo<CompanyContextValue>(() => {\n const mode: CompanyMode = activeCompany\n ? \"b2b\"\n : myCompanies.length > 1\n ? \"unresolved\"\n : \"b2c\";\n return {\n activeCompany,\n myCompanies,\n mode,\n status,\n error,\n setActiveCompany,\n refetchMyCompanies: load,\n };\n }, [activeCompany, myCompanies, status, error, setActiveCompany, load]);\n\n return (\n <EmporixCompanyContext.Provider value={value}>{children}</EmporixCompanyContext.Provider>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { auth, type EmporixClient } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"./storage/index\";\nimport { createMemoryStorage } from \"./storage/memory\";\nimport { EmporixTelemetryContext, type EmporixTelemetryEvent } from \"./telemetry\";\nimport { CompanyContextProvider } from \"./company-context\";\n\ninterface EmporixContextValue {\n client: EmporixClient;\n storage: EmporixStorage;\n}\n\nexport interface SiteContextValue {\n siteCode: string | null;\n /** MS-4 populates this from the active site's DTO. */\n currency: string | null;\n /** MS-4 populates this from the active site's DTO. */\n targetLocation: string | null;\n /**\n * Asynchronous site switch. Updates local state + storage immediately\n * (optimistic), then PATCHes `/session-context/{tenant}/me/context` so\n * the server sees the same site on the next request. When no session\n * context exists yet (first visit, before any cart), the PATCH is\n * skipped — local state still flips.\n *\n * `isSwitching` is `true` while the PATCH is in flight. `switchError`\n * surfaces a PATCH failure; the optimistic state is NOT rolled back\n * (the cache was already invalidated, the UI already moved on).\n */\n setSite: (code: string | null) => Promise<void>;\n isSwitching: boolean;\n switchError: Error | null;\n}\n\nconst EmporixContext = createContext<EmporixContextValue | null>(null);\nexport const EmporixSiteContext = createContext<SiteContextValue | null>(null);\n\n/**\n * Balanced React-Query defaults applied to the provider's fallback QueryClient\n * (only when no `queryClient` prop is passed). Keeps the Emporix API-quota in\n * check by suppressing window-focus refetches and capping retries.\n */\nconst DEFAULT_QUERY_OPTIONS = {\n staleTime: 30_000,\n refetchOnWindowFocus: false,\n retry: 1,\n} as const;\n\n/** Props for {@link EmporixProvider}. */\nexport interface EmporixProviderProps {\n client: EmporixClient;\n queryClient?: QueryClient;\n storage?: EmporixStorage;\n initialCustomerToken?: string;\n /**\n * Initial site code. Resolution order: this prop → `storage.getSiteCode()` →\n * `client.config.credentials.storefront.context.siteCode` → `null`.\n */\n initialSiteCode?: string;\n /**\n * Initial active legal-entity id (B2B). When set, the CompanyContext\n * provider tries to match it against `companies.listMine()` once the\n * customer is loaded; mismatches are dropped silently.\n */\n initialActiveLegalEntityId?: string | null;\n /**\n * Opt-in telemetry callback. Receives a typed event stream covering cache\n * hit/miss, refetches, errors, mutations, auth refreshes, storage writes,\n * and consumer-emitted custom events. Wire this to Datadog/Sentry/custom\n * analytics. The handler is wrapped in try/catch — a throwing handler\n * never breaks the provider.\n */\n onTelemetry?: (event: EmporixTelemetryEvent) => void;\n /**\n * Opt in to reactive customer-token auto-refresh: on a `customer`-kind 401,\n * the SDK refreshes once (via the stored refresh token + anonymous auth) and\n * retries. Default: false (the customer token stays caller-owned).\n */\n autoRefreshCustomerToken?: boolean;\n /**\n * Called when a customer-token refresh is needed but fails (refresh token\n * expired/revoked) or no refresh token is stored. Use to drive logout /\n * redirect to login.\n */\n onCustomerSessionExpired?: () => void;\n children: ReactNode;\n}\n\n/** Provides the SDK client, token storage, react-query client, and site context to the tree. */\nexport function EmporixProvider({\n client,\n queryClient,\n storage,\n initialCustomerToken,\n initialSiteCode,\n initialActiveLegalEntityId,\n onTelemetry,\n autoRefreshCustomerToken,\n onCustomerSessionExpired,\n children,\n}: EmporixProviderProps): React.JSX.Element {\n const value = useMemo<EmporixContextValue>(() => {\n const s =\n storage ??\n createMemoryStorage(\n initialCustomerToken !== undefined ? { initial: initialCustomerToken } : {},\n );\n if (initialCustomerToken && storage && storage.getCustomerToken() === null) {\n storage.setCustomerToken(initialCustomerToken);\n }\n return { client, storage: s };\n \n }, [client, storage, initialCustomerToken]);\n const qc = useMemo(\n () =>\n queryClient ??\n new QueryClient({ defaultOptions: { queries: DEFAULT_QUERY_OPTIONS } }),\n [queryClient],\n );\n\n // Idempotent one-time wiring: attaches a storage-backed adapter to the SDK's\n // token provider so anonymous sessions survive reloads. Runs once per\n // (client, storage) pair via useState's lazy initializer.\n useState(() => {\n client.tokenProvider.attachAnonymousStore?.({\n read: () => value.storage.getAnonymousSession(),\n write: (s) => value.storage.setAnonymousSession(s),\n });\n return null;\n });\n\n // Telemetry: stable safeEmit + context value. emit is no-op when no\n // onTelemetry callback was provided (no overhead).\n const safeEmit = useCallback(\n (event: EmporixTelemetryEvent) => {\n if (!onTelemetry) return;\n try {\n onTelemetry(event);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[emporix] telemetry handler threw:\", err);\n }\n },\n [onTelemetry],\n );\n const telemetryValue = useMemo(() => ({ emit: safeEmit }), [safeEmit]);\n\n // Source subscriptions: cache + mutation cache + token-provider + storage.\n // All only active when onTelemetry is provided.\n useEffect(() => {\n if (!onTelemetry) return;\n const startedAt = new Map<string, number>();\n\n const unsubQuery = qc.getQueryCache().subscribe((event) => {\n const key = event.query.queryKey;\n if (!Array.isArray(key) || key[0] !== \"emporix\") return;\n if (event.type === \"updated\") {\n const action = event.action as { type: string };\n if (action.type === \"fetch\") {\n const isRefetch = event.query.state.dataUpdateCount > 0;\n if (isRefetch) {\n safeEmit({\n type: \"query.refetch\",\n queryKey: key,\n tenant: client.tenant,\n reason: \"invalidate\",\n });\n }\n startedAt.set(event.query.queryHash, Date.now());\n } else if (action.type === \"success\") {\n const start = startedAt.get(event.query.queryHash);\n startedAt.delete(event.query.queryHash);\n safeEmit({\n type: \"cache.miss\",\n queryKey: key,\n tenant: client.tenant,\n durationMs: start ? Date.now() - start : 0,\n });\n } else if (action.type === \"error\") {\n startedAt.delete(event.query.queryHash);\n safeEmit({\n type: \"query.error\",\n queryKey: key,\n tenant: client.tenant,\n error: event.query.state.error,\n });\n }\n } else if (event.type === \"observerResultsUpdated\") {\n const s = event.query.state;\n if (s.status === \"success\" && s.fetchStatus === \"idle\" && s.dataUpdateCount > 0) {\n safeEmit({ type: \"cache.hit\", queryKey: key, tenant: client.tenant });\n }\n }\n });\n\n const unsubMut = qc.getMutationCache().subscribe((event) => {\n if (event.type !== \"updated\") return;\n const m = event.mutation;\n const dur = Date.now() - (m.state.submittedAt ?? Date.now());\n const mk = m.options.mutationKey;\n if (m.state.status === \"success\") {\n safeEmit({\n type: \"mutation.success\",\n ...(mk ? { mutationKey: mk as readonly unknown[] } : {}),\n tenant: client.tenant,\n durationMs: dur,\n });\n } else if (m.state.status === \"error\") {\n safeEmit({\n type: \"mutation.error\",\n ...(mk ? { mutationKey: mk as readonly unknown[] } : {}),\n tenant: client.tenant,\n error: m.state.error,\n durationMs: dur,\n });\n }\n });\n\n const unsubAuth = client.tokenProvider.onRefresh?.((evt) =>\n safeEmit({ type: \"auth.refresh\", ...evt, tenant: client.tenant }),\n );\n\n const unsubStorage = value.storage.subscribeAll?.((key) =>\n safeEmit({ type: \"storage.write\", key }),\n );\n\n return () => {\n unsubQuery();\n unsubMut();\n unsubAuth?.();\n unsubStorage?.();\n };\n }, [qc, onTelemetry, client, value.storage, safeEmit]);\n\n // Opt-in reactive customer-token auto-refresh. Registered on the client so\n // the core HttpClient can refresh-and-retry a customer 401. Single-flight is\n // handled in the core registry. Off unless `autoRefreshCustomerToken`.\n useEffect(() => {\n if (!autoRefreshCustomerToken) return;\n const storage = value.storage;\n client.setCustomerTokenRefresher({\n refresh: async () => {\n const refreshToken = storage.getRefreshToken();\n if (!refreshToken) {\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: false, tenant: client.tenant });\n onCustomerSessionExpired?.();\n return null;\n }\n try {\n const legalEntityId = storage.getActiveLegalEntityId() ?? undefined;\n const s = await client.customers.refresh({\n refreshToken,\n ...(legalEntityId ? { legalEntityId } : {}),\n });\n storage.setCustomerToken(s.customerToken);\n if (s.refreshToken) storage.setRefreshToken(s.refreshToken);\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: true, tenant: client.tenant });\n return s.customerToken;\n } catch {\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: false, tenant: client.tenant });\n onCustomerSessionExpired?.();\n return null;\n }\n },\n });\n return () => client.setCustomerTokenRefresher(null);\n }, [autoRefreshCustomerToken, client, value.storage, safeEmit, onCustomerSessionExpired]);\n\n return (\n <EmporixContext.Provider value={value}>\n <EmporixTelemetryContext.Provider value={telemetryValue}>\n <QueryClientProvider client={qc}>\n <SiteContextProvider\n client={client}\n storage={value.storage}\n {...(initialSiteCode !== undefined ? { initialSiteCode } : {})}\n >\n <CompanyContextProvider\n client={client}\n storage={value.storage}\n {...(initialActiveLegalEntityId !== undefined\n ? { initialActiveLegalEntityId }\n : {})}\n >\n {children}\n </CompanyContextProvider>\n </SiteContextProvider>\n </QueryClientProvider>\n </EmporixTelemetryContext.Provider>\n </EmporixContext.Provider>\n );\n}\n\n/**\n * Manages the active-site state. Sits inside `QueryClientProvider` so\n * `setSite` can invalidate the React-Query cache on switch.\n */\nfunction SiteContextProvider({\n client,\n storage,\n initialSiteCode,\n children,\n}: {\n client: EmporixClient;\n storage: EmporixStorage;\n initialSiteCode?: string;\n children: ReactNode;\n}): React.JSX.Element {\n const qc = useQueryClient();\n const [siteCode, setSiteCodeState] = useState<string | null>(() => {\n if (initialSiteCode !== undefined) return initialSiteCode;\n const fromStorage = storage.getSiteCode();\n if (fromStorage !== null) return fromStorage;\n return client.config?.credentials?.storefront?.context?.siteCode ?? null;\n });\n const [currency, setCurrency] = useState<string | null>(null);\n const [targetLocation, setTargetLocation] = useState<string | null>(null);\n const [isSwitching, setIsSwitching] = useState(false);\n const [switchError, setSwitchError] = useState<Error | null>(null);\n\n // Mount-time derivation: if a siteCode is already resolved, fetch its DTO\n // once so currency + targetLocation populate without a user-driven switch.\n useEffect(() => {\n if (!siteCode || currency !== null) return;\n let cancelled = false;\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"site-by-code\",\n siteCode,\n { tenant: client.tenant, authKind: authCtx.kind },\n ],\n queryFn: () => client.sites.get(siteCode, authCtx),\n staleTime: 5 * 60_000,\n })\n .then((site) => {\n if (cancelled) return;\n setCurrency(site.currency);\n setTargetLocation(site.homeBase?.address?.country ?? null);\n })\n .catch(() => {\n // Best-effort — silent. setSite-driven derivation surfaces real errors.\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [siteCode]);\n\n const setSite = useCallback(\n async (code: string | null) => {\n // 1) Optimistic flip — UI moves immediately.\n storage.setSiteCode(code);\n storage.setCartId(null);\n setSiteCodeState(code);\n setSwitchError(null);\n void qc.invalidateQueries({ queryKey: [\"emporix\"] });\n\n if (code === null) {\n setCurrency(null);\n setTargetLocation(null);\n return;\n }\n\n setIsSwitching(true);\n try {\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n // 2) Derive currency + targetLocation from the site DTO (cached 5min).\n const site = await qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"site-by-code\",\n code,\n { tenant: client.tenant, authKind: authCtx.kind },\n ],\n queryFn: () => client.sites.get(code, authCtx),\n staleTime: 5 * 60_000,\n });\n const nextCurrency = site.currency;\n const nextTarget = site.homeBase?.address?.country ?? null;\n setCurrency(nextCurrency);\n setTargetLocation(nextTarget);\n // 3) Push everything into the session-context PATCH.\n await client.sessionContext.patch(\n {\n siteCode: code,\n ...(nextCurrency ? { currency: nextCurrency } : {}),\n ...(nextTarget ? { targetLocation: nextTarget } : {}),\n },\n authCtx,\n );\n } catch (e) {\n setSwitchError(e instanceof Error ? e : new Error(String(e)));\n } finally {\n setIsSwitching(false);\n }\n },\n [client, storage, qc],\n );\n\n const value = useMemo<SiteContextValue>(\n () => ({\n siteCode,\n currency,\n targetLocation,\n setSite,\n isSwitching,\n switchError,\n }),\n [siteCode, currency, targetLocation, setSite, isSwitching, switchError],\n );\n\n return <EmporixSiteContext.Provider value={value}>{children}</EmporixSiteContext.Provider>;\n}\n\n/** Returns the SDK client and token storage. Throws outside an {@link EmporixProvider}. */\nexport function useEmporix(): EmporixContextValue {\n const ctx = useContext(EmporixContext);\n if (!ctx) throw new Error(\"useEmporix must be used within an EmporixProvider\");\n return ctx;\n}\n","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 { useCallback, useContext, useEffect, useState } 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\";\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`).\n */\ninterface SessionState {\n token: string | null;\n refreshToken: string | null;\n saasToken: string | null;\n}\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 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. `token` is mirrored from storage at mount,\n // `refreshToken` and `saasToken` are in-session only (not persisted).\n const [session, setSession] = useState<SessionState>(() => ({\n token: storage.getCustomerToken(),\n refreshToken: null,\n saasToken: null,\n }));\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]);\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 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],\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 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],\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 setSession(EMPTY_SESSION);\n qc.removeQueries({ queryKey: [\"emporix\", \"customer\"] });\n qc.removeQueries({ queryKey: [\"emporix\", \"cart\"] });\n }, [client, session.token, storage, qc]);\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]);\n\n return {\n customerToken: session.token,\n refreshToken: session.refreshToken,\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` from the EmporixProvider's site\n * context. Used by site-aware Read-Hooks to compose their query keys.\n *\n * Returns `null` when no site context is mounted — hooks use `null` in the\n * query key so cache entries are deterministic.\n */\nexport function useReadSite(): { siteCode: string | null } {\n const ctx = useContext(EmporixSiteContext);\n return { siteCode: ctx?.siteCode ?? 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 },\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 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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product\", [productId], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: emporixKey(\"products-infinite\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-by-code\", [code], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-search\", [query, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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/**\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products-by-codes\", [codes, options.chunkSize], {\n tenant: client.tenant,\n authKind: ctx.kind,\n siteCode,\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"shopping-lists\", [opts.name ?? null], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\n \"variant-children\",\n [parentVariantId, { pageSize: options.pageSize }],\n { tenant: client.tenant, authKind: ctx.kind, siteCode },\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"category\", [categoryId], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"subcategories\", [categoryId ?? null, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"categories\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useEmporixInfinite<Category>({\n queryKey: emporixKey(\"categories-infinite\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"category-tree\", [], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products-in-category\", [categoryId, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: emporixKey(\"products-in-category-infinite\", [categoryId, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = 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 },\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 }>;\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 } = 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 },\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) qc.setQueryData(c.key, cart);\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) => client.carts.updateItem(id, v.itemId, v.patch, ctx)),\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 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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"list\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"items\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"categoryTree\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"myProducts\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: [\n \"emporix\",\n \"segment\",\n \"myProductsInfinite\",\n { tenant: client.tenant, query, siteCode },\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"myCategories\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useEmporixInfinite<Category>({\n queryKey: [\n \"emporix\",\n \"segment\",\n \"myCategoriesInfinite\",\n { tenant: client.tenant, query, siteCode },\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 { 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\";\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","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 { 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} 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: 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: 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: 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","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 { 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 } = 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 },\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 } = 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 },\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\";\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 return useQuery({\n queryKey: emporixKey(\"orders\", [orderId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\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 if (order.items.length === 0) return { added: 0, errors: [] };\n\n const batchBody = order.items.map((item) => ({\n product: { id: item.productId },\n quantity: item.quantity,\n })) as never;\n const res = await client.carts.addItemsBatch(cartId, batchBody, 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\";\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 return useQuery({\n queryKey: emporixKey(\"salesorders\", [orderId ?? null], {\n tenant: client.tenant,\n authKind: authCtx?.kind ?? \"anonymous\",\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 { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { EmporixError, EmporixAuthError } from \"@viu/emporix-sdk\";\n\ninterface Props {\n children: ReactNode;\n fallback: ReactNode;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\ninterface State {\n error: Error | null;\n}\n\n/** Catches render errors (including thrown {@link EmporixError}) and shows a fallback. */\nexport class EmporixErrorBoundary extends Component<Props, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n render(): ReactNode {\n if (this.state.error) return this.props.fallback;\n return this.props.children;\n }\n}\n\n/** Returns a handler that runs `onAuthError` for {@link EmporixAuthError}, else `onError`. */\nexport function useEmporixErrorHandler(handlers: {\n onAuthError?: (e: EmporixAuthError) => void;\n onError?: (e: EmporixError) => void;\n}): (error: unknown) => void {\n return (error: unknown) => {\n if (error instanceof EmporixAuthError) handlers.onAuthError?.(error);\n else if (error instanceof EmporixError) handlers.onError?.(error);\n };\n}\n","import type { QueryClient } from \"@tanstack/react-query\";\nimport { auth, type AuthContext, type EmporixClient } from \"@viu/emporix-sdk\";\n\n/**\n * Server-side prefetch of a product into a {@link QueryClient}, using the same\n * query key shape as `useProduct` so client hydration is a cache hit.\n * Create the `EmporixClient` once per server, never per request.\n */\nexport async function prefetchProduct(\n qc: QueryClient,\n client: EmporixClient,\n productId: string,\n authCtx: AuthContext = auth.anonymous(),\n): Promise<void> {\n await qc.prefetchQuery({\n queryKey: [\"emporix\", \"product\", productId, { tenant: client.tenant, authKind: authCtx.kind }],\n queryFn: () => client.products.get(productId, undefined, authCtx),\n });\n}\n\n/**\n * Server-side prefetch of a cart. Pass the customer/anonymous context resolved\n * from the request (e.g. a token read from an httpOnly cookie).\n */\nexport async function prefetchCart(\n qc: QueryClient,\n client: EmporixClient,\n cartId: string,\n authCtx: AuthContext,\n): Promise<void> {\n await qc.prefetchQuery({\n queryKey: [\"emporix\", \"cart\", cartId, { tenant: client.tenant, authKind: authCtx.kind }],\n queryFn: () => client.carts.get(cartId, authCtx),\n });\n}\n\n/**\n * Server-side prefetch of a single customer order. Writes the same cache key\n * `useOrder(orderId)` reads, so client hydration is a cache hit.\n */\nexport async function prefetchOrder(\n qc: QueryClient,\n client: EmporixClient,\n orderId: string,\n authCtx: AuthContext,\n opts: { saasToken?: string } = {},\n): Promise<void> {\n await qc.prefetchQuery({\n queryKey: [\"emporix\", \"orders\", orderId, { tenant: client.tenant, authKind: authCtx.kind }],\n queryFn: () =>\n client.orders.get(orderId, authCtx, opts.saasToken ? { saasToken: opts.saasToken } : {}),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/local-storage.ts","../src/storage/cookie.ts","../src/storage/index.ts","../src/storage/memory.ts","../src/telemetry.ts","../src/company-context.tsx","../src/provider.tsx","../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-sites.ts","../src/hooks/use-site-context.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-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/errors.tsx","../src/ssr.ts"],"names":["createContext","useContext","useQueryClient","useState","useRef","useCallback","auth","useEffect","useMemo","jsx","QueryClient","storage","QueryClientProvider","useSyncExternalStore","useQuery","useInfiniteQuery","useMutation","EmporixError","PRICES_STALE_TIME","AVAILABILITY_STALE_TIME","INVALIDATE_KEY","STALE","Component","EmporixAuthError"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_KEY = \"emporix.customerToken\";\nconst CART_KEY = \"emporix.cartId\";\nconst ANON_KEY = \"emporix.anonymousSession\";\nconst SITE_KEY = \"emporix.siteCode\";\nconst ACTIVE_LE_KEY = \"emporix.activeLegalEntityId\";\nconst REFRESH_KEY = \"emporix.refreshToken\";\n\n/** Browser `localStorage`-backed store. Falls back to memory on the server. */\nexport function createLocalStorageStorage(opts: { key?: string } = {}): EmporixStorage {\n const tokenKey = opts.key ?? DEFAULT_TOKEN_KEY;\n const available =\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { localStorage?: Storage }).localStorage !== \"undefined\";\n if (!available) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n const ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => ls.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) ls.removeItem(tokenKey);\n else ls.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => ls.getItem(CART_KEY),\n setCartId: (id) => {\n if (id === null) ls.removeItem(CART_KEY);\n else ls.setItem(CART_KEY, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(ls.getItem(ANON_KEY)),\n setAnonymousSession: (s) => {\n if (s === null) ls.removeItem(ANON_KEY);\n else ls.setItem(ANON_KEY, JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }));\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => ls.getItem(SITE_KEY),\n setSiteCode: (code) => {\n if (code === null) ls.removeItem(SITE_KEY);\n else ls.setItem(SITE_KEY, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => ls.getItem(ACTIVE_LE_KEY),\n setActiveLegalEntityId: (id) => {\n if (id === null) ls.removeItem(ACTIVE_LE_KEY);\n else ls.setItem(ACTIVE_LE_KEY, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => ls.getItem(REFRESH_KEY),\n setRefreshToken: (t) => {\n if (t === null) ls.removeItem(REFRESH_KEY);\n else ls.setItem(REFRESH_KEY, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import {\n createListenerSet,\n parseAnonymousSession,\n type EmporixStorage,\n type EmporixStorageKey,\n} from \"./index\";\nimport { createMemoryStorage } from \"./memory\";\n\nconst DEFAULT_TOKEN_NAME = \"emporix.customerToken\";\nconst CART_NAME = \"emporix.cartId\";\nconst ANON_NAME = \"emporix.anonymousSession\";\nconst SITE_NAME = \"emporix.siteCode\";\nconst ACTIVE_LE_NAME = \"emporix.activeLegalEntityId\";\nconst REFRESH_NAME = \"emporix.refreshToken\";\n\n/** Cookie-backed store. Consumer must set SameSite/Secure for CSRF safety. */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const tokenName = opts.name ?? DEFAULT_TOKEN_NAME;\n const sameSite = opts.sameSite ?? \"lax\";\n const secure = opts.secure ?? false;\n if (typeof document === \"undefined\") {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const readCookie = (name: string): string | null => {\n for (const part of document.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n };\n const writeCookie = (name: string, value: string | null): void => {\n document.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n };\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => readCookie(tokenName),\n setCustomerToken: (t) => {\n writeCookie(tokenName, t);\n all.notify(\"customerToken\");\n },\n getCartId: () => readCookie(CART_NAME),\n setCartId: (id) => {\n writeCookie(CART_NAME, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => parseAnonymousSession(readCookie(ANON_NAME)),\n setAnonymousSession: (s) => {\n writeCookie(\n ANON_NAME,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => readCookie(SITE_NAME),\n setSiteCode: (code) => {\n writeCookie(SITE_NAME, code);\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => readCookie(ACTIVE_LE_NAME),\n setActiveLegalEntityId: (id) => {\n writeCookie(ACTIVE_LE_NAME, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => readCookie(REFRESH_NAME),\n setRefreshToken: (t) => {\n writeCookie(REFRESH_NAME, t);\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(\n listener: (key: EmporixStorageKey) => void,\n ): () => void;\n}\n\n/** Minimal subset of `AnonymousSession` that needs to outlive a page load. */\nexport interface PersistedAnonymousSession {\n refreshToken: string;\n sessionId: string;\n}\n\n/** Backward-compat alias. New code should prefer `EmporixStorage`. */\nexport type TokenStorage = EmporixStorage;\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\";\n\n/**\n * Internal: create a swallow-on-throw listener set used by all three storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/**\n * Internal: parses a raw `anonymousSession` JSON payload (from localStorage\n * or a cookie) into a {@link PersistedAnonymousSession}. Returns `null` for\n * any malformed or missing input.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n if (typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\") {\n return { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport { createMemoryStorage } from \"./memory\";\nexport { createLocalStorageStorage } from \"./local-storage\";\nexport { createCookieStorage } from \"./cookie\";\n","import {\n createListenerSet,\n type EmporixStorage,\n type EmporixStorageKey,\n type PersistedAnonymousSession,\n} from \"./index\";\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n","import { createContext, useContext } from \"react\";\n\n/**\n * All telemetry events emitted through the EmporixProvider's `onTelemetry`\n * callback. Discriminated by `type` — exhaustive switch is type-safe.\n *\n * Consumers can emit their own `{ type: \"custom\" }` events via\n * {@link useEmporixTelemetry}. Namespace `name` with an app-specific\n * prefix (e.g. `\"app.checkout-cta-click\"`) to avoid collisions with\n * future SDK event types.\n */\nexport type EmporixTelemetryEvent =\n // Cache lifecycle (React-Query QueryCache)\n | { type: \"cache.hit\"; queryKey: readonly unknown[]; tenant: string }\n | {\n type: \"cache.miss\";\n queryKey: readonly unknown[];\n tenant: string;\n durationMs: number;\n }\n | {\n type: \"query.refetch\";\n queryKey: readonly unknown[];\n tenant: string;\n reason: \"invalidate\" | \"focus\" | \"stale\";\n }\n | {\n type: \"query.error\";\n queryKey: readonly unknown[];\n tenant: string;\n error: unknown;\n }\n // Mutation lifecycle\n | {\n type: \"mutation.success\";\n mutationKey?: readonly unknown[];\n tenant: string;\n durationMs: number;\n }\n | {\n type: \"mutation.error\";\n mutationKey?: readonly unknown[];\n tenant: string;\n error: unknown;\n durationMs: number;\n }\n // Auth refresh (SDK-side)\n | {\n type: \"auth.refresh\";\n kind: \"anonymous\" | \"customer\";\n tenant: string;\n success: boolean;\n }\n // Storage writes\n | {\n type: \"storage.write\";\n key: \"customerToken\" | \"cartId\" | \"siteCode\" | \"anonymousSession\" | \"activeLegalEntityId\" | \"refreshToken\";\n }\n // Active-company switch (B2B)\n | {\n type: \"company:switched\";\n from: string | null;\n to: string | null;\n durationMs: number;\n }\n // Consumer-emitted\n | { type: \"custom\"; name: string; props?: Record<string, unknown> };\n\n/** Internal: the React context carrying the emit function down the tree. */\nexport const EmporixTelemetryContext = createContext<{\n emit: (event: EmporixTelemetryEvent) => void;\n} | null>(null);\n\n/**\n * Hook to emit custom telemetry events through the same channel as SDK\n * events. Throws when used outside an {@link EmporixProvider}.\n *\n * When the provider has no `onTelemetry` callback configured, `emit` is a\n * no-op — calling it is safe and incurs no overhead.\n */\nexport function useEmporixTelemetry(): {\n emit: (event: EmporixTelemetryEvent) => void;\n} {\n const ctx = useContext(EmporixTelemetryContext);\n if (!ctx) {\n throw new Error(\"useEmporixTelemetry must be used within an EmporixProvider\");\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { auth, type EmporixClient, type LegalEntity } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"./storage\";\nimport { useEmporixTelemetry } from \"./telemetry\";\n\nexport type CompanyMode = \"b2c\" | \"b2b\" | \"unresolved\";\n\nexport interface CompanyContextValue {\n /** Active legal entity. `null` = B2C mode. */\n activeCompany: LegalEntity | null;\n /** All legal entities the customer is assigned to. */\n myCompanies: LegalEntity[];\n /**\n * `b2b` = a company is active; `b2c` = none active (and ≤1 available);\n * `unresolved` = multiple companies available, none picked yet — the\n * storefront must render a picker.\n */\n mode: CompanyMode;\n status: \"idle\" | \"loading\" | \"switching\" | \"error\";\n error: unknown;\n /**\n * Switch the active company. Eagerly calls\n * `client.customers.refresh({ legalEntityId })` so the customer token is\n * rescoped server-side, drops the cart id, then invalidates company-scoped\n * queries. Falls back to a local-state-only update when no refresh token\n * is in storage (e.g. fresh page load with memory storage).\n */\n setActiveCompany: (legalEntityId: string | null) => Promise<void>;\n refetchMyCompanies: () => Promise<void>;\n}\n\nconst NULL_CTX: CompanyContextValue = {\n activeCompany: null,\n myCompanies: [],\n mode: \"b2c\",\n status: \"idle\",\n error: null,\n setActiveCompany: async () => {\n throw new Error(\"CompanyContextProvider not mounted\");\n },\n refetchMyCompanies: async () => {},\n};\n\nexport const EmporixCompanyContext = createContext<CompanyContextValue>(NULL_CTX);\n\n/** Returns the active-company context. Safe outside the provider — returns idle B2C defaults. */\nexport function useActiveCompany(): CompanyContextValue {\n return useContext(EmporixCompanyContext);\n}\n\nexport interface CompanyContextProviderProps {\n client: EmporixClient;\n storage: EmporixStorage;\n initialActiveLegalEntityId?: string | null;\n children: ReactNode;\n}\n\nexport function CompanyContextProvider({\n client,\n storage,\n initialActiveLegalEntityId,\n children,\n}: CompanyContextProviderProps): React.JSX.Element {\n const qc = useQueryClient();\n const { emit } = useEmporixTelemetry();\n const [myCompanies, setMyCompanies] = useState<LegalEntity[]>([]);\n const [activeCompany, setActive] = useState<LegalEntity | null>(null);\n const [status, setStatus] = useState<CompanyContextValue[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>(null);\n // Ref so switchTo can capture the latest `activeCompany` for telemetry `from`.\n const activeRef = useRef<LegalEntity | null>(null);\n activeRef.current = activeCompany;\n\n /** Internal: eager refresh + storage write + state update. */\n const switchTo = useCallback(\n async (target: LegalEntity | null) => {\n const start = Date.now();\n const from = activeRef.current?.id ?? null;\n const refreshToken = storage.getRefreshToken();\n const token = storage.getCustomerToken();\n if (!refreshToken || !token) {\n // Local-state-only fallback — no rescope possible.\n setActive(target);\n storage.setActiveLegalEntityId(target?.id ?? null);\n } else {\n const next = await client.customers.refresh({\n refreshToken,\n ...(target ? { legalEntityId: target.id } : {}),\n });\n storage.setCustomerToken(next.customerToken);\n if (next.refreshToken) storage.setRefreshToken(next.refreshToken);\n storage.setCartId(null);\n storage.setActiveLegalEntityId(target?.id ?? null);\n setActive(target);\n qc.invalidateQueries({\n predicate: (q) =>\n Array.isArray(q.queryKey) &&\n q.queryKey.some(\n (k) =>\n k === \"cart\" ||\n k === \"companies\" ||\n k === \"customer\" ||\n k === from ||\n (target !== null && k === target.id),\n ),\n });\n }\n emit({\n type: \"company:switched\",\n from,\n to: target?.id ?? null,\n durationMs: Date.now() - start,\n });\n },\n [client, storage, qc, emit],\n );\n\n const load = useCallback(async () => {\n const token = storage.getCustomerToken();\n if (!token) {\n setMyCompanies([]);\n setActive(null);\n setStatus(\"idle\");\n return;\n }\n setStatus(\"loading\");\n try {\n const companies = await client.companies.listMine(auth.customer(token));\n setMyCompanies(companies);\n const persisted = initialActiveLegalEntityId ?? storage.getActiveLegalEntityId();\n const matched = persisted ? companies.find((c) => c.id === persisted) ?? null : null;\n if (matched) {\n setActive(matched);\n if (storage.getActiveLegalEntityId() !== matched.id) {\n storage.setActiveLegalEntityId(matched.id);\n }\n } else if (companies.length === 1) {\n await switchTo(companies[0] ?? null);\n } else {\n setActive(null);\n if (persisted && !matched) storage.setActiveLegalEntityId(null);\n }\n setStatus(\"idle\");\n } catch (e) {\n setError(e);\n setStatus(\"error\");\n }\n }, [client, storage, initialActiveLegalEntityId, switchTo]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n // Re-run bootstrap only on token-presence transitions (login/logout). A\n // mid-session token swap (e.g. switch-driven refresh) keeps prev/next both\n // truthy and is ignored — otherwise the auto-pick branch would clobber an\n // explicit B2C choice as soon as the new token is written.\n useEffect(() => {\n let prev = storage.getCustomerToken();\n return storage.subscribe?.((next) => {\n const becameAuth = !prev && next;\n const becameUnauth = prev && !next;\n prev = next;\n if (becameAuth || becameUnauth) void load();\n });\n }, [storage, load]);\n\n const setActiveCompany = useCallback(\n async (legalEntityId: string | null) => {\n setStatus(\"switching\");\n try {\n if (legalEntityId === null) {\n await switchTo(null);\n } else {\n const target = myCompanies.find((c) => c.id === legalEntityId) ?? null;\n if (!target) throw new Error(`setActiveCompany: unknown legalEntityId ${legalEntityId}`);\n await switchTo(target);\n }\n setStatus(\"idle\");\n } catch (e) {\n setError(e);\n setStatus(\"error\");\n throw e;\n }\n },\n [myCompanies, switchTo],\n );\n\n const value = useMemo<CompanyContextValue>(() => {\n const mode: CompanyMode = activeCompany\n ? \"b2b\"\n : myCompanies.length > 1\n ? \"unresolved\"\n : \"b2c\";\n return {\n activeCompany,\n myCompanies,\n mode,\n status,\n error,\n setActiveCompany,\n refetchMyCompanies: load,\n };\n }, [activeCompany, myCompanies, status, error, setActiveCompany, load]);\n\n return (\n <EmporixCompanyContext.Provider value={value}>{children}</EmporixCompanyContext.Provider>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { auth, type EmporixClient } from \"@viu/emporix-sdk\";\nimport type { EmporixStorage } from \"./storage/index\";\nimport { createMemoryStorage } from \"./storage/memory\";\nimport { EmporixTelemetryContext, type EmporixTelemetryEvent } from \"./telemetry\";\nimport { CompanyContextProvider } from \"./company-context\";\n\ninterface EmporixContextValue {\n client: EmporixClient;\n storage: EmporixStorage;\n}\n\nexport interface SiteContextValue {\n siteCode: string | null;\n /** MS-4 populates this from the active site's DTO. */\n currency: string | null;\n /** MS-4 populates this from the active site's DTO. */\n targetLocation: string | null;\n /**\n * Asynchronous site switch. Updates local state + storage immediately\n * (optimistic), then PATCHes `/session-context/{tenant}/me/context` so\n * the server sees the same site on the next request. When no session\n * context exists yet (first visit, before any cart), the PATCH is\n * skipped — local state still flips.\n *\n * `isSwitching` is `true` while the PATCH is in flight. `switchError`\n * surfaces a PATCH failure; the optimistic state is NOT rolled back\n * (the cache was already invalidated, the UI already moved on).\n */\n setSite: (code: string | null) => Promise<void>;\n isSwitching: boolean;\n switchError: Error | null;\n}\n\nconst EmporixContext = createContext<EmporixContextValue | null>(null);\nexport const EmporixSiteContext = createContext<SiteContextValue | null>(null);\n\n/**\n * Balanced React-Query defaults applied to the provider's fallback QueryClient\n * (only when no `queryClient` prop is passed). Keeps the Emporix API-quota in\n * check by suppressing window-focus refetches and capping retries.\n */\nconst DEFAULT_QUERY_OPTIONS = {\n staleTime: 30_000,\n refetchOnWindowFocus: false,\n retry: 1,\n} as const;\n\n/** Props for {@link EmporixProvider}. */\nexport interface EmporixProviderProps {\n client: EmporixClient;\n queryClient?: QueryClient;\n storage?: EmporixStorage;\n initialCustomerToken?: string;\n /**\n * Initial site code. Resolution order: this prop → `storage.getSiteCode()` →\n * `client.config.credentials.storefront.context.siteCode` → `null`.\n */\n initialSiteCode?: string;\n /**\n * Initial active legal-entity id (B2B). When set, the CompanyContext\n * provider tries to match it against `companies.listMine()` once the\n * customer is loaded; mismatches are dropped silently.\n */\n initialActiveLegalEntityId?: string | null;\n /**\n * Opt-in telemetry callback. Receives a typed event stream covering cache\n * hit/miss, refetches, errors, mutations, auth refreshes, storage writes,\n * and consumer-emitted custom events. Wire this to Datadog/Sentry/custom\n * analytics. The handler is wrapped in try/catch — a throwing handler\n * never breaks the provider.\n */\n onTelemetry?: (event: EmporixTelemetryEvent) => void;\n /**\n * Opt in to reactive customer-token auto-refresh: on a `customer`-kind 401,\n * the SDK refreshes once (via the stored refresh token + anonymous auth) and\n * retries. Default: false (the customer token stays caller-owned).\n */\n autoRefreshCustomerToken?: boolean;\n /**\n * Called when a customer-token refresh is needed but fails (refresh token\n * expired/revoked) or no refresh token is stored. Use to drive logout /\n * redirect to login.\n */\n onCustomerSessionExpired?: () => void;\n children: ReactNode;\n}\n\n/** Provides the SDK client, token storage, react-query client, and site context to the tree. */\nexport function EmporixProvider({\n client,\n queryClient,\n storage,\n initialCustomerToken,\n initialSiteCode,\n initialActiveLegalEntityId,\n onTelemetry,\n autoRefreshCustomerToken,\n onCustomerSessionExpired,\n children,\n}: EmporixProviderProps): React.JSX.Element {\n const value = useMemo<EmporixContextValue>(() => {\n const s =\n storage ??\n createMemoryStorage(\n initialCustomerToken !== undefined ? { initial: initialCustomerToken } : {},\n );\n if (initialCustomerToken && storage && storage.getCustomerToken() === null) {\n storage.setCustomerToken(initialCustomerToken);\n }\n return { client, storage: s };\n \n }, [client, storage, initialCustomerToken]);\n const qc = useMemo(\n () =>\n queryClient ??\n new QueryClient({ defaultOptions: { queries: DEFAULT_QUERY_OPTIONS } }),\n [queryClient],\n );\n\n // Idempotent one-time wiring: attaches a storage-backed adapter to the SDK's\n // token provider so anonymous sessions survive reloads. Runs once per\n // (client, storage) pair via useState's lazy initializer.\n useState(() => {\n client.tokenProvider.attachAnonymousStore?.({\n read: () => value.storage.getAnonymousSession(),\n write: (s) => value.storage.setAnonymousSession(s),\n });\n return null;\n });\n\n // Telemetry: stable safeEmit + context value. emit is no-op when no\n // onTelemetry callback was provided (no overhead).\n const safeEmit = useCallback(\n (event: EmporixTelemetryEvent) => {\n if (!onTelemetry) return;\n try {\n onTelemetry(event);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[emporix] telemetry handler threw:\", err);\n }\n },\n [onTelemetry],\n );\n const telemetryValue = useMemo(() => ({ emit: safeEmit }), [safeEmit]);\n\n // Source subscriptions: cache + mutation cache + token-provider + storage.\n // All only active when onTelemetry is provided.\n useEffect(() => {\n if (!onTelemetry) return;\n const startedAt = new Map<string, number>();\n\n const unsubQuery = qc.getQueryCache().subscribe((event) => {\n const key = event.query.queryKey;\n if (!Array.isArray(key) || key[0] !== \"emporix\") return;\n if (event.type === \"updated\") {\n const action = event.action as { type: string };\n if (action.type === \"fetch\") {\n const isRefetch = event.query.state.dataUpdateCount > 0;\n if (isRefetch) {\n safeEmit({\n type: \"query.refetch\",\n queryKey: key,\n tenant: client.tenant,\n reason: \"invalidate\",\n });\n }\n startedAt.set(event.query.queryHash, Date.now());\n } else if (action.type === \"success\") {\n const start = startedAt.get(event.query.queryHash);\n startedAt.delete(event.query.queryHash);\n safeEmit({\n type: \"cache.miss\",\n queryKey: key,\n tenant: client.tenant,\n durationMs: start ? Date.now() - start : 0,\n });\n } else if (action.type === \"error\") {\n startedAt.delete(event.query.queryHash);\n safeEmit({\n type: \"query.error\",\n queryKey: key,\n tenant: client.tenant,\n error: event.query.state.error,\n });\n }\n } else if (event.type === \"observerResultsUpdated\") {\n const s = event.query.state;\n if (s.status === \"success\" && s.fetchStatus === \"idle\" && s.dataUpdateCount > 0) {\n safeEmit({ type: \"cache.hit\", queryKey: key, tenant: client.tenant });\n }\n }\n });\n\n const unsubMut = qc.getMutationCache().subscribe((event) => {\n if (event.type !== \"updated\") return;\n const m = event.mutation;\n const dur = Date.now() - (m.state.submittedAt ?? Date.now());\n const mk = m.options.mutationKey;\n if (m.state.status === \"success\") {\n safeEmit({\n type: \"mutation.success\",\n ...(mk ? { mutationKey: mk as readonly unknown[] } : {}),\n tenant: client.tenant,\n durationMs: dur,\n });\n } else if (m.state.status === \"error\") {\n safeEmit({\n type: \"mutation.error\",\n ...(mk ? { mutationKey: mk as readonly unknown[] } : {}),\n tenant: client.tenant,\n error: m.state.error,\n durationMs: dur,\n });\n }\n });\n\n const unsubAuth = client.tokenProvider.onRefresh?.((evt) =>\n safeEmit({ type: \"auth.refresh\", ...evt, tenant: client.tenant }),\n );\n\n const unsubStorage = value.storage.subscribeAll?.((key) =>\n safeEmit({ type: \"storage.write\", key }),\n );\n\n return () => {\n unsubQuery();\n unsubMut();\n unsubAuth?.();\n unsubStorage?.();\n };\n }, [qc, onTelemetry, client, value.storage, safeEmit]);\n\n // Opt-in reactive customer-token auto-refresh. Registered on the client so\n // the core HttpClient can refresh-and-retry a customer 401. Single-flight is\n // handled in the core registry. Off unless `autoRefreshCustomerToken`.\n useEffect(() => {\n if (!autoRefreshCustomerToken) return;\n const storage = value.storage;\n client.setCustomerTokenRefresher({\n refresh: async () => {\n const refreshToken = storage.getRefreshToken();\n if (!refreshToken) {\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: false, tenant: client.tenant });\n onCustomerSessionExpired?.();\n return null;\n }\n try {\n const legalEntityId = storage.getActiveLegalEntityId() ?? undefined;\n const s = await client.customers.refresh({\n refreshToken,\n ...(legalEntityId ? { legalEntityId } : {}),\n });\n storage.setCustomerToken(s.customerToken);\n if (s.refreshToken) storage.setRefreshToken(s.refreshToken);\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: true, tenant: client.tenant });\n return s.customerToken;\n } catch {\n safeEmit({ type: \"auth.refresh\", kind: \"customer\", success: false, tenant: client.tenant });\n onCustomerSessionExpired?.();\n return null;\n }\n },\n });\n return () => client.setCustomerTokenRefresher(null);\n }, [autoRefreshCustomerToken, client, value.storage, safeEmit, onCustomerSessionExpired]);\n\n return (\n <EmporixContext.Provider value={value}>\n <EmporixTelemetryContext.Provider value={telemetryValue}>\n <QueryClientProvider client={qc}>\n <SiteContextProvider\n client={client}\n storage={value.storage}\n {...(initialSiteCode !== undefined ? { initialSiteCode } : {})}\n >\n <CompanyContextProvider\n client={client}\n storage={value.storage}\n {...(initialActiveLegalEntityId !== undefined\n ? { initialActiveLegalEntityId }\n : {})}\n >\n {children}\n </CompanyContextProvider>\n </SiteContextProvider>\n </QueryClientProvider>\n </EmporixTelemetryContext.Provider>\n </EmporixContext.Provider>\n );\n}\n\n/**\n * Manages the active-site state. Sits inside `QueryClientProvider` so\n * `setSite` can invalidate the React-Query cache on switch.\n */\nfunction SiteContextProvider({\n client,\n storage,\n initialSiteCode,\n children,\n}: {\n client: EmporixClient;\n storage: EmporixStorage;\n initialSiteCode?: string;\n children: ReactNode;\n}): React.JSX.Element {\n const qc = useQueryClient();\n const [siteCode, setSiteCodeState] = useState<string | null>(() => {\n if (initialSiteCode !== undefined) return initialSiteCode;\n const fromStorage = storage.getSiteCode();\n if (fromStorage !== null) return fromStorage;\n return client.config?.credentials?.storefront?.context?.siteCode ?? null;\n });\n const [currency, setCurrency] = useState<string | null>(null);\n const [targetLocation, setTargetLocation] = useState<string | null>(null);\n const [isSwitching, setIsSwitching] = useState(false);\n const [switchError, setSwitchError] = useState<Error | null>(null);\n\n // Mount-time derivation: if a siteCode is already resolved, fetch its DTO\n // once so currency + targetLocation populate without a user-driven switch.\n useEffect(() => {\n if (!siteCode || currency !== null) return;\n let cancelled = false;\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"site-by-code\",\n siteCode,\n { tenant: client.tenant, authKind: authCtx.kind },\n ],\n queryFn: () => client.sites.get(siteCode, authCtx),\n staleTime: 5 * 60_000,\n })\n .then((site) => {\n if (cancelled) return;\n setCurrency(site.currency);\n setTargetLocation(site.homeBase?.address?.country ?? null);\n })\n .catch(() => {\n // Best-effort — silent. setSite-driven derivation surfaces real errors.\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [siteCode]);\n\n const setSite = useCallback(\n async (code: string | null) => {\n // 1) Optimistic flip — UI moves immediately.\n storage.setSiteCode(code);\n storage.setCartId(null);\n setSiteCodeState(code);\n setSwitchError(null);\n void qc.invalidateQueries({ queryKey: [\"emporix\"] });\n\n if (code === null) {\n setCurrency(null);\n setTargetLocation(null);\n return;\n }\n\n setIsSwitching(true);\n try {\n const token = storage.getCustomerToken();\n const authCtx = token ? auth.customer(token) : auth.anonymous();\n // 2) Derive currency + targetLocation from the site DTO (cached 5min).\n const site = await qc.fetchQuery({\n queryKey: [\n \"emporix\",\n \"site-by-code\",\n code,\n { tenant: client.tenant, authKind: authCtx.kind },\n ],\n queryFn: () => client.sites.get(code, authCtx),\n staleTime: 5 * 60_000,\n });\n const nextCurrency = site.currency;\n const nextTarget = site.homeBase?.address?.country ?? null;\n setCurrency(nextCurrency);\n setTargetLocation(nextTarget);\n // 3) Push everything into the session-context PATCH.\n await client.sessionContext.patch(\n {\n siteCode: code,\n ...(nextCurrency ? { currency: nextCurrency } : {}),\n ...(nextTarget ? { targetLocation: nextTarget } : {}),\n },\n authCtx,\n );\n } catch (e) {\n setSwitchError(e instanceof Error ? e : new Error(String(e)));\n } finally {\n setIsSwitching(false);\n }\n },\n [client, storage, qc],\n );\n\n const value = useMemo<SiteContextValue>(\n () => ({\n siteCode,\n currency,\n targetLocation,\n setSite,\n isSwitching,\n switchError,\n }),\n [siteCode, currency, targetLocation, setSite, isSwitching, switchError],\n );\n\n return <EmporixSiteContext.Provider value={value}>{children}</EmporixSiteContext.Provider>;\n}\n\n/** Returns the SDK client and token storage. Throws outside an {@link EmporixProvider}. */\nexport function useEmporix(): EmporixContextValue {\n const ctx = useContext(EmporixContext);\n if (!ctx) throw new Error(\"useEmporix must be used within an EmporixProvider\");\n return ctx;\n}\n","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 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 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` from the EmporixProvider's site\n * context. Used by site-aware Read-Hooks to compose their query keys.\n *\n * Returns `null` when no site context is mounted — hooks use `null` in the\n * query key so cache entries are deterministic.\n */\nexport function useReadSite(): { siteCode: string | null } {\n const ctx = useContext(EmporixSiteContext);\n return { siteCode: ctx?.siteCode ?? 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 },\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 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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product\", [productId], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: emporixKey(\"products-infinite\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-by-code\", [code], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"product-search\", [query, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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/**\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products-by-codes\", [codes, options.chunkSize], {\n tenant: client.tenant,\n authKind: ctx.kind,\n siteCode,\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"shopping-lists\", [opts.name ?? null], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\n \"variant-children\",\n [parentVariantId, { pageSize: options.pageSize }],\n { tenant: client.tenant, authKind: ctx.kind, siteCode },\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"category\", [categoryId], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"subcategories\", [categoryId ?? null, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"categories\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useEmporixInfinite<Category>({\n queryKey: emporixKey(\"categories-infinite\", [params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"category-tree\", [], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useQuery({\n queryKey: emporixKey(\"products-in-category\", [categoryId, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: emporixKey(\"products-in-category-infinite\", [categoryId, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),\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 } = 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 },\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 } = 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 },\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"list\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"items\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"categoryTree\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"myProducts\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useEmporixInfinite<Product>({\n queryKey: [\n \"emporix\",\n \"segment\",\n \"myProductsInfinite\",\n { tenant: client.tenant, query, siteCode },\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 } = useReadSite();\n return useQuery({\n queryKey: [\"emporix\", \"segment\", \"myCategories\", { tenant: client.tenant, query, siteCode }],\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 } = useReadSite();\n return useEmporixInfinite<Category>({\n queryKey: [\n \"emporix\",\n \"segment\",\n \"myCategoriesInfinite\",\n { tenant: client.tenant, query, siteCode },\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 { 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\";\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","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 { 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} 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: 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: 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: 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","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 { 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 } = 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 },\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 } = 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 },\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\";\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 return useQuery({\n queryKey: emporixKey(\"orders\", [orderId ?? null], {\n tenant: client.tenant,\n authKind: token ? \"customer\" : \"anonymous\",\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 if (order.items.length === 0) return { added: 0, errors: [] };\n\n const batchBody = order.items.map((item) => ({\n product: { id: item.productId },\n quantity: item.quantity,\n })) as never;\n const res = await client.carts.addItemsBatch(cartId, batchBody, 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\";\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 return useQuery({\n queryKey: emporixKey(\"salesorders\", [orderId ?? null], {\n tenant: client.tenant,\n authKind: authCtx?.kind ?? \"anonymous\",\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 { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { EmporixError, EmporixAuthError } from \"@viu/emporix-sdk\";\n\ninterface Props {\n children: ReactNode;\n fallback: ReactNode;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\ninterface State {\n error: Error | null;\n}\n\n/** Catches render errors (including thrown {@link EmporixError}) and shows a fallback. */\nexport class EmporixErrorBoundary extends Component<Props, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n render(): ReactNode {\n if (this.state.error) return this.props.fallback;\n return this.props.children;\n }\n}\n\n/** Returns a handler that runs `onAuthError` for {@link EmporixAuthError}, else `onError`. */\nexport function useEmporixErrorHandler(handlers: {\n onAuthError?: (e: EmporixAuthError) => void;\n onError?: (e: EmporixError) => void;\n}): (error: unknown) => void {\n return (error: unknown) => {\n if (error instanceof EmporixAuthError) handlers.onAuthError?.(error);\n else if (error instanceof EmporixError) handlers.onError?.(error);\n };\n}\n","import type { QueryClient } from \"@tanstack/react-query\";\nimport { auth, type AuthContext, type EmporixClient } from \"@viu/emporix-sdk\";\n\n/**\n * Server-side prefetch of a product into a {@link QueryClient}, using the same\n * query key shape as `useProduct` so client hydration is a cache hit.\n * Create the `EmporixClient` once per server, never per request.\n */\nexport async function prefetchProduct(\n qc: QueryClient,\n client: EmporixClient,\n productId: string,\n authCtx: AuthContext = auth.anonymous(),\n): Promise<void> {\n await qc.prefetchQuery({\n queryKey: [\"emporix\", \"product\", productId, { tenant: client.tenant, authKind: authCtx.kind }],\n queryFn: () => client.products.get(productId, undefined, authCtx),\n });\n}\n\n/**\n * Server-side prefetch of a cart. Pass the customer/anonymous context resolved\n * from the request (e.g. a token read from an httpOnly cookie).\n */\nexport async function prefetchCart(\n qc: QueryClient,\n client: EmporixClient,\n cartId: string,\n authCtx: AuthContext,\n): Promise<void> {\n await qc.prefetchQuery({\n queryKey: [\"emporix\", \"cart\", cartId, { tenant: client.tenant, authKind: authCtx.kind }],\n queryFn: () => client.carts.get(cartId, authCtx),\n });\n}\n\n/**\n * Server-side prefetch of a single customer order. Writes the same cache key\n * `useOrder(orderId)` reads, so client hydration is a cache hit.\n */\nexport async function prefetchOrder(\n qc: QueryClient,\n client: EmporixClient,\n orderId: string,\n authCtx: AuthContext,\n opts: { saasToken?: string } = {},\n): Promise<void> {\n await qc.prefetchQuery({\n queryKey: [\"emporix\", \"orders\", orderId, { tenant: client.tenant, authKind: authCtx.kind }],\n queryFn: () =>\n client.orders.get(orderId, authCtx, opts.saasToken ? { saasToken: opts.saasToken } : {}),\n });\n}\n"]}
|