@kasuvia/sdk 0.0.2 → 0.0.5
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/dist/hooks/index.d.mts +430 -0
- package/dist/hooks/index.d.ts +430 -0
- package/dist/hooks/index.js +3073 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +2962 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index-CxNLI4nw.d.ts +786 -0
- package/dist/index-CzVMyUs4.d.mts +492 -0
- package/dist/index-CzVMyUs4.d.ts +492 -0
- package/dist/index-Dowl5224.d.mts +786 -0
- package/dist/index.d.mts +48 -1739
- package/dist/index.d.ts +48 -1739
- package/dist/index.js +1544 -2359
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1527 -2258
- package/dist/index.mjs.map +1 -1
- package/dist/sdk-context-BuarJbeb.d.ts +75 -0
- package/dist/sdk-context-Db8kf1Tv.d.mts +75 -0
- package/dist/services/index.d.mts +2 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +2369 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/index.mjs +2252 -0
- package/dist/services/index.mjs.map +1 -0
- package/package.json +11 -2
- package/src/config/index.ts +10 -91
- package/src/constants.ts +13 -0
- package/src/context/sdk-context.tsx +70 -0
- package/src/graphql/collections.graphql.ts +2 -10
- package/src/graphql/products.graphql.ts +215 -65
- package/src/graphql/wishlist.graphql.ts +7 -6
- package/src/hooks/index.ts +2 -0
- package/src/hooks/use-auth.ts +82 -158
- package/src/hooks/use-bespoke-availability.ts +25 -8
- package/src/hooks/use-cart.ts +222 -119
- package/src/hooks/use-cms.ts +179 -86
- package/src/hooks/use-collections.ts +52 -15
- package/src/hooks/use-consultation-stream.ts +4 -3
- package/src/hooks/use-consultations.ts +120 -51
- package/src/hooks/use-countries.ts +35 -13
- package/src/hooks/use-currencies.ts +26 -13
- package/src/hooks/use-google-translate.ts +22 -8
- package/src/hooks/use-languages.ts +40 -20
- package/src/hooks/use-mobile.ts +23 -0
- package/src/hooks/use-order-stream.ts +9 -5
- package/src/hooks/use-orders.ts +99 -44
- package/src/hooks/use-payment.ts +108 -40
- package/src/hooks/use-products.ts +251 -53
- package/src/hooks/use-service-booking.ts +152 -90
- package/src/hooks/use-states.ts +35 -15
- package/src/hooks/use-wishlist.ts +92 -91
- package/src/index.ts +26 -30
- package/src/services/auth.service.ts +209 -167
- package/src/services/bespoke.service.ts +12 -4
- package/src/services/cart.service.ts +172 -70
- package/src/services/cms.service.ts +70 -35
- package/src/services/collection.service.ts +22 -5
- package/src/services/config.service.ts +34 -14
- package/src/services/consultation.service.ts +72 -18
- package/src/services/logistics.service.ts +35 -11
- package/src/services/notifications.service.ts +27 -12
- package/src/services/order.service.ts +74 -15
- package/src/services/payment.service.ts +86 -31
- package/src/services/product.service.ts +279 -39
- package/src/services/service-booking.service.ts +98 -26
- package/src/services/wishlist.service.ts +69 -25
- package/src/types/auth/index.ts +6 -4
- package/src/types/business/index.ts +7 -2
- package/src/types/payments/index.ts +3 -3
- package/src/types/services/index.ts +2 -5
- package/src/types/store/index.ts +38 -3
- package/src/utils/error-handler.ts +10 -5
- package/src/utils/storage.ts +48 -26
- package/src/utils/validators.ts +85 -0
- package/src/client/authClient.ts +0 -135
- package/src/client/graphqlClient.ts +0 -53
- package/src/client/httpClient.ts +0 -298
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/cache.ts","../src/utils/logger.ts","../src/utils/sanitize-url.ts","../src/utils/customer.ts","../src/utils/checkout.ts","../src/utils/error-handler.ts","../src/config/index.ts","../src/client/httpClient.ts","../src/client/authClient.ts","../src/client/graphqlClient.ts","../src/services/cart.service.ts","../src/services/order.service.ts","../src/services/auth.service.ts","../src/services/product.service.ts","../src/services/collection.service.ts","../src/services/wishlist.service.ts","../src/services/payment.service.ts","../src/services/consultation.service.ts","../src/services/logistics.service.ts","../src/services/bespoke.service.ts","../src/services/service-booking.service.ts","../src/services/notifications.service.ts","../src/services/app.service.ts","../src/services/config.service.ts","../src/services/cms.service.ts","../src/hooks/use-cart.ts","../src/hooks/use-orders.ts","../src/hooks/use-auth.ts","../src/hooks/use-countries.ts","../src/hooks/use-states.ts","../src/hooks/use-languages.ts","../src/hooks/use-currencies.ts","../src/hooks/use-bespoke-availability.ts","../src/hooks/use-collections.ts","../src/hooks/use-products.ts","../src/hooks/use-wishlist.ts","../src/hooks/use-service-booking.ts","../src/hooks/use-consultations.ts","../src/hooks/use-consultation-stream.ts","../src/hooks/use-order-stream.ts","../src/hooks/use-is-mounted.ts","../src/hooks/use-google-translate.ts","../src/hooks/use-payment.ts","../src/hooks/use-cms.ts","../src/utils/storage.ts"],"sourcesContent":["/**\n * @kasuvia/sdk\n * \n * Kasuvia SDK - Core data fetching, authentication, and API client layer\n * \n * @example\n * ```ts\n * import { initSdk, useCart, useOrders } from '@kasuvia/sdk'\n * \n * // Initialize SDK\n * initSdk({\n * businessId: 'B-123ABC',\n * storefrontApiKey: 'your-api-key',\n * environment: 'production'\n * })\n * \n * // Configure HTTP clients after initialization\n * configureHttpClients()\n * \n * // Use in components\n * function Cart() {\n * const { cart, addToCart } = useCart()\n * // ...\n * }\n * ```\n */\n\n// Configuration\nexport { initSdk, getRuntimeConfig, getBackendUrl, isInitialized, resetConfig } from './config'\nexport type { SdkConfig } from './config'\n\n// Client layer\nexport { \n storeManagementAxios, \n publicStoreAxios, \n authAxios,\n paymentAxios,\n cmsAxios,\n getOrCreateGuestSessionId,\n getGuestSessionId,\n clearGuestSessionId,\n configureHttpClients,\n} from './client/httpClient'\nexport { tokenStore, refreshToken } from './client/authClient'\nexport { getGraphQLClient, resetGraphQLClient } from './client/graphqlClient'\n\n// Types\nexport * from './types'\n\n// Services\nexport * from './services'\n\n// React Hooks\nexport * from './hooks'\n\n// Utils\nexport { getCacheTier, setEnvironmentMode } from './utils/cache'\nexport { logger, setLoggerEnvironmentMode } from './utils/logger'\nexport * from './utils/sanitize-url'\nexport * from './utils/customer'\nexport * from './utils/checkout'\nexport * from './utils/error-handler'\nexport { sessionStore, localStore } from './utils/storage'\n\n\n\n// App service functions\nexport { googleTranslate } from './services/app.service'\n","/**\n * Cache Tiers Utility\n * \n * Provides cache configuration for React Query based on environment.\n */\n\nconst CACHE_TIERS = {\n none: { staleTime: 0, gcTime: 0 },\n infinity: { staleTime: Infinity, gcTime: 0 },\n low: { staleTime: 1000 * 30, gcTime: 1000 * 60 }, // 30s / 1m\n medium: { staleTime: 1000 * 60 * 5, gcTime: 1000 * 60 * 10 }, // 5m / 10m\n high: { staleTime: 1000 * 60 * 30, gcTime: 1000 * 60 * 60 }, // 30m / 1h\n} as const;\n\nexport type CacheTier = keyof typeof CACHE_TIERS;\n\nlet isDevelopment = true;\n\n/**\n * Set the environment mode for cache configuration\n */\nexport function setEnvironmentMode(development: boolean): void {\n isDevelopment = development;\n}\n\n/**\n * Get cache configuration for a given tier\n * In development, returns 'none' tier to disable caching\n */\nexport const getCacheTier = (tier: CacheTier) => {\n if (isDevelopment) return CACHE_TIERS.none;\n return CACHE_TIERS[tier];\n};\n","/**\n * Logger Utility\n * \n * Environment-gated logger that suppresses output in production.\n */\n\nlet isDevelopment = true;\n\n/**\n * Set the environment mode for logging\n */\nexport function setLoggerEnvironmentMode(development: boolean): void {\n isDevelopment = development;\n}\n\nexport const logger = {\n log: (...args: unknown[]) => {\n if (isDevelopment) {\n console.log(...args)\n }\n },\n\n warn: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(...args)\n }\n },\n\n /**\n * Logs a warning to the console in development only.\n * Alias for warn() for Python logging compatibility.\n * In production, this is a no-op.\n */\n warning: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(...args)\n }\n },\n\n error: (...args: unknown[]) => {\n if (isDevelopment) {\n console.error(...args)\n }\n },\n\n info: (...args: unknown[]) => {\n if (isDevelopment) {\n console.info(...args)\n }\n },\n\n createScope: (scope: string) => ({\n log: (...args: unknown[]) => {\n if (isDevelopment) {\n console.log(`[${scope}]`, ...args)\n }\n },\n warn: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(`[${scope}]`, ...args)\n }\n },\n warning: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(`[${scope}]`, ...args)\n }\n },\n error: (...args: unknown[]) => {\n if (isDevelopment) {\n console.error(`[${scope}]`, ...args)\n }\n },\n info: (...args: unknown[]) => {\n if (isDevelopment) {\n console.info(`[${scope}]`, ...args)\n }\n },\n }),\n}\n","export class InvalidBaseURLError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"InvalidBaseURLError\";\r\n }\r\n}\r\n\r\nconst ALLOWED_SCHEMES = new Set([\"http:\", \"https:\", \"ws:\", \"wss:\"]);\r\n\r\n/**\r\n * Normalizes a URL by trimming whitespace and stripping trailing slashes.\r\n */\r\nexport function sanitizeBaseUrl(\r\n url: string | undefined | null,\r\n name = \"URL\"\r\n): string {\r\n if (url == null) {\r\n throw new InvalidBaseURLError(`${name} is not set`);\r\n }\r\n\r\n const cleaned0 = url.trim();\r\n if (!cleaned0) {\r\n throw new InvalidBaseURLError(`${name} is empty`);\r\n }\r\n\r\n // Strip all trailing slashes\r\n const cleaned = cleaned0.replace(/\\/+$/, \"\");\r\n\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(cleaned);\r\n } catch {\r\n throw new InvalidBaseURLError(\r\n `${name} must start with http://, https://, ws://, or wss://, got: ${url}`\r\n );\r\n }\r\n\r\n if (!ALLOWED_SCHEMES.has(parsed.protocol)) {\r\n throw new InvalidBaseURLError(\r\n `${name} must start with http://, https://, ws://, or wss://, got: ${url}`\r\n );\r\n }\r\n\r\n if (!parsed.hostname) {\r\n throw new InvalidBaseURLError(`${name} is missing a host: ${url}`);\r\n }\r\n\r\n if (parsed.search || parsed.hash) {\r\n throw new InvalidBaseURLError(\r\n `${name} should not contain a query or fragment: ${url}`\r\n );\r\n }\r\n\r\n return cleaned;\r\n}","import type { CustomerUser } from \"../types\";\n\nexport function buildFullName(firstname?: string, lastname?: string): string | undefined {\n const name = [firstname, lastname].filter(Boolean).join(' ').trim()\n return name || undefined\n}\n\nexport function splitFullName(fullName?: string): { firstname: string; lastname: string } {\n if (!fullName?.trim()) return { firstname: '', lastname: '' }\n const parts = fullName.trim().split(/\\s+/)\n return {\n firstname: parts[0] ?? '',\n lastname: parts.slice(1).join(' '),\n }\n}\n\nexport function getCustomerDisplayName(user: CustomerUser): string {\n const fromParts = buildFullName(user.firstname, user.lastname)\n return fromParts || user.full_name || user.email.split('@')[0]\n}\n\n/**\n * Constructs live storefront URL for a business.\n * If custom domain is not yet connected/verified, defaults to `https://<business_id>.kasuvia.com`.\n */\nexport function getStorefrontUrl(businessId: string, customDomain?: string | null): string {\n if (customDomain && customDomain.trim()) {\n const cleanDomain = customDomain.trim().replace(/^https?:\\/\\//, '');\n return `https://${cleanDomain}`;\n }\n const cleanBid = (businessId || 'store').toLowerCase().trim();\n return `https://${cleanBid}.kasuvia.com`;\n}\n\n","import { buildFullName } from \"./customer\";\nimport type { CheckoutCustomer, DeliveryAddress, Order, ShippingLocation } from \"../types\";\n\nexport function buildDeliveryAddress(customer: CheckoutCustomer, location: ShippingLocation): DeliveryAddress {\n return {\n first_name: customer.first_name,\n last_name: customer.last_name,\n phone: customer.phone,\n ...location,\n };\n}\n\nexport function getCheckoutCustomerName(customer: CheckoutCustomer): string {\n return buildFullName(customer.first_name, customer.last_name) ?? customer.email.split(\"@\")[0];\n}\n\nexport function enrichCompletedOrder(\n order: Order,\n options: {\n customer: CheckoutCustomer;\n location?: ShippingLocation;\n bespokeBrief?: string;\n productType?: \"physical\" | \"digital\" | \"bespoke\" | null;\n },\n): Order {\n const customerName = getCheckoutCustomerName(options.customer);\n\n return {\n ...order,\n customerName: order.customerName || customerName,\n customerEmail: order.customerEmail || options.customer.email,\n shippingAddress:\n order.shippingAddress ??\n (options.productType === \"physical\" && options.location\n ? buildDeliveryAddress(options.customer, options.location)\n : undefined),\n bespokeBrief: order.bespokeBrief ?? options.bespokeBrief,\n };\n}\n","import axios from 'axios';\n\n/**\n * Type-safe way to extract an error message from an API error.\n */\nexport function getErrorMessage(error: unknown, fallback: string = \"Something went wrong\"): string {\n if (axios.isAxiosError(error)) {\n return error.response?.data?.detail || error.response?.data?.message || error.message || fallback;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return fallback;\n}\n","/**\n * Kasuvia SDK Configuration\n * \n * This module manages SDK initialization and runtime configuration.\n * The SDK is client-based and runs in the browser.\n * All backend URLs are bundled with the SDK.\n * \n * SECURITY NOTE: The storefront API key has limited permissions - it only provides\n * customer-based resources from a business owner to customers, not full platform access.\n * This key is safe to expose to the browser as a NEXT_PUBLIC_ environment variable.\n */\n\nimport { logger, setEnvironmentMode, setLoggerEnvironmentMode } from \"../utils\"\n\nexport interface SdkConfig {\n businessId: string\n storefrontApiKey: string\n}\n\ninterface SdkRuntimeConfig {\n businessId: string\n storefrontApiKey: string\n}\n\nlet runtimeConfig: SdkRuntimeConfig | null = null\n\n/**\n * Backend URLs - bundled with the SDK\n * These are the complete URLs (including API version) that the SDK uses internally.\n * The storefront never sees or configures these URLs.\n * \n * Currently set to localhost development URLs.\n * Update to production URLs when ready for deployment.\n */\nconst BACKEND_URLS = {\n auth: 'https://127.0.0.1:8000/api/v1',\n store: 'https://127.0.0.1:8001/api/v1',\n payment: 'https://127.0.0.1:8002/api/v1',\n notifications: 'https://127.0.0.1:8007/api/v1',\n cms: 'https://127.0.0.1:8009/api/v1',\n} as const\n\n/**\n * Initialize the SDK with runtime credentials\n * This must be called before any SDK operations\n * \n * IMPORTANT: In Next.js, this should be called in layout.tsx (server component)\n * using private environment variables (kasuvia_BUSINESS_ID, kasuvia_STOREFRONT_API_KEY).\n * The config is stored in module scope and will be available to client components\n * through the SDK's bundled code.\n * \n * @param config - SDK configuration including credentials\n */\nexport function initSdk(config: SdkConfig): void {\n runtimeConfig = {\n businessId: config.businessId,\n storefrontApiKey: config.storefrontApiKey,\n }\n \n // Determine environment from NODE_ENV for logging/cache behavior\n // In browser (window exists), default to production behavior\n // In Node.js (window undefined), check NODE_ENV\n const isDevelopment = typeof window === 'undefined' && \n (globalThis as any).process?.env?.NODE_ENV === 'development'\n setEnvironmentMode(isDevelopment)\n setLoggerEnvironmentMode(isDevelopment)\n \n logger.log('SDK initialized with businessId:', config.businessId)\n}\n\n/**\n * Get the current runtime configuration\n * Throws if SDK is not initialized\n */\nexport function getRuntimeConfig(): SdkRuntimeConfig {\n if (!runtimeConfig) {\n throw new Error('SDK not initialized. Call initSdk() before using SDK functions.')\n }\n return runtimeConfig\n}\n\n/**\n * Get backend URL for a specific service\n * Internal use only - never exposed to storefront\n */\nexport function getBackendUrl(service: 'auth' | 'store' | 'payment' | 'notifications' | 'cms'): string {\n return BACKEND_URLS[service]\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return runtimeConfig !== null\n}\n\n/**\n * Reset SDK configuration (mainly for testing)\n */\nexport function resetConfig(): void {\n runtimeConfig = null\n}\n","/**\n * HTTP Client - Pre-configured Axios instances\n *\n * Each Axios instance is created with a default baseURL based on the static\n * service URL. The baseURLs are complete URLs including the API version,\n * selected based on the configured environment (development/production).\n */\nimport axios, { type AxiosInstance } from 'axios'\nimport { getRuntimeConfig, getBackendUrl, isInitialized } from '../config'\nimport { tokenStore, refreshToken } from './authClient'\n\n// ── Guest session management ─────────────────────────────────────────────────\n\nlet _guestSessionId: string | null = null\n\nexport function getOrCreateGuestSessionId(): string {\n if (_guestSessionId) return _guestSessionId\n\n const storageKey = isInitialized()\n ? `kasuvia-guest-${getRuntimeConfig().businessId}`\n : 'kasuvia-guest-anon'\n\n if (typeof window !== 'undefined') {\n _guestSessionId = sessionStorage.getItem(storageKey) || crypto.randomUUID()\n sessionStorage.setItem(storageKey, _guestSessionId)\n } else {\n _guestSessionId = crypto.randomUUID()\n }\n\n return _guestSessionId\n}\n\nexport function getGuestSessionId(): string | null {\n if (!_guestSessionId && typeof window !== 'undefined') {\n const storageKey = isInitialized()\n ? `kasuvia-guest-${getRuntimeConfig().businessId}`\n : 'kasuvia-guest-anon'\n _guestSessionId = sessionStorage.getItem(storageKey)\n }\n return _guestSessionId\n}\n\nexport function clearGuestSessionId(): void {\n _guestSessionId = null\n if (typeof window !== 'undefined') {\n const storageKey = isInitialized()\n ? `kasuvia-guest-${getRuntimeConfig().businessId}`\n : 'kasuvia-guest-anon'\n sessionStorage.removeItem(storageKey)\n }\n}\n\n// ── Store Management Axios ───────────────────────────────────────────────────\n\nexport const storeManagementAxios = axios.create({\n baseURL: getBackendUrl('store'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30_000,\n}) as AxiosInstance\n\nstoreManagementAxios.interceptors.request.use((cfg) => {\n const config = getRuntimeConfig()\n\n const token = tokenStore.getAccessToken()\n if (token) {\n cfg.headers = cfg.headers ?? {}\n cfg.headers['Authorization'] = `Bearer ${token}`\n }\n\n cfg.headers = cfg.headers ?? {}\n cfg.headers['X-Storefront-Key'] = config.storefrontApiKey\n cfg.headers['X-Business-ID'] = config.businessId\n\n if (!token) {\n const sid = getOrCreateGuestSessionId()\n if (sid) cfg.headers['X-Guest-Session'] = sid\n }\n\n return cfg\n})\n\nstoreManagementAxios.interceptors.response.use(\n (res) => res,\n async (err) => {\n const originalRequest = err.config\n if (!originalRequest) return Promise.reject(err)\n\n const status = err.response?.status\n const isUnauthorized = status === 401\n const isRefreshEndpoint = originalRequest.url?.includes('/auth/token/refresh/')\n const alreadyRetried = originalRequest._retry === true\n\n if (isUnauthorized && isRefreshEndpoint) {\n tokenStore.clearAll()\n return Promise.reject(err)\n }\n\n if (!isUnauthorized || alreadyRetried) return Promise.reject(err)\n\n try {\n const newToken = await refreshToken()\n originalRequest._retry = true\n if (originalRequest.headers) {\n originalRequest.headers['Authorization'] = `Bearer ${newToken}`\n }\n return storeManagementAxios(originalRequest)\n } catch (refreshErr) {\n tokenStore.clearAll()\n return Promise.reject(refreshErr)\n }\n }\n)\n\n// ── Public Store Axios ───────────────────────────────────────────────────────\n\nexport const publicStoreAxios = axios.create({\n baseURL: getBackendUrl('store'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30_000,\n})\n\npublicStoreAxios.interceptors.request.use((cfg) => {\n const config = getRuntimeConfig()\n cfg.headers = cfg.headers ?? {}\n cfg.headers['X-Storefront-Key'] = config.storefrontApiKey\n cfg.headers['X-Business-ID'] = config.businessId\n return cfg\n})\n\npublicStoreAxios.interceptors.response.use(\n (res) => res,\n (err) => Promise.reject(err)\n)\n\n// ── Auth Axios ───────────────────────────────────────────────────────────────\n\nexport const authAxios = axios.create({\n baseURL: getBackendUrl('auth'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n withCredentials: true,\n timeout: 30_000,\n}) as AxiosInstance\n\nauthAxios.interceptors.request.use((cfg) => {\n const config = getRuntimeConfig()\n\n const token = tokenStore.getAccessToken()\n if (token) {\n cfg.headers = cfg.headers ?? {}\n cfg.headers['Authorization'] = `Bearer ${token}`\n }\n\n cfg.headers = cfg.headers ?? {}\n cfg.headers['X-Storefront-Key'] = config.storefrontApiKey\n cfg.headers['X-Business-ID'] = config.businessId\n\n return cfg\n})\n\nauthAxios.interceptors.response.use(\n (res) => res,\n async (err) => {\n const originalRequest = err.config\n if (!originalRequest) return Promise.reject(err)\n\n const status = err.response?.status\n const isUnauthorized = status === 401\n const isRefreshEndpoint = originalRequest.url?.includes('/auth/token/refresh/')\n const alreadyRetried = originalRequest._retry === true\n\n if (isUnauthorized && isRefreshEndpoint) {\n tokenStore.clearAll()\n return Promise.reject(err)\n }\n\n if (!isUnauthorized || alreadyRetried) return Promise.reject(err)\n\n try {\n const newToken = await refreshToken()\n originalRequest._retry = true\n if (originalRequest.headers) {\n originalRequest.headers['Authorization'] = `Bearer ${newToken}`\n }\n return authAxios(originalRequest)\n } catch (refreshErr) {\n tokenStore.clearAll()\n return Promise.reject(refreshErr)\n }\n }\n)\n\n// ── Payment Axios ────────────────────────────────────────────────────────────\n\nexport const paymentAxios = axios.create({\n baseURL: getBackendUrl('payment'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30_000,\n})\n\npaymentAxios.interceptors.request.use((cfg) => {\n const config = getRuntimeConfig()\n cfg.headers = cfg.headers ?? {}\n cfg.headers['X-Storefront-Key'] = config.storefrontApiKey\n cfg.headers['X-Business-ID'] = config.businessId\n return cfg\n})\n\npaymentAxios.interceptors.response.use(\n (res) => res,\n (err) => Promise.reject(err)\n)\n\n// ── Notifications Axios ──────────────────────────────────────────────────────\n\nexport const notificationsAxios = axios.create({\n baseURL: getBackendUrl('notifications'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30_000,\n})\n\nnotificationsAxios.interceptors.response.use(\n (res) => res,\n (err) => Promise.reject(err)\n)\n\n// ── CMS Axios ───────────────────────────────────────────────────────────────\n\nexport const cmsAxios = axios.create({\n baseURL: getBackendUrl('cms'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 30_000,\n})\n\ncmsAxios.interceptors.request.use((cfg) => {\n const config = getRuntimeConfig()\n cfg.headers = cfg.headers ?? {}\n cfg.headers['X-Storefront-Key'] = config.storefrontApiKey\n cfg.headers['X-Business-ID'] = config.businessId\n return cfg\n})\n\ncmsAxios.interceptors.response.use(\n (res) => res,\n (err) => Promise.reject(err)\n)\n\n// ── Refresh Axios ────────────────────────────────────────────────────────────\n\nexport const refreshAxios = axios.create({\n baseURL: getBackendUrl('auth'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n withCredentials: true,\n timeout: 30_000,\n})\n\n/**\n * configureHttpClients()\n * Updates the baseURL of all Axios instances to match the configured environment.\n * This must be called after initSdk() to ensure the correct environment URLs are used.\n */\nexport function configureHttpClients(): void {\n if (!isInitialized()) return\n\n const storeUrl = getBackendUrl('store')\n const authUrl = getBackendUrl('auth')\n const paymentUrl = getBackendUrl('payment')\n const notificationsUrl = getBackendUrl('notifications')\n const cmsUrl = getBackendUrl('cms')\n\n storeManagementAxios.defaults.baseURL = storeUrl\n publicStoreAxios.defaults.baseURL = storeUrl\n authAxios.defaults.baseURL = authUrl\n paymentAxios.defaults.baseURL = paymentUrl\n notificationsAxios.defaults.baseURL = notificationsUrl\n cmsAxios.defaults.baseURL = cmsUrl\n refreshAxios.defaults.baseURL = authUrl\n}\n","/**\n * Auth Client - Token Store and Refresh Logic\n *\n * - Access token: in-memory only (XSS protection)\n * - Refresh token: localStorage (persists across page loads), keyed per tenant\n */\nimport axios from 'axios'\nimport { getRuntimeConfig, getBackendUrl, isInitialized } from '../config'\n\nlet _accessToken: string | null = null\nlet _isRefreshing = false\nlet _pendingQueue: Array<{\n resolve: (newAccessToken: string) => void\n reject: (error: unknown) => void\n}> = []\n\n/**\n * Returns a BID-prefixed key for storage isolation.\n * Prevents data leakage when multiple storefronts run on the same domain.\n */\nfunction getStorageKey(): string {\n if (!isInitialized()) return 'kasuvia-sf-anon-refresh'\n const config = getRuntimeConfig()\n return `kasuvia-sf-${config.businessId}-refresh`\n}\n\nfunction drainQueue(error: unknown, newToken: string | null = null): void {\n _pendingQueue.forEach(({ resolve, reject }) => {\n if (newToken) resolve(newToken)\n else reject(error)\n })\n _pendingQueue = []\n}\n\nexport const tokenStore = {\n getAccessToken: (): string | null => _accessToken,\n\n setAccessToken: (token: string | null): void => {\n _accessToken = token\n },\n\n getRefreshToken: (): string | null => {\n if (typeof window === 'undefined') return null\n const key = getStorageKey()\n return localStorage.getItem(key) || sessionStorage.getItem(key)\n },\n\n setRefreshToken: (token: string | null, remember = true): void => {\n if (typeof window === 'undefined') return\n const key = getStorageKey()\n localStorage.removeItem(key)\n sessionStorage.removeItem(key)\n if (token) {\n const store = remember ? localStorage : sessionStorage\n store.setItem(key, token)\n }\n },\n\n clearAll: (): void => {\n _accessToken = null\n if (typeof window !== 'undefined') {\n const key = getStorageKey()\n localStorage.removeItem(key)\n sessionStorage.removeItem(key)\n }\n },\n\n hasSession: (): boolean => {\n if (typeof window === 'undefined') return false\n const key = getStorageKey()\n return !!(localStorage.getItem(key) || sessionStorage.getItem(key))\n },\n\n isPersistent: (): boolean => {\n if (typeof window === 'undefined') return true\n const key = getStorageKey()\n return !!localStorage.getItem(key)\n },\n} as const\n\n/**\n * Refresh-only Axios instance.\n * CRITICAL: NO auth interceptors — avoids infinite recursion when the 401\n * interceptor on authAxios calls refreshToken() and itself receives a 401.\n * baseURL is set eagerly from the static BACKEND_URLS constant.\n */\nconst refreshAxios = axios.create({\n baseURL: getBackendUrl('auth'),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n withCredentials: true,\n timeout: 30_000,\n})\n\n/**\n * Perform token refresh with queue-coalescing to avoid parallel refresh races.\n */\nexport async function refreshToken(): Promise<string> {\n if (_isRefreshing) {\n // Queue subsequent callers so they all get the new token from a single refresh\n return new Promise((resolve, reject) => {\n _pendingQueue.push({ resolve, reject })\n })\n }\n\n _isRefreshing = true\n\n const refresh = tokenStore.getRefreshToken()\n if (!refresh) {\n _isRefreshing = false\n tokenStore.clearAll()\n throw new Error('[kasuvia SDK] No refresh token available')\n }\n\n try {\n const { data } = await refreshAxios.post('/auth/token/refresh/', { refresh })\n const newAccess: string = data.access\n tokenStore.setAccessToken(newAccess)\n\n if (data.refresh) {\n tokenStore.setRefreshToken(data.refresh, tokenStore.isPersistent())\n }\n\n drainQueue(null, newAccess)\n return newAccess\n } catch (err) {\n drainQueue(err)\n tokenStore.clearAll()\n throw err\n } finally {\n _isRefreshing = false\n }\n}\n","/**\n * GraphQL Client\n *\n * Provides a GraphQL client with tenant and auth headers for product queries.\n * The endpoint URL is derived from the static BACKEND_URLS constant (eager,\n * module-load safe). Auth headers are injected fresh on each request via a\n * factory so the token is always current.\n */\nimport { GraphQLClient } from 'graphql-request'\nimport { getRuntimeConfig, getBackendUrl, isInitialized } from '../config'\nimport { tokenStore } from './authClient'\n\nconst GRAPHQL_URL = `${getBackendUrl('store')}/graphql`\n\n/**\n * Build fresh request headers.\n * Called on every getGraphQLClient() so token changes are always reflected.\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n }\n\n if (isInitialized()) {\n const config = getRuntimeConfig()\n headers['X-Storefront-Key'] = config.storefrontApiKey\n headers['X-Business-ID'] = config.businessId\n }\n\n const token = tokenStore.getAccessToken()\n if (token) headers['Authorization'] = `Bearer ${token}`\n\n return headers\n}\n\n/**\n * Returns a GraphQL client instance with up-to-date auth headers.\n * A new client is created on each call so token/config changes take effect\n * immediately without requiring an explicit reset.\n */\nexport function getGraphQLClient(): GraphQLClient {\n return new GraphQLClient(GRAPHQL_URL, { headers: buildHeaders() })\n}\n\n/**\n * No-op — kept for backward compatibility.\n * Clients are now stateless (created fresh on each call), so there is no\n * cached instance to reset.\n */\nexport function resetGraphQLClient(): void {\n // No-op: clients are built fresh on every call.\n}\n","/**\n * Cart Service\n * \n * Handles cart operations for both guest and authenticated users.\n */\nimport { storeManagementAxios, getOrCreateGuestSessionId, getGuestSessionId, clearGuestSessionId } from '../client/httpClient'\nimport type { CartItem, CartResponse } from '../types/store'\n\nconst GUEST_SESSION_COOKIE = \"luxe_guest_sid\"\nconst GUEST_CART_TTL_DAYS = 7\n\nfunction parseItems(items: CartItem[]): CartItem[] {\n return items.map((item) => ({\n ...item,\n variant_attributes:\n item.variant_attributes && typeof item.variant_attributes === \"string\"\n ? JSON.parse(item.variant_attributes)\n : item.variant_attributes,\n }));\n}\n\n/**\n * Fetch guest cart from backend (Redis-backed).\n */\nexport async function getGuestCart(): Promise<CartItem[]> {\n const sid = getGuestSessionId()\n if (!sid) return []\n\n try {\n const { data } = await storeManagementAxios.get<CartResponse>(\"cart/\", {\n headers: { \"X-Guest-Session\": sid },\n })\n return parseItems(data.items || [])\n } catch {\n return []\n }\n}\n\n/**\n * Add item to guest cart (Redis-backed).\n */\nexport async function addToGuestCart(item: CartItem): Promise<CartItem[]> {\n const sid = getOrCreateGuestSessionId()\n if (!sid) return []\n\n const payload = {\n product_id: item.product_id,\n product_slug: item.product_slug,\n product_name: item.product_name,\n image: item.image,\n variant_id: item.variant_id,\n variant_attributes:\n typeof item.variant_attributes === \"string\"\n ? item.variant_attributes\n : JSON.stringify(item.variant_attributes),\n unit_price: item.unit_price,\n quantity: item.quantity,\n custom_measurements: item.custom_measurements,\n is_bespoke: item.is_bespoke,\n }\n\n const { data } = await storeManagementAxios.post<CartResponse>(\"cart/\", payload, {\n headers: { \"X-Guest-Session\": sid },\n })\n return parseItems(data.items || [])\n}\n\n/**\n * Update quantity of a guest cart item.\n */\nexport async function updateGuestCartItemQuantity(\n itemId: string,\n quantity: number\n): Promise<CartItem[]> {\n const sid = getGuestSessionId()\n if (!sid) return []\n\n const { data } = await storeManagementAxios.patch<CartResponse>(\n `cart/${itemId}`,\n { quantity },\n { headers: { \"X-Guest-Session\": sid } }\n )\n return parseItems(data.items || [])\n}\n\n/**\n * Remove an item from the guest cart.\n */\nexport async function removeFromGuestCart(itemId: string): Promise<CartItem[]> {\n const sid = getGuestSessionId()\n if (!sid) return []\n\n await storeManagementAxios.delete(`cart/${itemId}`, {\n headers: { \"X-Guest-Session\": sid },\n })\n\n return getGuestCart()\n}\n\n/**\n * Clear the entire guest cart.\n */\nexport async function clearGuestCart(): Promise<void> {\n const sid = getGuestSessionId()\n if (!sid) return\n\n await storeManagementAxios.delete(\"cart/clear\", {\n headers: { \"X-Guest-Session\": sid },\n })\n}\n\n/**\n * Fetch authenticated user's cart from backend.\n */\nexport async function getCart(): Promise<CartResponse> {\n const { data } = await storeManagementAxios.get<CartResponse>(\"cart/\")\n const parsedItems = parseItems(data.items || [])\n return { ...data, items: parsedItems }\n}\n\n/**\n * Add item to authenticated user's cart.\n */\nexport async function addToCart(item: {\n product_id: string\n product_slug: string\n product_name: string\n image?: string\n variant_id?: string\n variant_attributes?: string\n unit_price: number\n quantity: number\n custom_measurements?: string\n is_bespoke: boolean\n}): Promise<CartResponse> {\n const { data } = await storeManagementAxios.post<CartResponse>(\"cart/\", item)\n const parsedItems = parseItems(data.items || [])\n return { ...data, items: parsedItems }\n}\n\n/**\n * Update item quantity in authenticated user's cart.\n */\nexport async function updateCartItem(\n itemId: string,\n quantity: number\n): Promise<CartResponse> {\n const { data } = await storeManagementAxios.patch<CartResponse>(\n `cart/${itemId}`,\n { quantity }\n )\n const parsedItems = parseItems(data.items || [])\n return { ...data, items: parsedItems }\n}\n\n/**\n * Remove item from authenticated user's cart.\n */\nexport async function removeFromCart(itemId: string): Promise<CartResponse> {\n await storeManagementAxios.delete(`cart/${itemId}`)\n return getCart()\n}\n\n/**\n * Clear authenticated user's cart.\n */\nexport async function clearCart(): Promise<void> {\n await storeManagementAxios.delete(\"cart/clear\")\n}\n\n/**\n * Merge guest cart (from Redis) into authenticated user's DB cart.\n */\nexport async function mergeGuestCart(): Promise<CartResponse> {\n const sid = getGuestSessionId()\n const guestItems = sid ? await getGuestCart() : []\n \n if (guestItems.length === 0) {\n return getCart()\n }\n\n const payloadItems = guestItems.map((item) => ({\n product_id: item.product_id,\n product_slug: item.product_slug,\n product_name: item.product_name,\n image: item.image,\n variant_id: item.variant_id,\n variant_attributes:\n typeof item.variant_attributes === \"string\"\n ? item.variant_attributes\n : JSON.stringify(item.variant_attributes ?? {}),\n unit_price: item.unit_price,\n quantity: item.quantity,\n custom_measurements:\n typeof item.custom_measurements === \"string\"\n ? item.custom_measurements\n : JSON.stringify(item.custom_measurements ?? {}),\n is_bespoke: item.is_bespoke,\n }))\n\n const { data } = await storeManagementAxios.post<CartResponse>(\n \"cart/merge\",\n { items: payloadItems },\n sid ? { headers: { \"X-Guest-Session\": sid } } : {}\n )\n\n clearGuestSessionId()\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Convenience wrapper: merge guest cart if it has items (called post-login).\n */\nexport async function mergeGuestCartIfPresent(): Promise<void> {\n try {\n const guestItems = await getGuestCart()\n if (guestItems.length === 0) return\n await mergeGuestCart()\n } catch (error) {\n console.warn(\"[Cart] Failed to merge guest cart:\", error)\n }\n}\n\n/**\n * Returns 0 — count is now server-driven. Use the hook instead.\n * Kept for backward compatibility.\n */\nexport function getGuestCartCount(): number {\n return 0\n}\n\n/**\n * Returns 0 — subtotal is now server-driven.\n * Kept for backward compatibility.\n */\nexport function getGuestCartSubtotal(): number {\n return 0\n}\n\n/**\n * Derive product type from items (guest cart, no backend lookup needed).\n */\nexport function getGuestCartProductType(): \"physical\" | \"digital\" | \"bespoke\" {\n return \"physical\"\n}\n","/**\n * Order Service\n * \n * Handles order operations including creation, lookup, and tracking.\n */\nimport { storeManagementAxios, publicStoreAxios } from '../client/httpClient'\nimport type { Order, OrderStatus, FindOrderParams, CreateOrderParams, OrderItem } from '../types/store'\nimport type { DeliveryAddress } from '../types/store'\n\nexport type { FindOrderParams, CreateOrderParams, OrderStatus }\n\ninterface RawOrderItem {\n id: string\n product_name?: string\n productName?: string\n image?: string\n quantity?: number\n unit_price?: number\n price?: number\n}\n\ninterface RawShippingAddress {\n first_name?: string\n last_name?: string\n phone?: string\n street?: string\n city?: string\n state?: string\n country?: string\n postal?: string\n lga?: string\n}\n\ninterface RawOrder {\n id: string\n display_id?: string\n items?: RawOrderItem[]\n total_amount?: number\n total?: number\n status: OrderStatus\n customer_email?: string\n customer_name?: string\n guest_email?: string\n guest_phone?: string\n guest_name?: string\n guest_token?: string\n shipping_address?: RawShippingAddress | string | null\n delivery_method?: string\n tracking_number?: string\n delivery_status?: string\n carrier_name?: string\n terminal_shipment_id?: string\n product_type?: string\n bespoke_stage?: string\n bespoke_brief?: string\n created_at?: string\n updated_at?: string\n cancellation_reason?: string\n}\n\nfunction deriveCustomerName(raw: RawOrder): string {\n if (raw.customer_name) return raw.customer_name\n if (raw.guest_name) return raw.guest_name\n\n const addr = typeof raw.shipping_address === 'object' && raw.shipping_address !== null\n ? raw.shipping_address as RawShippingAddress\n : null\n if (addr) {\n const full = `${addr.first_name ?? ''} ${addr.last_name ?? ''}`.trim()\n if (full) return full\n }\n\n const email = raw.guest_email ?? raw.customer_email ?? ''\n if (email) return email.split('@')[0]\n\n return ''\n}\n\nfunction normaliseStorefrontOrder(raw: RawOrder): Order {\n const items: OrderItem[] = (raw.items ?? []).map((item) => ({\n id: item.id,\n productName: item.product_name ?? item.productName ?? '',\n image: item.image ?? '',\n quantity: item.quantity ?? 1,\n price: item.unit_price ?? item.price ?? 0,\n }))\n\n const addr = typeof raw.shipping_address === 'object' && raw.shipping_address !== null\n ? raw.shipping_address as RawShippingAddress\n : null\n\n return {\n id: raw.id,\n display_id: raw.display_id,\n items,\n total: raw.total_amount ?? raw.total ?? 0,\n status: raw.status,\n customerEmail: raw.guest_email ?? raw.customer_email ?? '',\n customerName: deriveCustomerName(raw),\n createdAt: raw.created_at ? new Date(raw.created_at).getTime() : Date.now(),\n updatedAt: raw.updated_at ? new Date(raw.updated_at).getTime() : Date.now(),\n deliveryMethod: raw.delivery_method,\n trackingNumber: raw.tracking_number,\n deliveryAddress: typeof raw.shipping_address === 'string'\n ? raw.shipping_address\n : addr\n ? `${addr.street}, ${addr.city}, ${addr.state}, ${addr.country}`\n : undefined,\n shippingAddress: addr\n ? {\n first_name: addr.first_name ?? '',\n last_name: addr.last_name ?? '',\n phone: addr.phone ?? '',\n street: addr.street ?? '',\n city: addr.city ?? '',\n state: addr.state ?? '',\n lga: addr.lga ?? '',\n country: addr.country ?? '',\n postal: addr.postal ?? '',\n }\n : undefined,\n cancellationReason: raw.cancellation_reason,\n hasBespoke: raw.product_type === 'bespoke',\n bespokeStage: raw.bespoke_stage as Order['bespokeStage'],\n bespokeBrief: raw.bespoke_brief,\n deliveryStatus: raw.delivery_status,\n carrierName: raw.carrier_name,\n terminalShipmentId: raw.terminal_shipment_id,\n guestToken: raw.guest_token,\n guestEmail: raw.guest_email,\n guestPhone: raw.guest_phone,\n guestName: raw.guest_name,\n }\n}\n\nexport async function createOrder(payload: CreateOrderParams): Promise<Order> {\n const { data } = await storeManagementAxios.post<RawOrder>('orders/storefront', payload)\n return normaliseStorefrontOrder(data)\n}\n\nexport async function findOrder(params: FindOrderParams): Promise<Order> {\n const { data } = await publicStoreAxios.get<RawOrder>('orders/find/', { params })\n return normaliseStorefrontOrder(data)\n}\n\nexport async function findOrderByToken(token: string): Promise<Order> {\n const { data } = await publicStoreAxios.get<RawOrder>('orders/find/', {\n params: { guest_token: token },\n })\n return normaliseStorefrontOrder(data)\n}\n\nexport async function getOrders(params?: { email?: string; page?: number; page_size?: number }): Promise<Order[]> {\n const { data } = await storeManagementAxios.get<RawOrder[] | { items: RawOrder[] }>('orders/', { params })\n const items: RawOrder[] = Array.isArray(data) ? data : (data.items ?? [])\n return items.map(normaliseStorefrontOrder)\n}\n\nexport async function cancelOrder(orderId: string, reason: string): Promise<Order> {\n const { data } = await storeManagementAxios.post<RawOrder>(`orders/${orderId}/cancel/`, { reason })\n return normaliseStorefrontOrder(data)\n}\n\nexport async function trackOrder(orderId: string, token?: string): Promise<Order> {\n const { data } = await publicStoreAxios.get<RawOrder>(`orders/track/${orderId}`, {\n params: token ? { token } : undefined\n })\n return normaliseStorefrontOrder(data)\n}\n","/**\n * Customer auth service — all API calls scoped to this storefront's business tenant.\n * Every request automatically receives:\n * - Authorization: Bearer <accessToken> (from interceptors)\n * - X-Storefront-Key: <storefrontApiKey> (from interceptors)\n *\n * The `tenant_id` field in login/register payloads is the permanent business_id (B-XXXXXXXX).\n */\nimport { authAxios, refreshAxios } from '../client/httpClient'\nimport { tokenStore } from '../client/authClient'\nimport { resetGraphQLClient } from '../client/graphqlClient'\nimport { getRuntimeConfig } from '../config'\nimport { logger } from '../utils/logger'\nimport { mergeGuestCartIfPresent } from './cart.service'\nimport type {\n CustomerAuthResponse,\n CustomerLoginPayload,\n CustomerRegisterPayload,\n LogoutPayload,\n RefreshTokenResponse,\n CustomerUser,\n AuthUserResponse,\n UpdateProfilePayload,\n} from '../types/auth'\n\n// ── Auth API Calls ────────────────────────────────────────────────────────────\n\n/**\n * POST /auth/login/customer/\n * The `tenant_id` is automatically filled from config.api.storefrontBusinessId.\n */\nexport async function loginCustomer(payload: Omit<CustomerLoginPayload, 'tenant_id'>): Promise<CustomerAuthResponse> {\n const config = getRuntimeConfig()\n const { data } = await authAxios.post<CustomerAuthResponse>('/auth/login/customer/', {\n ...payload,\n tenant_id: config.businessId,\n })\n\n tokenStore.setAccessToken(data.access)\n tokenStore.setRefreshToken(data.refresh)\n resetGraphQLClient()\n\n // Merge guest cart after successful login\n await mergeGuestCartIfPresent()\n\n return data\n}\n\n/**\n * POST /auth/register/customer/\n * The `tenant_id` is automatically filled from config.api.storefrontBusinessId.\n */\nexport async function registerCustomer(payload: Omit<CustomerRegisterPayload, 'tenant_id'>): Promise<CustomerAuthResponse> {\n const config = getRuntimeConfig()\n const { data } = await authAxios.post<CustomerAuthResponse>('/auth/register/customer/', {\n ...payload,\n tenant_id: config.businessId,\n })\n\n tokenStore.setAccessToken(data.access)\n tokenStore.setRefreshToken(data.refresh)\n resetGraphQLClient()\n\n // Merge guest cart after successful registration\n await mergeGuestCartIfPresent()\n\n return data\n}\n\n/** POST /auth/token/refresh/\n * CRITICAL: Uses refreshAxios (no interceptors) to prevent interceptor recursion.\n */\nexport async function refreshToken(refresh: string): Promise<RefreshTokenResponse> {\n const { data } = await refreshAxios.post<RefreshTokenResponse>('/auth/token/refresh/', { refresh })\n return data\n}\n\n/** POST /auth/logout/ — revokes the server-side session. Always clears local tokens. */\nexport async function logout(): Promise<void> {\n const refresh = tokenStore.getRefreshToken()\n const payload: LogoutPayload = refresh ? { refresh } : {}\n try {\n await authAxios.post('/auth/logout/', payload)\n } catch {\n // Swallow server errors (401 = already expired, network = offline).\n // Local token cleanup in `finally` is what actually logs the user out.\n } finally {\n tokenStore.clearAll()\n resetGraphQLClient()\n }\n}\n\n/**\n * Verify a social provider id_token (or access_token for Facebook) with the backend.\n * The backend validates the token with the provider and creates/finds the customer.\n *\n * Industry-standard \"ID Token Exchange\" pattern:\n * 1. Customer completes Google/Facebook sign-in on the storefront\n * 2. Storefront receives an id_token / access_token from the provider\n * 3. This function sends it to the backend for server-side verification\n * 4. Backend returns our JWT tokens\n */\nexport async function verifySocialToken(\n provider: 'google' | 'facebook',\n token: string\n): Promise<CustomerAuthResponse> {\n const config = getRuntimeConfig()\n const { data } = await authAxios.post<CustomerAuthResponse>(\n `/auth/social/verify/${provider}/`,\n {\n id_token: token,\n storefront_key: config.storefrontApiKey,\n }\n )\n tokenStore.setAccessToken(data.access)\n tokenStore.setRefreshToken(data.refresh)\n resetGraphQLClient()\n return data\n}\n\n/** Decode a JWT payload without verifying signature (client-side use only). */\nfunction parseJwtPayload(token: string): Record<string, unknown> {\n try {\n return JSON.parse(atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')))\n } catch {\n return {}\n }\n}\n\nfunction resolveProvider(data: Pick<AuthUserResponse, 'is_google_auth_enabled' | 'is_facebook_auth_enabled'>): CustomerUser['provider'] {\n if (data.is_google_auth_enabled) return 'google'\n if (data.is_facebook_auth_enabled) return 'facebook'\n return 'email'\n}\n\nfunction resolveAvatar(profilePicture: unknown): string | null {\n if (!profilePicture) return null\n if (typeof profilePicture === 'string') return profilePicture\n if (typeof profilePicture === 'object' && profilePicture !== null && 'url' in profilePicture) {\n const url = (profilePicture as { url?: string }).url\n return typeof url === 'string' ? url : null\n }\n return null\n}\n\n/** Map luxe-auth UserSerializer response to storefront CustomerUser. */\nexport function mapAuthUserToCustomer(data: AuthUserResponse, provider?: CustomerUser['provider']): CustomerUser {\n const firstname = data.profile?.firstname?.trim() || undefined\n const lastname = data.profile?.lastname?.trim() || undefined\n const phone = data.profile?.phone?.trim() || undefined\n\n return {\n id: String(data.id),\n email: data.email,\n firstname,\n lastname,\n phone,\n full_name: buildFullName(firstname, lastname),\n avatar: resolveAvatar(data.profile?.profile_picture),\n provider: provider ?? resolveProvider(data),\n }\n}\n\nfunction buildCustomerFromClaims(claims: Record<string, unknown>): CustomerUser {\n const provider: CustomerUser['provider'] = claims.is_google_auth_enabled\n ? 'google'\n : claims.is_facebook_auth_enabled\n ? 'facebook'\n : 'email'\n\n const jwtFullName = String(claims.full_name ?? claims.name ?? '').trim() || undefined\n const { firstname: splitFirst, lastname: splitLast } = splitFullName(jwtFullName)\n\n return {\n id: String(claims.user_id ?? claims.sub ?? ''),\n email: String(claims.email ?? ''),\n firstname: splitFirst || undefined,\n lastname: splitLast || undefined,\n phone: String(claims.phone ?? '').trim() || undefined,\n full_name: jwtFullName,\n avatar: claims.avatar as string | null,\n provider,\n }\n}\n\n/** GET /auth/profile/ */\nexport async function getMe(): Promise<CustomerUser> {\n const { data } = await authAxios.get<AuthUserResponse>('/auth/profile/')\n return mapAuthUserToCustomer(data)\n}\n\n/** GET /auth/profile/ - alias for getMe for backward compatibility */\nexport async function getAuthUser(): Promise<AuthUserResponse> {\n const { data } = await authAxios.get<AuthUserResponse>('/auth/profile/')\n return data\n}\n\n/** PUT /auth/profile/ — update firstname, lastname, phone */\nexport async function updateProfile(payload: UpdateProfilePayload): Promise<CustomerUser> {\n const { data } = await authAxios.put<AuthUserResponse>('/auth/profile/', payload)\n return mapAuthUserToCustomer(data)\n}\n\nlet refreshPromise: Promise<{ user: CustomerUser; provider: CustomerUser['provider'] } | null> | null = null;\n\n/**\n * Helper to classify error types for proper handling.\n */\nfunction classifyError(error: unknown): { isNetworkError: boolean; isAuthError: boolean; isBlacklistedError: boolean } {\n const err = error as { response?: { status?: number; data?: { detail?: string } }; code?: string; message?: string }\n const isNetworkError = !!(!err.response && (err.code === 'ECONNABORTED' || err.code === 'ERR_NETWORK' || err.message?.includes('Network Error')))\n const isAuthError = !!(err.response?.status === 401 || err.response?.status === 403)\n const isBlacklistedError = !!(err.response?.data?.detail === 'Token is blacklisted' || err.message === 'Token is blacklisted')\n return { isNetworkError, isAuthError, isBlacklistedError }\n}\n\n/**\n * Helper to retry with exponential backoff for transient network errors.\n */\nasync function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxRetries: number = 2,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: unknown\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n const { isNetworkError, isAuthError } = classifyError(error)\n\n // Only retry on network errors, not auth errors\n if (!isNetworkError || isAuthError) {\n throw error\n }\n\n // Don't retry on the last attempt\n if (attempt === maxRetries) {\n throw error\n }\n\n // Exponential backoff: 1s, 2s, 4s, etc.\n const delay = baseDelay * Math.pow(2, attempt)\n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n throw lastError\n}\n\n/**\n * Silently refresh the access token on app boot.\n * Builds CustomerUser from JWT claims — no additional profile API call needed.\n * Returns null if no refresh token exists or if the refresh fails.\n * Includes a concurrent lock to prevent React Strict Mode from double-firing and blacklisting the token.\n * \n * Network error resilience:\n * - Classifies errors as network vs auth\n * - Retries transient network errors with exponential backoff\n * - Immediately fails on auth errors (401/403) to avoid infinite loops\n * - Clears auth state on any failure to ensure consistent logout behavior\n */\nexport async function silentRefresh(): Promise<{ user: CustomerUser; provider: CustomerUser['provider'] } | null> {\n const refresh = tokenStore.getRefreshToken()\n if (!refresh) return null\n\n if (refreshPromise) return refreshPromise;\n\n refreshPromise = (async () => {\n try {\n // Use retry with backoff for network resilience\n const tokens = await retryWithBackoff(() => refreshToken(refresh), 2, 1000)\n\n tokenStore.setAccessToken(tokens.access)\n if (tokens.refresh) tokenStore.setRefreshToken(tokens.refresh, tokenStore.isPersistent())\n\n // Decode user identity from the new access token — avoids a fragile /profile/ round-trip\n const claims = parseJwtPayload(tokens.access)\n const user = buildCustomerFromClaims(claims)\n\n return { user, provider: user.provider }\n } catch (error: unknown) {\n const { isNetworkError, isAuthError, isBlacklistedError } = classifyError(error)\n\n if (isNetworkError) {\n logger.warn('[silentRefresh] Network error during token refresh (offline/CORS), clearing session:', error)\n } else if (isBlacklistedError) {\n logger.log('[silentRefresh] Token was blacklisted (likely from logout), clearing session')\n } else if (isAuthError) {\n logger.log('[silentRefresh] Token refresh failed with auth error (expired/invalid), clearing session')\n } else {\n logger.error('[silentRefresh] Unexpected error during token refresh, clearing session:', error)\n }\n\n // CRITICAL: Clear auth state immediately on ANY refresh failure\n // This prevents partial session state and ensures consistent logout behavior\n tokenStore.clearAll()\n return null\n } finally {\n refreshPromise = null;\n }\n })();\n\n return refreshPromise;\n}\n\n/** Store tokens after OAuth callback or login/register response. */\nexport function storeTokens(access: string, refresh: string, remember = true): void {\n tokenStore.setAccessToken(access)\n tokenStore.setRefreshToken(refresh, remember)\n}\n\n// ── Helper Functions ─────────────────────────────────────────────────────────\n\nfunction buildFullName(firstname?: string, lastname?: string): string {\n if (firstname && lastname) return `${firstname} ${lastname}`\n return firstname || lastname || ''\n}\n\nfunction splitFullName(fullName?: string): { firstname: string; lastname: string } {\n if (!fullName) return { firstname: '', lastname: '' }\n\n const parts = fullName.trim().split(/\\s+/)\n if (parts.length === 1) {\n return { firstname: parts[0], lastname: '' }\n }\n\n return {\n firstname: parts[0],\n lastname: parts.slice(1).join(' ')\n }\n}\n","/**\n * Product Service\n * \n * Handles product operations using GraphQL.\n */\nimport { getGraphQLClient } from '../client/graphqlClient'\nimport type { Product, PaginatedResponse, ListParams } from '../types/store'\n\n// GraphQL queries would be defined here or imported\n// For now, we'll use placeholder queries that need to be replaced with actual GraphQL\n\nconst GET_STOREFRONT_PRODUCTS = `\n query GetStorefrontProducts($page: Int!, $pageSize: Int!, $collectionSlug: String, $search: String) {\n storefront_products(page: $page, pageSize: $pageSize, collectionSlug: $collectionSlug, search: $search) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_PRODUCT_BY_SLUG = `\n query GetStorefrontProductBySlug($slug: String!) {\n storefront_product_by_slug(slug: $slug) {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n }\n`\n\nconst GET_STOREFRONT_LATEST = `\n query GetStorefrontLatest($page: Int!, $pageSize: Int!) {\n storefront_latest(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_POPULAR = `\n query GetStorefrontPopular($page: Int!, $pageSize: Int!) {\n storefront_popular(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_FEATURED = `\n query GetStorefrontFeatured($page: Int!, $pageSize: Int!) {\n storefront_featured(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_NEW = `\n query GetStorefrontNew($page: Int!, $pageSize: Int!) {\n storefront_new(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_RECOMMENDED = `\n query GetStorefrontRecommended($page: Int!, $pageSize: Int!, $excludeProductId: String) {\n storefront_recommended(page: $page, pageSize: $pageSize, excludeProductId: $excludeProductId) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images { url alt id }\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images { url alt id }\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\n/**\n * Fetch all active products for the storefront.\n */\nexport async function getStorefrontProducts(params?: ListParams): Promise<PaginatedResponse<Product>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n collectionSlug: params?.collectionSlug,\n search: params?.search,\n }\n const data = await client.request(GET_STOREFRONT_PRODUCTS, variables)\n return data.storefront_products\n}\n\n/**\n * Fetch a single product by slug for the storefront.\n */\nexport async function getStorefrontProductBySlug(slug: string): Promise<Product> {\n const client = getGraphQLClient()\n const data = await client.request(GET_STOREFRONT_PRODUCT_BY_SLUG, { slug })\n return data.storefront_product_by_slug\n}\n\n/**\n * Fetch latest products for the storefront.\n */\nexport async function getLatestProducts(params?: ListParams): Promise<PaginatedResponse<Product>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_LATEST, variables)\n return data.storefront_latest\n}\n\n/**\n * Fetch popular products for the storefront.\n */\nexport async function getPopularProducts(params?: ListParams): Promise<PaginatedResponse<Product>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_POPULAR, variables)\n return data.storefront_popular\n}\n\n/**\n * Fetch featured products for the storefront.\n */\nexport async function getFeaturedProducts(params?: ListParams): Promise<PaginatedResponse<Product>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_FEATURED, variables)\n return data.storefront_featured\n}\n\n/**\n * Fetch new products for the storefront.\n */\nexport async function getNewProducts(params?: ListParams): Promise<PaginatedResponse<Product>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_NEW, variables)\n return data.storefront_new\n}\n\n/**\n * Fetch recommended products for the storefront.\n * Returns featured, popular, and new products.\n * Optionally excludes a specific product ID.\n */\nexport async function getRecommendedProducts(params?: ListParams & { excludeProductId?: string }): Promise<PaginatedResponse<Product>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n excludeProductId: params?.excludeProductId,\n }\n const data = await client.request(GET_STOREFRONT_RECOMMENDED, variables)\n return data.storefront_recommended\n}\n\r\n","/**\n * Collection Service\n * \n * Handles collection operations using GraphQL.\n */\nimport { getGraphQLClient } from '../client/graphqlClient'\nimport type { Collection, PaginatedResponse, ListParams } from '../types/store'\n\nconst GET_STOREFRONT_COLLECTIONS = `\n query GetStorefrontCollections($page: Int!, $pageSize: Int!) {\n storefront_collections(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_COLLECTION_BY_SLUG = `\n query GetStorefrontCollectionBySlug($slug: String!) {\n storefront_collection_by_slug(slug: $slug) {\n id\n business_id\n name\n slug\n description\n image { url alt id }\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n`\n\n/**\n * Fetch paginated active collections for the storefront.\n */\nexport async function getStorefrontCollections(\n params?: ListParams\n): Promise<PaginatedResponse<Collection>> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n }\n const data = await client.request(GET_STOREFRONT_COLLECTIONS, variables)\n return data.storefront_collections\n}\n\n/**\n * Fetch a single collection by its slug.\n */\nexport async function getStorefrontCollectionBySlug(\n slug: string\n): Promise<Collection> {\n const client = getGraphQLClient()\n const data = await client.request(GET_STOREFRONT_COLLECTION_BY_SLUG, { slug })\n return data.storefront_collection_by_slug\n}\n","/**\n * Wishlist Service\n * \n * Handles wishlist operations.\n */\nimport { storeManagementAxios } from '../client/httpClient'\nimport { getGraphQLClient } from '../client/graphqlClient'\nimport type { WishlistItem, WishlistListResponse, WishlistCheckResponse } from '../types/store'\n\nconst GET_WISHLIST = `\n query GetWishlist($page: Int!, $pageSize: Int!) {\n wishlist(page: $page, pageSize: $pageSize) {\n items {\n id\n product_id\n notes\n created_at\n product_name\n product_slug\n product_price\n product_image\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst CHECK_IN_WISHLIST = `\n query CheckInWishlist($productId: String!) {\n check_in_wishlist(productId: $productId) {\n in_wishlist\n }\n }\n`\n\n/**\n * Fetch the customer's wishlist for the current business.\n */\nexport async function getWishlist(params?: { page?: number; pageSize?: number }): Promise<WishlistListResponse> {\n const client = getGraphQLClient()\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n }\n const data = await client.request(GET_WISHLIST, variables)\n return data.wishlist\n}\n\n/**\n * Check if a product is in the customer's wishlist.\n */\nexport async function checkInWishlist(productId: string): Promise<WishlistCheckResponse> {\n const client = getGraphQLClient()\n const data = await client.request(CHECK_IN_WISHLIST, { productId })\n return data.check_in_wishlist\n}\n\n/**\n * Add a product to the customer's wishlist.\n */\nexport async function addToWishlist(productId: string, notes?: string): Promise<WishlistItem> {\n const { data } = await storeManagementAxios.post<WishlistItem>(\"wishlist/\", {\n product_id: productId,\n notes: notes || undefined,\n })\n return data\n}\n\n/**\n * Remove an item from the customer's wishlist by item ID.\n */\nexport async function removeFromWishlist(itemId: string): Promise<void> {\n await storeManagementAxios.delete(`wishlist/${itemId}`)\n}\n\n/**\n * Remove a product from the customer's wishlist by product ID.\n */\nexport async function removeProductFromWishlist(productId: string): Promise<void> {\n await storeManagementAxios.delete(`wishlist/product/${productId}`)\n}\n","/**\n * Payment Service\n * \n * Customer-facing payment API for payment initiation and verification.\n */\nimport { paymentAxios } from '../client/httpClient'\nimport type {\n ConversionQuote,\n DVACreateRequest,\n DVADetails,\n PaymentInitiateRequest,\n PaymentInitiateResponse,\n TransactionVerifyResponse,\n} from '../types/payments/index'\n\n/**\n * Create a Monnify Dedicated Virtual Account so the customer can pay via\n * bank transfer. Note: Monnify DVA only supports NGN currency - the backend\n * will reject non-NGN requests for this payment method.\n */\nexport async function createDedicatedAccount(\n request: DVACreateRequest\n): Promise<DVADetails> {\n const isValidUUID = (str: string) => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(str);\n }\n\n const { data } = await paymentAxios.post<DVADetails>(\n 'payments/dedicated-account',\n {\n order_id: request.order_id && isValidUUID(request.order_id) ? request.order_id : undefined,\n amount: request.amount,\n customer_email: request.customer_email,\n customer_name: request.customer_name,\n currency: request.currency,\n idempotency_key: request.idempotency_key,\n }\n )\n return data\n}\n\n/**\n * Initiate a card payment (customer → business owner).\n * Routes to Monnify (NGN) or Flutterwave (non-NGN) on the backend.\n * Returns a checkout_url to redirect the customer to the gateway.\n */\nexport async function initiatePayment(\n request: PaymentInitiateRequest\n): Promise<PaymentInitiateResponse> {\n const isValidUUID = (str: string) => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(str);\n }\n\n const validOrderId = request.order_id && isValidUUID(request.order_id) ? request.order_id : undefined;\n\n const { data } = await paymentAxios.post<{\n id: string\n gateway_ref: string\n gateway: string\n status: string\n metadata_json?: { checkout_url?: string }\n }>('payments/storefront/initiate', {\n amount: request.amount,\n currency: request.currency,\n order_id: validOrderId,\n quote_id: request.quote_id,\n metadata_json: {\n customer_email: request.customer_email,\n customer_name: request.customer_name ?? '',\n order_id: validOrderId,\n ...(request.metadata ?? {}),\n },\n idempotency_key: request.idempotency_key,\n })\n\n return {\n id: data.id,\n gateway_ref: data.gateway_ref,\n gateway: data.gateway,\n status: data.status,\n checkout_url: data.metadata_json?.checkout_url ?? '',\n }\n}\n\n/**\n * Request a 15-minute rate-locked conversion quote for non-NGN transactions.\n */\nexport async function requestQuote(\n amount: number\n): Promise<ConversionQuote> {\n const { data } = await paymentAxios.post<ConversionQuote>('payments/quote', { amount })\n return data\n}\n\n/**\n * Verify a payment after the gateway redirects back to /checkout/verify.\n */\nexport async function verifyTransaction(\n reference: string\n): Promise<TransactionVerifyResponse> {\n const { data } = await paymentAxios.post<TransactionVerifyResponse>(\n `payments/verify/${reference}`\n )\n return data\n}\n\n/**\n * Poll transaction status by internal transaction ID.\n */\nexport async function getTransactionStatus(\n transactionId: string\n): Promise<TransactionVerifyResponse> {\n const { data } = await paymentAxios.get<TransactionVerifyResponse>(\n `payments/transactions/${transactionId}`\n )\n return data\n}\n\nexport const paymentService = {\n createDedicatedAccount,\n initiatePayment,\n requestQuote,\n verifyTransaction,\n getTransactionStatus,\n} as const\n","/**\n * Consultation Service\n * \n * Handles consultation operations for bespoke and service products.\n */\nimport { storeManagementAxios } from '../client/httpClient'\nimport type {\n Consultation,\n ConsultationCreatePayload,\n ConsultationMessagePayload,\n ConsultationQuoteAcceptPayload,\n} from '../types/consultations'\n\nexport async function createConsultation(payload: ConsultationCreatePayload): Promise<Consultation> {\n const { data } = await storeManagementAxios.post<Consultation>('social/consultations/', payload)\n return data\n}\n\nexport async function getConsultations(): Promise<Consultation[]> {\n const { data } = await storeManagementAxios.get<Consultation[]>('social/consultations/')\n return data\n}\n\nexport async function getConsultation(id: string): Promise<Consultation> {\n const { data } = await storeManagementAxios.get<Consultation>(`social/consultations/${id}`)\n return data\n}\n\nexport async function sendMessage(id: string, payload: ConsultationMessagePayload): Promise<void> {\n await storeManagementAxios.post(`social/consultations/${id}/messages`, payload)\n}\n\nexport async function acceptQuote(id: string, payload: ConsultationQuoteAcceptPayload): Promise<Consultation> {\n const { data } = await storeManagementAxios.post<Consultation>(`social/consultations/${id}/accept-quote`, payload)\n return data\n}\n\nexport async function rejectQuote(id: string, reason?: string): Promise<Consultation> {\n const { data } = await storeManagementAxios.post<Consultation>(`social/consultations/${id}/reject-quote`, { reason })\n return data\n}\n\n// Service object export for backward compatibility\nexport const consultationService = {\n createConsultation,\n getConsultations,\n getConsultation,\n sendMessage,\n acceptQuote,\n rejectQuote,\n}\n","/**\n * Logistics Service\n * \n * Handles shipping rates and address validation.\n */\nimport { storeManagementAxios } from '../client/httpClient'\nimport type { ShippingRatesResponse } from '../types/store/shipping'\nimport type { Product, ProductVariant } from '../types/store'\n\nexport interface CartItemPayload {\n product: {\n name: string\n price: number\n weight: number\n }\n variant: ProductVariant | null\n quantity: number\n}\n\nexport interface RateAddress {\n city: string\n state: string\n country: string\n}\n\nexport interface ShippingRatesRequest {\n cart_items: CartItemPayload[]\n origin_address: RateAddress\n destination_address: RateAddress\n currency?: string\n}\n\n/**\n * Fetch shipping rates for a cart.\n */\nexport async function getShippingRates(\n payload: ShippingRatesRequest\n): Promise<ShippingRatesResponse> {\n const { data } = await storeManagementAxios.post<ShippingRatesResponse>(\n 'logistics/shipping/rates',\n payload\n )\n return data\n}\n\n/**\n * Fetch the seller's registered shipping address.\n */\nexport async function getSellerShippingAddress(): Promise<{\n terminal_address_id: string | null\n address_details: {\n city: string\n state: string\n country: string\n line1: string\n line2: string\n zip: string\n } | null\n business_id: string\n message: string\n}> {\n const { data } = await storeManagementAxios.get('logistics/shipping-address')\n return data\n}\n\n/**\n * Validate a shipping address.\n */\nexport async function validateShippingAddress(\n payload: {\n first_name: string\n last_name: string\n phone: string\n address_line1: string\n address_line2?: string\n city: string\n state: string\n country: string\n postal_code?: string\n }\n): Promise<{\n valid: boolean\n message?: string\n data?: Array<{ name: string; city_id: string; stateCode: string; countryCode: string }>\n}> {\n const { data } = await storeManagementAxios.post('logistics/shipping-address/validate', payload)\n return data\n}\n\n// Service object for backward compatibility\nexport const logisticsService = {\n getShippingRates,\n getSellerShippingAddress,\n validateShippingAddress,\n}\n","/**\n * Bespoke Service\n * \n * Handles bespoke product availability checks.\n */\nimport { storeManagementAxios } from '../client/httpClient'\nimport type { BespokeAvailability } from '../types/consultations'\n\nexport async function checkAvailability(product_id: string): Promise<BespokeAvailability> {\n const { data } = await storeManagementAxios.get<BespokeAvailability>(`bespoke/availability/${product_id}`)\n return data\n}\n\n// Service object export for backward compatibility\nexport const bespokeService = {\n checkAvailability,\n}\n","/**\n * Service Booking Service\n * \n * Handles service appointments and deliverables.\n */\nimport { storeManagementAxios } from '../client/httpClient'\nimport type {\n ServiceAppointment,\n ServiceAppointmentCreatePayload,\n AvailableSlot,\n ServiceDeliverable,\n DeliverableApprovalPayload,\n} from '../types/services'\n\nexport async function getAvailableSlots(\n product_id: string,\n date_from: string,\n date_to: string\n): Promise<AvailableSlot[]> {\n const { data } = await storeManagementAxios.get<AvailableSlot[]>(\n `service/available-slots/${product_id}`,\n { params: { date_from, date_to } }\n )\n return data\n}\n\nexport async function bookAppointment(\n payload: ServiceAppointmentCreatePayload\n): Promise<ServiceAppointment> {\n const { data } = await storeManagementAxios.post<ServiceAppointment>('service/appointments/', payload)\n return data\n}\n\nexport async function getAppointments(): Promise<ServiceAppointment[]> {\n const { data } = await storeManagementAxios.get<ServiceAppointment[]>('service/bookings/my')\n return data\n}\n\nexport async function getAppointment(id: string): Promise<ServiceAppointment> {\n const { data } = await storeManagementAxios.get<ServiceAppointment>(`service/bookings/${id}`)\n return data\n}\n\nexport async function cancelAppointment(id: string): Promise<void> {\n await storeManagementAxios.delete(`service/bookings/${id}`)\n}\n\nexport async function getDeliverables(order_id: string): Promise<ServiceDeliverable[]> {\n const { data } = await storeManagementAxios.get<ServiceDeliverable[]>(`service/projects/${order_id}/deliverables/`)\n return data\n}\n\nexport async function approveDeliverable(\n order_id: string,\n deliverable_id: string\n): Promise<ServiceDeliverable> {\n const { data } = await storeManagementAxios.post<ServiceDeliverable>(\n `service/projects/${order_id}/deliverables/${deliverable_id}/approve`,\n { approved: true }\n )\n return data\n}\n\nexport async function requestRevision(\n order_id: string,\n deliverable_id: string,\n feedback: string\n): Promise<ServiceDeliverable> {\n const { data } = await storeManagementAxios.post<ServiceDeliverable>(\n `service/projects/${order_id}/deliverables/${deliverable_id}/revision`,\n { approved: false, feedback }\n )\n return data\n}\n\n// Service object export for backward compatibility\nexport const serviceBookingService = {\n getAvailableSlots,\n bookAppointment,\n getAppointments,\n getAppointment,\n cancelAppointment,\n getDeliverables,\n approveDeliverable,\n requestRevision,\n}\n","/**\n * Notification Service\n * \n * Handles contact form submissions and email notifications.\n */\nimport { notificationsAxios } from '../client/httpClient'\n\nexport interface ContactFormData {\n name: string\n email: string\n subject: string\n message: string\n source?: string\n company_name?: string\n current_year?: number\n turnstile_token?: string\n}\n\n/**\n * Send contact email to Luxe team.\n * POST /contact/send-contact-email\n */\nexport async function sendContactEmail(\n payload: ContactFormData\n): Promise<{ detail: string }> {\n const { data } = await notificationsAxios.post<{ detail: string }>(\n 'contact/send-contact-email',\n payload\n )\n return data\n}\n\n/**\n * Send confirmation email to user.\n * POST /contact/send-contact-confirmation\n */\nexport async function sendContactConfirmation(\n payload: Omit<ContactFormData, 'turnstile_token'>\n): Promise<{ detail: string }> {\n const { data } = await notificationsAxios.post<{ detail: string }>(\n 'contact/send-contact-confirmation',\n payload\n )\n return data\n}\n\nexport const notificationsService = {\n sendContactEmail,\n sendContactConfirmation,\n} as const\n","/**\n * App Service\n * \n * Handles translation and other app-level utilities.\n */\n\nexport async function googleTranslate(text: string, target: string, source = \"en\"): Promise<string> {\n if (!text || target === source) return text;\n try {\n const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${source}&tl=${target}&dt=t&q=${encodeURIComponent(text)}`;\n const res = await fetch(url);\n const data = (await res.json()) as [Array<[string, string]>, ...unknown[]];\n return (data?.[0] || []).map((s) => s[0]).join(\"\");\n } catch {\n return text;\n }\n}\n","/**\n * Config Service\n *\n * Handles configuration endpoints (languages, currencies, locales, business config).\n */\nimport { paymentAxios, publicStoreAxios } from '../client/httpClient'\nimport type { BackendLanguage, SupportedLanguagesResponse, SupportedCurrenciesResponse } from '../types/payments'\nimport type { BusinessConfig } from '../types/business'\n\n/**\n * Fetch supported languages from the payment system.\n * Resolves to: {luxePaymentBackendUrl}/config/supported-languages\n */\nexport async function getSupportedLanguages(): Promise<SupportedLanguagesResponse> {\n const { data } = await paymentAxios.get<SupportedLanguagesResponse>('/config/supported-languages')\n return data\n}\n\n/**\n * Fetch supported currencies from the payment system.\n * Resolves to: {luxePaymentBackendUrl}/config/supported-currencies\n */\nexport async function getSupportedCurrencies(): Promise<SupportedCurrenciesResponse> {\n const { data } = await paymentAxios.get<SupportedCurrenciesResponse>('/config/supported-currencies')\n return data\n}\n\n/**\n * Fetch the business's public configuration, including store_currency.\n * Uses publicStoreAxios (X-Storefront-Key + X-Business-ID — no user JWT required).\n * Resolves to: {luxeStoreBackendUrl}/business/profile\n */\nexport async function getBusinessConfig(): Promise<BusinessConfig> {\n const { data } = await publicStoreAxios.get<BusinessConfig>('business/profile')\n return data\n}\n\nexport const configService = {\n getSupportedLanguages,\n getSupportedCurrencies,\n getBusinessConfig,\n} as const\n","/**\n * CMS Service\n * \n * Handles CMS model and entry operations using the kasuvia-cms SDK endpoints.\n * Protected by X-Storefront-Key and X-Business-ID headers.\n */\nimport { cmsAxios } from '../client/httpClient'\nimport { getRuntimeConfig } from '../config'\nimport type {\n CmsEntry,\n CmsEntryListResponse,\n CreateCmsEntryParams,\n UpdateCmsEntryParams,\n ListCmsEntriesParams,\n} from '../types/cms'\n\n/**\n * List CMS entries for a specific model.\n * Requires public_api.read permission on the model.\n */\nexport async function listCmsEntries(\n modelSlug: string,\n params?: ListCmsEntriesParams\n): Promise<CmsEntryListResponse> {\n const config = getRuntimeConfig()\n const { businessId } = config\n\n const response = await cmsAxios.get<CmsEntryListResponse>(\n `/sdk/${businessId}/${modelSlug}/entries`,\n {\n params: {\n page: params?.page || 1,\n page_size: params?.page_size || 50,\n },\n }\n )\n\n return response.data\n}\n\n/**\n * Get a single CMS entry by ID.\n * Requires public_api.read permission on the model.\n */\nexport async function getCmsEntry(\n modelSlug: string,\n entryId: string\n): Promise<CmsEntry> {\n const config = getRuntimeConfig()\n const { businessId } = config\n\n const response = await cmsAxios.get<CmsEntry>(\n `/sdk/${businessId}/${modelSlug}/entries/${entryId}`\n )\n\n return response.data\n}\n\n/**\n * Create a new CMS entry.\n * Requires public_api.create permission on the model.\n */\nexport async function createCmsEntry(\n modelSlug: string,\n params: CreateCmsEntryParams\n): Promise<CmsEntry> {\n const config = getRuntimeConfig()\n const { businessId } = config\n\n const response = await cmsAxios.post<CmsEntry>(\n `/sdk/${businessId}/${modelSlug}/entries`,\n params\n )\n\n return response.data\n}\n\n/**\n * Update an existing CMS entry.\n * Requires public_api.update permission on the model.\n */\nexport async function updateCmsEntry(\n modelSlug: string,\n entryId: string,\n params: UpdateCmsEntryParams\n): Promise<CmsEntry> {\n const config = getRuntimeConfig()\n const { businessId } = config\n\n const response = await cmsAxios.put<CmsEntry>(\n `/sdk/${businessId}/${modelSlug}/entries/${entryId}`,\n params\n )\n\n return response.data\n}\n\n/**\n * Delete a CMS entry.\n * Requires public_api.delete permission on the model.\n */\nexport async function deleteCmsEntry(\n modelSlug: string,\n entryId: string\n): Promise<void> {\n const config = getRuntimeConfig()\n const { businessId } = config\n\n await cmsAxios.delete(\n `/sdk/${businessId}/${modelSlug}/entries/${entryId}`\n )\n}\n","/**\n * Cart Hook & Context Provider\n *\n * React Query hooks for cart operations with unified drawer state sharing.\n */\nimport React, { createContext, useContext, useState, type ReactNode } from 'react'\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { getCart, addToCart, updateCartItem, removeFromCart, clearCart, mergeGuestCartIfPresent } from '../services/cart.service'\nimport { isInitialized } from '../config'\nimport type { CartItem, CartResponse, Product } from '../types/store'\nimport axios from 'axios'\n\ninterface ProductTypeMismatchDetail {\n code?: string\n message?: string\n existing_type?: string\n new_type?: string\n}\n\nexport interface UseCartReturn {\n cart: CartResponse | undefined\n items: CartItem[]\n count: number\n isOpen: boolean\n setOpen: (open: boolean) => void\n isLoading: boolean\n error: Error | null\n addToCart: (item: {\n product_id: string\n product_slug: string\n product_name: string\n image?: string\n variant_id?: string\n variant_attributes?: string\n unit_price: number\n quantity: number\n custom_measurements?: string\n is_bespoke: boolean\n }) => void\n updateCartItem: (variables: { itemId: string; quantity: number }) => void\n removeFromCart: (itemId: string) => void\n clearCart: () => void\n clear: () => void\n mergeGuestCart: () => void\n addItem: (product: Product, variantId?: string, quantity?: number, customMeasurements?: Record<string, string>) => void\n updateQty: (itemId: string, quantity: number) => void\n removeItem: (itemId: string) => void\n subtotal: number\n productTypeMismatch: {\n message: string\n existing_type: string\n new_type: string\n } | null\n handleClearCartAndAdd: () => void\n handleKeepCurrentCart: () => void\n}\n\n// ── React Context for Shared Drawer State ─────────────────────────────────────\n\nexport interface CartContextValue {\n isOpen: boolean\n setOpen: (open: boolean) => void\n}\n\nexport const CartCtx = React.createContext ? React.createContext<CartContextValue | null>(null) : null\n\nexport function CartProvider({ children }: { children: ReactNode }) {\n const [isOpen, setIsOpen] = useState(false)\n if (!CartCtx) return children\n return React.createElement(CartCtx.Provider, { value: { isOpen, setOpen: setIsOpen } }, children)\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────────\n\nexport function useCart(): UseCartReturn {\n const queryClient = useQueryClient()\n const context = CartCtx ? useContext(CartCtx) : null\n\n const isOpen = context ? context.isOpen : false\n const setOpen = context ? context.setOpen : () => {}\n\n // Track product type mismatch errors from cart operations\n const [productTypeMismatch, setProductTypeMismatch] = useState<{\n message: string\n existing_type: string\n new_type: string\n } | null>(null)\n\n const cartQuery = useQuery({\n queryKey: ['cart'],\n queryFn: getCart,\n enabled: isInitialized(),\n })\n\n const addToCartMutation = useMutation({\n mutationFn: addToCart,\n onSuccess: () => {\n setProductTypeMismatch(null) // Clear error on success\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n onError: (error: unknown) => {\n // Handle product type mismatch errors from backend\n if (axios.isAxiosError(error) && error.response?.status === 409) {\n const responseData = error.response?.data as { detail?: ProductTypeMismatchDetail } | undefined\n const errorDetail = responseData?.detail\n if (errorDetail?.code === 'CART_PRODUCT_TYPE_MISMATCH') {\n setProductTypeMismatch({\n message: errorDetail.message ?? 'Your cart contains incompatible items.',\n existing_type: errorDetail.existing_type ?? 'physical',\n new_type: errorDetail.new_type ?? 'physical',\n })\n }\n }\n },\n })\n\n const updateCartItemMutation = useMutation({\n mutationFn: ({ itemId, quantity }: { itemId: string; quantity: number }) =>\n updateCartItem(itemId, quantity),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n const removeFromCartMutation = useMutation({\n mutationFn: removeFromCart,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n const clearCartMutation = useMutation({\n mutationFn: clearCart,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n const mergeGuestCartMutation = useMutation({\n mutationFn: mergeGuestCartIfPresent,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n // Convenience method for adding items with product object\n const addItem = (product: Product, variantId?: string, quantity: number = 1, customMeasurements?: Record<string, string>) => {\n const variant = variantId ? product.variants.find(v => v.id === variantId) : undefined\n return addToCartMutation.mutate({\n product_id: product.id,\n product_slug: product.slug,\n product_name: product.name,\n image: product.images[0]?.url,\n variant_id: variantId,\n variant_attributes: variant?.attributes ? JSON.stringify(variant.attributes) : undefined,\n unit_price: variant?.price ?? product.base_price,\n quantity,\n custom_measurements: customMeasurements ? JSON.stringify(customMeasurements) : undefined,\n is_bespoke: product.is_bespoke,\n })\n }\n\n // Helper methods for storefront compatibility\n const items = cartQuery.data?.items || []\n const subtotal = cartQuery.data?.subtotal || 0\n const count = items.reduce((total, item) => total + item.quantity, 0)\n\n const updateQty = (itemId: string, quantity: number) => {\n updateCartItemMutation.mutate({ itemId, quantity })\n }\n\n const removeItem = (itemId: string) => {\n removeFromCartMutation.mutate(itemId)\n }\n\n const handleClearCartAndAdd = () => {\n clearCartMutation.mutate()\n setProductTypeMismatch(null)\n }\n\n const handleKeepCurrentCart = () => {\n setProductTypeMismatch(null)\n }\n\n return {\n cart: cartQuery.data,\n items,\n count,\n isOpen,\n setOpen,\n isLoading: cartQuery.isLoading,\n error: cartQuery.error,\n addToCart: addToCartMutation.mutate,\n updateCartItem: updateCartItemMutation.mutate,\n removeFromCart: removeFromCartMutation.mutate,\n clearCart: clearCartMutation.mutate,\n clear: clearCartMutation.mutate, // Alias for storefront compatibility\n mergeGuestCart: mergeGuestCartMutation.mutate,\n addItem,\n updateQty,\n removeItem,\n subtotal,\n productTypeMismatch,\n handleClearCartAndAdd,\n handleKeepCurrentCart,\n }\n}\n","/**\n * Orders Hook\n * \n * React Query hook for order operations.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { getOrders, findOrder, createOrder, cancelOrder, trackOrder } from '../services/order.service'\nimport type { Order, FindOrderParams, CreateOrderParams } from '../types/store'\n\nexport function useOrders(params?: { email?: string; page?: number; page_size?: number }) {\n return useQuery({\n queryKey: ['orders', params],\n queryFn: () => getOrders(params),\n })\n}\n\n// Alias for useOrders for backward compatibility\nexport function useOrdersList(params?: { email?: string; page?: number; page_size?: number }) {\n return useOrders(params)\n}\n\nexport function useFindOrder(params: FindOrderParams) {\n return useQuery({\n queryKey: ['order', params],\n queryFn: () => findOrder(params),\n enabled: !!params.email && !!params.order_id,\n })\n}\n\nexport function useOrder(params: FindOrderParams) {\n return useFindOrder(params)\n}\n\nexport function useOrderTracking(orderId: string, token?: string) {\n return useQuery({\n queryKey: ['order-tracking', orderId, token],\n queryFn: () => trackOrder(orderId, token),\n enabled: !!orderId,\n refetchInterval: 30000, // Refetch every 30 seconds for tracking updates\n })\n}\n\nexport function useCreateOrder() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: createOrder,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n\nexport function useCancelOrder() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: ({ orderId, reason }: { orderId: string; reason: string }) =>\n cancelOrder(orderId, reason),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n","/**\n * Auth Hook & Context Provider\n *\n * Provides customer authentication state and modal controls across the storefront.\n */\nimport React, { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from 'react'\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { getAuthUser, loginCustomer, registerCustomer, updateProfile, logout as logoutService, silentRefresh } from '../services/auth.service'\nimport { tokenStore } from '../client/authClient'\nimport { resetGraphQLClient } from '../client/graphqlClient'\nimport { logger } from '../utils/logger'\nimport type {\n CustomerLoginPayload,\n CustomerRegisterPayload,\n UpdateProfilePayload,\n CustomerUser,\n AuthContextValue,\n} from '../types/auth'\n\n// ── React Context ────────────────────────────────────────────────────────────\n\nexport const AuthCtx = React.createContext ? React.createContext<AuthContextValue | null>(null) : null\n\nexport function AuthProvider({ children }: { children: ReactNode }) {\n const [customer, setCustomer] = useState<CustomerUser | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [isModalOpen, setIsModalOpen] = useState(false)\n\n // Rehydrate session from stored refresh token on app boot\n useEffect(() => {\n let voided = false\n ;(async () => {\n setIsLoading(true)\n try {\n const result = await silentRefresh()\n if (!voided && result) {\n setCustomer(result.user)\n resetGraphQLClient()\n }\n } catch (error: unknown) {\n logger.error('[AuthProvider] Session restore failed:', error)\n if (!voided) setCustomer(null)\n } finally {\n if (!voided) setIsLoading(false)\n }\n })()\n return () => {\n voided = true\n }\n }, [])\n\n const openModal = useCallback(() => setIsModalOpen(true), [])\n const closeModal = useCallback(() => {\n setIsModalOpen(false)\n if (typeof window !== 'undefined' && (window.location.hash === '#login' || window.location.hash === '#signup')) {\n window.history.replaceState(null, '', window.location.pathname + window.location.search)\n }\n }, [])\n\n // Listen for #login and #signup hashes to open modal automatically\n useEffect(() => {\n const handleHash = () => {\n if (typeof window === 'undefined') return\n if (window.location.hash === '#login' || window.location.hash === '#signup') {\n if (!isLoading && customer) {\n window.history.replaceState(null, '', window.location.pathname + window.location.search)\n } else if (!isLoading && !customer) {\n setIsModalOpen(true)\n }\n }\n }\n handleHash()\n window.addEventListener('hashchange', handleHash)\n return () => window.removeEventListener('hashchange', handleHash)\n }, [customer, isLoading])\n\n // Reset GraphQL client when customer state changes to ensure auth headers are included\n useEffect(() => {\n resetGraphQLClient()\n }, [customer])\n\n const handleLogout = useCallback(async () => {\n await logoutService()\n setCustomer(null)\n setIsModalOpen(false)\n resetGraphQLClient()\n }, [])\n\n const value: AuthContextValue = {\n customer,\n isLoading,\n isModalOpen,\n openModal,\n closeModal,\n setCustomer,\n logout: handleLogout,\n }\n\n if (!AuthCtx) return children\n return React.createElement(AuthCtx.Provider, { value }, children)\n}\n\n// ── Hooks ────────────────────────────────────────────────────────────────────\n\nexport function useAuthUser() {\n return useQuery({\n queryKey: ['auth-user'],\n queryFn: getAuthUser,\n enabled: !!tokenStore.getAccessToken(),\n })\n}\n\nexport function useLogin() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: loginCustomer,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n}\n\nexport function useRegister() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: registerCustomer,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n}\n\nexport function useUpdateProfile() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: updateProfile,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n },\n })\n}\n\nexport function useLogout() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: logoutService,\n onSuccess: () => {\n queryClient.clear()\n },\n })\n}\n\n/**\n * useAuth()\n * Consumes the AuthCtx provider value. Falls back to local hook query if no provider exists.\n */\nexport function useAuth(): AuthContextValue {\n const context = AuthCtx ? useContext(AuthCtx) : null\n if (context) return context\n\n // Fallback if useAuth is called outside AuthProvider (e.g. simple SSR/unit tests)\n const authUserQuery = useAuthUser()\n const logoutMutation = useLogout()\n\n return {\n customer: authUserQuery.data as CustomerUser | null,\n isLoading: authUserQuery.isLoading,\n isModalOpen: false,\n openModal: () => {},\n closeModal: () => {},\n setCustomer: () => {},\n logout: async () => {\n await logoutMutation.mutateAsync()\n },\n }\n}\n","/**\n * Countries Hook\n * \n * React Query hook for fetching countries list.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { authAxios } from '../client/httpClient'\nimport type { Country } from '../types/ui'\n\nexport async function getCountries(): Promise<Country[]> {\n const { data } = await authAxios.get<Country[]>('auth/countries/')\n return data\n}\n\nexport function useCountries() {\n return useQuery({\n queryKey: ['countries'],\n queryFn: () => getCountries(),\n retry: 1,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n staleTime: 24 * 60 * 60 * 1000, // 24 hours\n })\n}\n","/**\n * States Hook\n * \n * React Query hook for fetching states for a country.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { authAxios } from '../client/httpClient'\nimport type { State } from '../types/ui'\n\nexport async function getStates(countryIso: string): Promise<State[]> {\n if (!countryIso) return []\n const { data } = await authAxios.get<State[]>('auth/countries/', {\n params: { iso: countryIso }\n })\n return data\n}\n\nexport function useStates(countryIso: string) {\n return useQuery({\n queryKey: ['states', countryIso],\n queryFn: () => getStates(countryIso),\n enabled: !!countryIso,\n retry: 1,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n staleTime: 24 * 60 * 60 * 1000, // 24 hours\n })\n}\n","/**\n * Languages Hook\n *\n * React Query hook for fetching supported languages from the payment service.\n * The query is disabled until the SDK is initialized so that no request fires\n * before tenant credentials (businessId, storefrontApiKey) are available.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { getCacheTier } from '../utils/cache'\nimport { getSupportedLanguages } from '../services/config.service'\nimport { isInitialized } from '../config'\nimport type { BackendLanguage, SupportedLang } from '../types/payments'\n\nexport async function getSupportedLanguagesList(): Promise<SupportedLang[]> {\n const data = await getSupportedLanguages()\n return data.languages.map((language: BackendLanguage) => ({\n code: language.code,\n appCode: language.code,\n label: language.label,\n native: language.label,\n flag: language.flag,\n }))\n}\n\nexport function useSupportedLanguages() {\n return useQuery({\n queryKey: ['supported-languages'],\n queryFn: () => getSupportedLanguagesList(),\n enabled: isInitialized(),\n retry: 1,\n ...getCacheTier('high'),\n })\n}\n","/**\n * Currencies Hook\n *\n * React Query hook for fetching supported currencies from the payment service.\n * The query is disabled until the SDK is initialized so that no request fires\n * before tenant credentials (businessId, storefrontApiKey) are available.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { getCacheTier } from '../utils/cache'\nimport { getSupportedCurrencies } from '../services/config.service'\nimport { isInitialized } from '../config'\nimport type { Currency } from '../types/payments'\n\nexport async function getSupportedCurrenciesList(): Promise<Currency[]> {\n const data = await getSupportedCurrencies()\n return data.currencies || []\n}\n\nexport function useCurrencies() {\n return useQuery({\n queryKey: ['supported-currencies'],\n queryFn: () => getSupportedCurrenciesList(),\n enabled: isInitialized(),\n retry: 1,\n ...getCacheTier('high'),\n })\n}\n","/**\n * Bespoke Availability Hook\n * \n * React Query hook for checking bespoke service availability.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { bespokeService } from '../services/bespoke.service'\nimport type { BespokeAvailability } from '../types/consultations'\n\n/**\n * Get bespoke availability for a product\n */\nexport function useBespokeAvailability(product_id: string) {\n return useQuery({\n queryKey: ['bespoke-availability', product_id],\n queryFn: () => bespokeService.checkAvailability(product_id),\n enabled: !!product_id,\n retry: false, // Don't retry if no config exists (returns 404)\n })\n}\n","/**\n * Collections Hooks\n * \n * React Query hooks for fetching collections.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { getStorefrontCollections, getStorefrontCollectionBySlug } from '../services/collection.service'\nimport type { ListParams } from '../types/store'\nimport { getCacheTier } from '../utils/cache'\n\nexport const collectionKeys = {\n all: ['core', 'collections'] as const,\n list: (params?: ListParams) => ['core', 'collections', 'list', params ?? {}] as const,\n slug: (slug: string) => ['core', 'collections', 'slug', slug] as const,\n}\n\n/**\n * Hook to fetch paginated collections for the storefront.\n */\nexport function useStorefrontCollections(params?: ListParams) {\n return useQuery({\n queryKey: collectionKeys.list(params),\n queryFn: () => getStorefrontCollections(params),\n // medium — collections change infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook to fetch a single collection by slug for the storefront.\n */\nexport function useStorefrontCollection(slug: string) {\n return useQuery({\n queryKey: collectionKeys.slug(slug),\n queryFn: () => getStorefrontCollectionBySlug(slug),\n // medium — collection details change infrequently\n ...getCacheTier('medium'),\n enabled: !!slug,\n })\n}\n","/**\n * Products Hooks\n * \n * React Query hooks for fetching products.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport {\n getStorefrontProducts,\n getLatestProducts,\n getPopularProducts,\n getFeaturedProducts,\n getNewProducts,\n getStorefrontProductBySlug,\n getRecommendedProducts\n} from '../services/product.service'\nimport type { ListParams } from '../types/store'\nimport { getCacheTier } from '../utils/cache'\n\nexport const productKeys = {\n all: [\"products\"] as const,\n list: (params?: ListParams) => [...productKeys.all, \"list\", params] as const,\n detail: (slug: string) => [...productKeys.all, \"detail\", slug] as const,\n recommended: (params?: ListParams) => [...productKeys.all, \"recommended\", params] as const,\n latest: (params?: ListParams) => [...productKeys.all, \"latest\", params] as const,\n popular: (params?: ListParams) => [...productKeys.all, \"popular\", params] as const,\n featured: (params?: ListParams) => [...productKeys.all, \"featured\", params] as const,\n new: (params?: ListParams) => [...productKeys.all, \"new\", params] as const,\n}\n\n/**\n * Hook for fetching latest products.\n */\nexport function useLatestProducts(params?: ListParams) {\n return useQuery({\n queryKey: productKeys.latest(params),\n queryFn: () => getLatestProducts(params),\n // medium — latest products change infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching popular products.\n */\nexport function usePopularProducts(params?: ListParams) {\n return useQuery({\n queryKey: productKeys.popular(params),\n queryFn: () => getPopularProducts(params),\n // medium — popular products change infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching featured products.\n */\nexport function useFeaturedProducts(params?: ListParams) {\n return useQuery({\n queryKey: productKeys.featured(params),\n queryFn: () => getFeaturedProducts(params),\n // medium — featured products change infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching new products.\n */\nexport function useNewProducts(params?: ListParams) {\n return useQuery({\n queryKey: productKeys.new(params),\n queryFn: () => getNewProducts(params),\n // medium — new products change infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching all active storefront products.\n */\nexport function useStorefrontProducts(params?: ListParams) {\n return useQuery({\n queryKey: productKeys.list(params),\n queryFn: () => getStorefrontProducts(params),\n // medium — product catalog changes infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching a single product by slug.\n */\nexport function useProduct(slug: string) {\n return useQuery({\n queryKey: productKeys.detail(slug),\n queryFn: () => getStorefrontProductBySlug(slug),\n // medium — product details change infrequently\n ...getCacheTier('medium'),\n enabled: !!slug,\n })\n}\n\n/**\n * Hook for fetching recommended products.\n */\nexport function useRecommendedProducts(params?: ListParams) {\n return useQuery({\n queryKey: productKeys.recommended(params),\n queryFn: () => getRecommendedProducts(params),\n // medium — recommendations change infrequently\n ...getCacheTier('medium'),\n })\n}\n","/**\n * Wishlist Hooks\n * \n * React Query hooks for wishlist operations.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n getWishlist,\n addToWishlist,\n removeFromWishlist,\n removeProductFromWishlist,\n checkInWishlist,\n} from '../services/wishlist.service'\nimport { getCacheTier } from '../utils/cache'\n\nexport const wishlistKeys = {\n all: [\"wishlist\"] as const,\n list: () => [...wishlistKeys.all, \"list\"] as const,\n check: (productId: string) => [...wishlistKeys.all, \"check\", productId] as const,\n}\n\n/**\n * Hook for fetching the customer's wishlist.\n * Authentication-gated only - returns empty for unauthenticated users.\n */\nexport function useWishlist(params?: { page?: number; pageSize?: number }) {\n return useQuery({\n queryKey: [...wishlistKeys.list(), params],\n queryFn: () => getWishlist(params),\n // medium — wishlist changes infrequently\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for checking if a product is in the wishlist.\n * Authentication-gated only - returns false for unauthenticated users.\n */\nexport function useCheckInWishlist(productId: string) {\n return useQuery({\n queryKey: wishlistKeys.check(productId),\n queryFn: () => checkInWishlist(productId),\n // low — wishlist check changes frequently\n ...getCacheTier('low'),\n enabled: !!productId,\n })\n}\n\n/**\n * Hook for adding a product to the wishlist.\n * Authentication-gated only - triggers login modal for unauthenticated users.\n */\nexport function useAddToWishlist() {\n const queryClient = useQueryClient()\n \n return useMutation({\n mutationFn: ({ productId, notes }: { productId: string; notes?: string }) => {\n return addToWishlist(productId, notes)\n },\n onSuccess: () => {\n // Invalidate all wishlist queries to ensure cache is updated\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n // Also invalidate specific check queries for all products\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n}\n\n/**\n * Hook for removing an item from the wishlist by item ID.\n */\nexport function useRemoveFromWishlist() {\n const queryClient = useQueryClient()\n \n return useMutation({\n mutationFn: (itemId: string) => {\n return removeFromWishlist(itemId)\n },\n onSuccess: () => {\n // Invalidate all wishlist queries to ensure cache is updated\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n // Also invalidate specific check queries for all products\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n}\n\n/**\n * Hook for removing a product from the wishlist by product ID.\n */\nexport function useRemoveProductFromWishlist() {\n const queryClient = useQueryClient()\n \n return useMutation({\n mutationFn: (productId: string) => {\n return removeProductFromWishlist(productId)\n },\n onSuccess: () => {\n // Invalidate all wishlist queries to ensure cache is updated\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n // Also invalidate specific check queries for all products\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n}\n\n/**\n * Hook for getting wishlist count.\n * Authentication-gated only - returns 0 for unauthenticated users.\n */\nexport function useWishlistCount() {\n const backendQuery = useQuery({\n queryKey: wishlistKeys.list(),\n queryFn: () => getWishlist(),\n // low — wishlist count changes frequently\n ...getCacheTier('low'),\n select: (data) => data.total,\n })\n\n return backendQuery\n}\n","/**\n * Service Booking Hooks\n * \n * React Query hooks for service bookings.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { serviceBookingService } from '../services/service-booking.service'\nimport type {\n ServiceAppointment,\n ServiceAppointmentCreatePayload,\n ServiceDeliverable,\n} from '../types/services'\n\n/**\n * Get available slots for a service product\n */\nexport function useAvailableSlots(\n product_id: string,\n date_from: string,\n date_to: string\n) {\n return useQuery({\n queryKey: [\"available-slots\", product_id, date_from, date_to],\n queryFn: () =>\n serviceBookingService.getAvailableSlots(product_id, date_from, date_to),\n enabled: !!product_id && !!date_from && !!date_to,\n })\n}\n\n/**\n * Book a service appointment\n */\nexport function useBookAppointment() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: serviceBookingService.bookAppointment,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\n/**\n * Get all appointments for the current user\n */\nexport function useAppointments() {\n return useQuery({\n queryKey: [\"appointments\"],\n queryFn: serviceBookingService.getAppointments,\n })\n}\n\n/**\n * Get a single appointment by ID\n */\nexport function useAppointment(id: string) {\n return useQuery({\n queryKey: [\"appointment\", id],\n queryFn: () => serviceBookingService.getAppointment(id),\n enabled: !!id,\n })\n}\n\n/**\n * Cancel an appointment\n */\nexport function useCancelAppointment() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (id: string) => serviceBookingService.cancelAppointment(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\n/**\n * Get deliverables for a project-based service order\n */\nexport function useDeliverables(order_id: string) {\n return useQuery({\n queryKey: [\"deliverables\", order_id],\n queryFn: () => serviceBookingService.getDeliverables(order_id),\n enabled: !!order_id,\n })\n}\n\n/**\n * Approve a deliverable\n */\nexport function useApproveDeliverable(order_id: string, deliverable_id: string) {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: () =>\n serviceBookingService.approveDeliverable(order_id, deliverable_id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"deliverables\", order_id] })\n },\n })\n}\n\n/**\n * Request revision for a deliverable\n */\nexport function useRequestRevision(order_id: string, deliverable_id: string) {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (feedback: string) =>\n serviceBookingService.requestRevision(order_id, deliverable_id, feedback),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"deliverables\", order_id] })\n },\n })\n}\n","/**\n * Consultations Hooks\n * \n * React Query hooks for consultation operations.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { consultationService } from '../services/consultation.service'\nimport type {\n Consultation,\n ConsultationCreatePayload,\n ConsultationMessagePayload,\n ConsultationQuoteAcceptPayload,\n} from '../types/consultations'\n\nexport function useConsultations() {\n return useQuery({\n queryKey: ['consultations'],\n queryFn: () => consultationService.getConsultations(),\n })\n}\n\nexport function useConsultation(id: string) {\n return useQuery({\n queryKey: ['consultation', id],\n queryFn: () => consultationService.getConsultation(id),\n enabled: !!id,\n })\n}\n\nexport function useCreateConsultation() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (payload: ConsultationCreatePayload) =>\n consultationService.createConsultation(payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultations'] })\n },\n })\n}\n\nexport function useSendMessage(consultationId: string) {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (payload: ConsultationMessagePayload) =>\n consultationService.sendMessage(consultationId, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultation', consultationId] })\n },\n })\n}\n\nexport function useAcceptQuote(consultationId: string) {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (payload: ConsultationQuoteAcceptPayload) =>\n consultationService.acceptQuote(consultationId, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultation', consultationId] })\n },\n })\n}\n\nexport function useRejectQuote(consultationId: string) {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (reason?: string) =>\n consultationService.rejectQuote(consultationId, reason),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultation', consultationId] })\n },\n })\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { fetchEventSource, EventSourceMessage } from '@microsoft/fetch-event-source';\nimport { getBackendUrl } from '../config';\nimport { logger } from '../utils';\n\ninterface ConsultationMessageData {\n event: string;\n data: {\n consultation_id: string;\n message_id: string;\n sender_id: string;\n sender_role: string;\n message: string;\n attachments?: Array<{ url: string; type: string; name: string }>;\n created_at: string;\n };\n}\n\ninterface ConsultationQuoteData {\n event: string;\n data: {\n consultation_id: string;\n quote_amount: number;\n deposit_amount?: number;\n merchant_notes?: string;\n updated_at: string;\n };\n}\n\ninterface ConsultationStatusData {\n event: string;\n data: {\n consultation_id: string;\n status: string;\n updated_at: string;\n };\n}\n\ninterface UseConsultationStreamOptions {\n consultationId: string;\n onMessage?: (data: ConsultationMessageData) => void;\n onQuote?: (data: ConsultationQuoteData) => void;\n onStatusChange?: (data: ConsultationStatusData) => void;\n onError?: (error: Error) => void;\n}\n\nexport function useConsultationStream({\n consultationId,\n onMessage,\n onQuote,\n onStatusChange,\n onError,\n}: UseConsultationStreamOptions) {\n const abortControllerRef = useRef<AbortController | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [lastEvent, setLastEvent] = useState<any>(null);\n\n useEffect(() => {\n if (!consultationId) {\n return;\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n const paymentUrl = getBackendUrl('payment');\n const streamUrl = `${paymentUrl}/events/stream/consultation/${consultationId}`;\n\n fetchEventSource(streamUrl, {\n method: 'GET',\n signal: abortController.signal,\n onmessage: (event: EventSourceMessage) => {\n try {\n if (!event.data || event.data.trim() === '') {\n return;\n }\n\n const data = JSON.parse(event.data);\n logger.log('[ConsultationStream] Received event:', data);\n setLastEvent(data);\n\n if (data.event === 'consultation.message') {\n logger.log('[ConsultationStream] Message detected, calling onMessage');\n if (onMessage) {\n onMessage(data as ConsultationMessageData);\n }\n }\n\n if (data.event === 'consultation.quote') {\n logger.log('[ConsultationStream] Quote detected, calling onQuote');\n if (onQuote) {\n onQuote(data as ConsultationQuoteData);\n }\n }\n\n if (data.event === 'consultation.status') {\n logger.log('[ConsultationStream] Status change detected, calling onStatusChange');\n if (onStatusChange) {\n onStatusChange(data as ConsultationStatusData);\n }\n }\n } catch (error) {\n logger.error('[ConsultationStream] Error parsing event:', error);\n }\n },\n onerror: (error: Error) => {\n if (abortController.signal.aborted) {\n logger.log('[ConsultationStream] Connection closed via AbortController');\n return;\n }\n logger.error('[ConsultationStream] Connection error:', error);\n setIsConnected(false);\n if (onError) {\n onError(error);\n }\n },\n onopen: async (response: Response) => {\n if (response.ok && response.headers.get('content-type')?.includes('text/event-stream')) {\n logger.log('[ConsultationStream] Connection established for consultation:', consultationId);\n setIsConnected(true);\n return;\n }\n throw new Error(`Unexpected response: ${response.status}`);\n },\n }).catch(error => {\n if (abortController.signal.aborted || error.name === 'AbortError') {\n return;\n }\n logger.error('[ConsultationStream] fetchEventSource failed:', error);\n });\n\n return () => {\n abortController.abort();\n setIsConnected(false);\n };\n }, [consultationId, onMessage, onQuote, onStatusChange, onError]);\n\n return { isConnected, lastEvent };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { fetchEventSource, EventSourceMessage } from '@microsoft/fetch-event-source';\nimport { getBackendUrl, getRuntimeConfig, isInitialized } from '../config';\nimport { logger } from '../utils';\n\ninterface PaymentSuccessData {\n event: string;\n data: {\n transaction_id: string;\n order_id: string;\n amount: number;\n currency: string;\n status: string;\n };\n}\n\ninterface DigitalReadyData {\n event: string;\n data: {\n order_id: string;\n business_id: string;\n customer_id: string;\n download_links: Array<{\n item_id: string;\n product_name: string;\n url: string;\n token: string;\n expires_at: string;\n max_downloads: number;\n }>;\n fulfilled_at: string;\n };\n}\n\ninterface BespokeUpdateData {\n event: string;\n data: {\n order_id: string;\n business_id: string;\n update_type: string;\n message: string;\n stage?: string;\n updated_at: string;\n };\n}\n\ninterface ConsultationUpdateData {\n event: string;\n data: {\n consultation_id: string;\n business_id: string;\n customer_id: string;\n status: string;\n message?: string;\n updated_at: string;\n };\n}\n\ninterface ServiceBookingUpdateData {\n event: string;\n data: {\n booking_id: string;\n order_id: string;\n business_id: string;\n customer_id: string;\n status: string;\n appointment_date?: string;\n updated_at: string;\n };\n}\n\ninterface UseOrderStreamOptions {\n orderId: string;\n onPaymentComplete?: (data: PaymentSuccessData) => void;\n onDigitalReady?: (data: DigitalReadyData) => void;\n onBespokeUpdate?: (data: BespokeUpdateData) => void;\n onConsultationUpdate?: (data: ConsultationUpdateData) => void;\n onServiceBookingUpdate?: (data: ServiceBookingUpdateData) => void;\n onError?: (error: Error) => void;\n}\n\nexport function useOrderStream({ \n orderId, \n onPaymentComplete, \n onDigitalReady, \n onBespokeUpdate, \n onConsultationUpdate, \n onServiceBookingUpdate, \n onError \n}: UseOrderStreamOptions) {\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!orderId) {\n return;\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n const paymentUrl = getBackendUrl('payment');\n const streamUrl = `${paymentUrl}/events/stream/order/${encodeURIComponent(orderId)}`;\n\n fetchEventSource(streamUrl, {\n method: 'GET',\n signal: abortController.signal,\n onmessage: (event: EventSourceMessage) => {\n try {\n if (!event.data || event.data.trim() === '') {\n return;\n }\n\n const data = JSON.parse(event.data);\n logger.log('[OrderStream] Received event:', data);\n\n if (data.event === 'payment.success') {\n logger.log('[OrderStream] Payment success detected, calling onPaymentComplete');\n if (onPaymentComplete) {\n onPaymentComplete(data as PaymentSuccessData);\n }\n abortController.abort();\n }\n\n if (data.event === 'digital.ready') {\n logger.log('[OrderStream] Digital delivery ready detected, calling onDigitalReady');\n if (onDigitalReady) {\n onDigitalReady(data as DigitalReadyData);\n }\n }\n\n if (data.event === 'bespoke.update') {\n logger.log('[OrderStream] Bespoke update detected, calling onBespokeUpdate');\n if (onBespokeUpdate) {\n onBespokeUpdate(data as BespokeUpdateData);\n }\n }\n\n if (data.event === 'consultation.update') {\n logger.log('[OrderStream] Consultation update detected, calling onConsultationUpdate');\n if (onConsultationUpdate) {\n onConsultationUpdate(data as ConsultationUpdateData);\n }\n }\n\n if (data.event === 'service_booking.update') {\n logger.log('[OrderStream] Service booking update detected, calling onServiceBookingUpdate');\n if (onServiceBookingUpdate) {\n onServiceBookingUpdate(data as ServiceBookingUpdateData);\n }\n }\n } catch (error) {\n logger.error('[OrderStream] Error parsing event:', error);\n }\n },\n onerror: (error: Error) => {\n if (abortController.signal.aborted) {\n logger.log('[OrderStream] Connection closed via AbortController');\n return;\n }\n if (error.message?.includes('404') || error.message?.includes('Not Found')) {\n logger.warn('[OrderStream] Stream endpoint unavailable for order:', orderId);\n return;\n }\n logger.error('[OrderStream] Connection error:', error);\n if (onError) {\n onError(error);\n }\n },\n onopen: async (response: Response) => {\n if (response.ok && response.headers.get('content-type')?.includes('text/event-stream')) {\n logger.log('[OrderStream] Connection established for order:', orderId);\n return;\n }\n if (response.status === 404) {\n logger.warn('[OrderStream] Stream endpoint unavailable for order:', orderId);\n return;\n }\n throw new Error(`Unexpected response: ${response.status}`);\n },\n }).catch(error => {\n if (abortController.signal.aborted || error.name === 'AbortError') {\n return;\n }\n logger.error('[OrderStream] fetchEventSource failed:', error);\n });\n\n return () => {\n abortController.abort();\n };\n }, [orderId, onPaymentComplete, onDigitalReady, onBespokeUpdate, onConsultationUpdate, onServiceBookingUpdate, onError]);\n\n return null;\n}\n","import { useEffect, useState } from 'react'\n\nexport function useIsMounted() {\n const [mounted, setMounted] = useState(false)\n useEffect(() => {\n setMounted(true)\n }, [])\n return mounted\n}\n","import { useEffect, useCallback, useState, useRef } from \"react\";\nimport { useSupportedLanguages } from \"./use-languages\";\n\ninterface GoogleTranslateOptions {\n pageLanguage: string;\n includedLanguages?: string;\n autoDisplay?: boolean;\n layout?: number;\n}\n\ninterface GoogleTranslateElement {\n new(options: GoogleTranslateOptions, elementId: string): void;\n}\n\ninterface GoogleNamespace {\n translate?: {\n TranslateElement: GoogleTranslateElement;\n };\n}\n\ndeclare global {\n interface Window {\n googleTranslateElementInit?: () => void;\n google?: GoogleNamespace;\n }\n}\n\nconst SCRIPT_ID = \"google-translate-script\";\nconst ELEMENT_ID = \"google_translate_element\";\n\nfunction fireChange(googleCode: string) {\n const combo = document.querySelector<HTMLSelectElement>(\".goog-te-combo\");\n if (combo) {\n combo.value = googleCode;\n combo.dispatchEvent(new Event(\"change\"));\n return true;\n }\n return false;\n}\n\nexport function useGoogleTranslate(appLang: string) {\n const [isLoaded, setIsLoaded] = useState(false);\n const initRef = useRef(false);\n const { data: supportedLangs = [] } = useSupportedLanguages();\n\n const clearCookies = useCallback(() => {\n if (typeof window === \"undefined\") return;\n const domains = [\n window.location.hostname,\n \".\" + window.location.hostname,\n \".\" + window.location.hostname.split('.').slice(-2).join('.')\n ];\n const path = \"/\";\n // Clear googtrans\n document.cookie = `googtrans=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${path};`;\n domains.forEach(domain => {\n document.cookie = `googtrans=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${path}; domain=${domain};`;\n });\n }, []);\n\n const resetToEnglish = useCallback(() => {\n if (typeof window === \"undefined\") return;\n // 1. Check if a translation is actually active via cookie\n const googtrans = document.cookie.split('; ').find(row => row.startsWith('googtrans='))?.split('=')[1];\n\n // 2. Aggressive cookie clearing\n const domains = [\n window.location.hostname,\n \".\" + window.location.hostname,\n window.location.hostname.split('.').slice(-2).join('.'),\n \".\" + window.location.hostname.split('.').slice(-2).join('.')\n ];\n\n const clear = (name: string) => {\n document.cookie = `${name}=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;`;\n domains.forEach(d => {\n document.cookie = `${name}=; Path=/; Domain=${d}; Expires=Thu, 01 Jan 1970 00:00:01 GMT;`;\n });\n };\n\n clear(\"googtrans\");\n\n // 3. If we were translated, force a reload to get clean English\n // We check googtrans existence OR the presence of Google's banner/classes\n if (googtrans || document.documentElement.classList.contains(\"translated-ltr\") || document.querySelector(\".goog-te-banner-frame\")) {\n window.location.reload();\n return;\n }\n\n // 4. UI Cleanup (for cases where reload isn't triggered)\n document.body.style.top = \"0\";\n document.documentElement.classList.remove(\"translated-ltr\", \"translated-rtl\");\n const container = document.getElementById(\":1.container\");\n if (container) container.style.display = \"none\";\n }, []);\n\n const changeLanguage = useCallback((nextAppCode: string) => {\n if (nextAppCode === \"en\") {\n resetToEnglish();\n return;\n }\n\n const googleCode = nextAppCode;\n\n // Show container if hidden\n const container = document.getElementById(\":1.container\");\n if (container) container.style.display = \"block\";\n\n let tries = 0;\n const tick = () => {\n if (fireChange(googleCode)) return;\n if (tries++ < 30) setTimeout(tick, 200);\n };\n tick();\n }, [resetToEnglish]);\n\n // Load script only when a translation is requested\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (appLang === \"en\" && !initRef.current) return;\n if (initRef.current) return;\n if (supportedLangs.length === 0) return;\n\n initRef.current = true;\n\n if (!document.getElementById(ELEMENT_ID)) {\n const host = document.createElement(\"div\");\n host.id = ELEMENT_ID;\n host.style.display = \"none\";\n document.body.appendChild(host);\n }\n\n const includedLanguages = supportedLangs.map((l) => l.code).join(\",\");\n\n window.googleTranslateElementInit = () => {\n if (window.google?.translate?.TranslateElement) {\n new window.google.translate.TranslateElement(\n { pageLanguage: \"en\", includedLanguages, autoDisplay: false },\n ELEMENT_ID,\n );\n setIsLoaded(true);\n }\n };\n\n if (!document.getElementById(SCRIPT_ID)) {\n const script = document.createElement(\"script\");\n script.id = SCRIPT_ID;\n script.src = \"//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit\";\n script.async = true;\n document.body.appendChild(script);\n } else {\n if (window.google?.translate) window.googleTranslateElementInit?.();\n }\n }, [appLang, supportedLangs]);\n\n // Sync language changes\n useEffect(() => {\n if (isLoaded || (appLang === \"en\" && initRef.current)) {\n changeLanguage(appLang);\n }\n }, [appLang, isLoaded, changeLanguage]);\n\n return { isLoaded };\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { paymentService } from \"../services/payment.service\";\nimport { getCacheTier } from \"../utils/cache\";\nimport { isInitialized } from \"../config\";\nimport type { DVACreateRequest, PaymentInitiateRequest } from \"../types/payments\";\n\n\n/**\n * Hook for creating a Dedicated Virtual Account (DVA)\n */\nexport function useCreateDVA() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (request: DVACreateRequest) =>\n paymentService.createDedicatedAccount(request),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['payment'] });\n },\n });\n}\n\n/**\n * Hook for initiating card payment\n */\nexport function useInitiatePayment() {\n return useMutation({\n mutationFn: (request: PaymentInitiateRequest) =>\n paymentService.initiatePayment(request),\n });\n}\n\n/**\n * Hook for verifying a transaction\n */\nexport function useVerifyTransaction() {\n return useMutation({\n mutationFn: (reference: string) =>\n paymentService.verifyTransaction(reference),\n });\n}\n\n/**\n * Hook for getting transaction status\n */\nexport function useTransactionStatus(transactionId: string, enabled = false) {\n return useQuery({\n queryKey: ['transaction', 'status', transactionId],\n queryFn: () => paymentService.getTransactionStatus(transactionId),\n enabled: isInitialized() && enabled,\n ...getCacheTier('none'),\n refetchInterval: 3000, // Poll every 3 seconds\n });\n}\n\n/**\n * Hook for checking transaction status with automatic polling\n */\nexport function usePollTransactionStatus(reference: string, enabled = false) {\n return useQuery({\n queryKey: ['transaction', 'poll', reference],\n queryFn: () => paymentService.verifyTransaction(reference),\n enabled: isInitialized() && enabled,\n ...getCacheTier('none'),\n refetchInterval: 2000, // Poll every 2 seconds\n retry: 10, // Retry up to 10 times\n });\n}\n","/**\n * CMS Hooks\n *\n * React Query hooks for CMS model and entry operations.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n listCmsEntries,\n getCmsEntry,\n createCmsEntry,\n updateCmsEntry,\n deleteCmsEntry,\n} from '../services/cms.service'\nimport { isInitialized } from '../config'\nimport type {\n CmsEntry,\n CmsEntryListResponse,\n CreateCmsEntryParams,\n UpdateCmsEntryParams,\n ListCmsEntriesParams,\n} from '../types/cms'\n\nexport interface UseCmsEntriesReturn {\n entries: CmsEntry[]\n total: number\n page: number\n page_size: number\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\n/**\n * Hook to list CMS entries for a specific model.\n */\nexport function useCmsEntries(\n modelSlug: string,\n params?: ListCmsEntriesParams\n): UseCmsEntriesReturn {\n const query = useQuery({\n queryKey: ['cms-entries', modelSlug, params],\n queryFn: () => listCmsEntries(modelSlug, params),\n enabled: isInitialized() && !!modelSlug,\n })\n\n return {\n entries: query.data?.entries || [],\n total: query.data?.total || 0,\n page: query.data?.page || 1,\n page_size: query.data?.page_size || 50,\n isLoading: query.isLoading,\n error: query.error as Error | null,\n refetch: query.refetch,\n }\n}\n\nexport interface UseCmsEntryReturn {\n entry: CmsEntry | undefined\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\n/**\n * Hook to get a single CMS entry by ID.\n */\nexport function useCmsEntry(\n modelSlug: string,\n entryId: string\n): UseCmsEntryReturn {\n const query = useQuery({\n queryKey: ['cms-entry', modelSlug, entryId],\n queryFn: () => getCmsEntry(modelSlug, entryId),\n enabled: isInitialized() && !!modelSlug && !!entryId,\n })\n\n return {\n entry: query.data,\n isLoading: query.isLoading,\n error: query.error as Error | null,\n refetch: query.refetch,\n }\n}\n\nexport interface UseCreateCmsEntryReturn {\n createEntry: (params: CreateCmsEntryParams) => void\n isLoading: boolean\n error: Error | null\n}\n\n/**\n * Hook to create a new CMS entry.\n */\nexport function useCreateCmsEntry(modelSlug: string): UseCreateCmsEntryReturn {\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: (params: CreateCmsEntryParams) => createCmsEntry(modelSlug, params),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cms-entries', modelSlug] })\n },\n })\n\n return {\n createEntry: mutation.mutate,\n isLoading: mutation.isPending,\n error: mutation.error as Error | null,\n }\n}\n\nexport interface UseUpdateCmsEntryReturn {\n updateEntry: (entryId: string, params: UpdateCmsEntryParams) => void\n isLoading: boolean\n error: Error | null\n}\n\n/**\n * Hook to update an existing CMS entry.\n */\nexport function useUpdateCmsEntry(modelSlug: string): UseUpdateCmsEntryReturn {\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: ({ entryId, params }: { entryId: string; params: UpdateCmsEntryParams }) =>\n updateCmsEntry(modelSlug, entryId, params),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cms-entries', modelSlug] })\n queryClient.invalidateQueries({ queryKey: ['cms-entry', modelSlug] })\n },\n })\n\n return {\n updateEntry: (entryId: string, params: UpdateCmsEntryParams) =>\n mutation.mutate({ entryId, params }),\n isLoading: mutation.isPending,\n error: mutation.error as Error | null,\n }\n}\n\nexport interface UseDeleteCmsEntryReturn {\n deleteEntry: (entryId: string) => void\n isLoading: boolean\n error: Error | null\n}\n\n/**\n * Hook to delete a CMS entry.\n */\nexport function useDeleteCmsEntry(modelSlug: string): UseDeleteCmsEntryReturn {\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: (entryId: string) => deleteCmsEntry(modelSlug, entryId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cms-entries', modelSlug] })\n queryClient.invalidateQueries({ queryKey: ['cms-entry', modelSlug] })\n },\n })\n\n return {\n deleteEntry: mutation.mutate,\n isLoading: mutation.isPending,\n error: mutation.error as Error | null,\n }\n}\n","/**\n * @file storage.ts\n * @description Centralized tenant-isolated storage utility for sessionStorage and localStorage.\n * Automatically prefixes all keys with the storefront Business ID to guarantee multi-tenant segregation.\n */\nimport { getRuntimeConfig } from '../config'\n\nfunction getPrefixedKey(key: string): string {\n const config = getRuntimeConfig()\n const bid = config.businessId\n const cleanKey = key.startsWith('luxe_') ? key.substring(5) : key\n return bid ? `luxe-sf-${bid}-${cleanKey}` : `luxe-sf-anon-${cleanKey}`\n}\n\nexport const sessionStore = {\n get: (key: string): string | null => {\n if (typeof window === 'undefined') return null\n return sessionStorage.getItem(getPrefixedKey(key))\n },\n set: (key: string, value: string): void => {\n if (typeof window === 'undefined') return\n sessionStorage.setItem(getPrefixedKey(key), value)\n },\n remove: (key: string): void => {\n if (typeof window === 'undefined') return\n sessionStorage.removeItem(getPrefixedKey(key))\n },\n getJSON: <T = unknown>(key: string): T | null => {\n if (typeof window === 'undefined') return null\n const value = sessionStorage.getItem(getPrefixedKey(key))\n if (!value) return null\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n },\n setJSON: (key: string, value: unknown): void => {\n if (typeof window === 'undefined') return\n sessionStorage.setItem(getPrefixedKey(key), JSON.stringify(value))\n },\n}\n\nexport const localStore = {\n get: (key: string): string | null => {\n if (typeof window === 'undefined') return null\n return localStorage.getItem(getPrefixedKey(key))\n },\n set: (key: string, value: string): void => {\n if (typeof window === 'undefined') return\n localStorage.setItem(getPrefixedKey(key), value)\n },\n remove: (key: string): void => {\n if (typeof window === 'undefined') return\n localStorage.removeItem(getPrefixedKey(key))\n },\n getJSON: <T = unknown>(key: string): T | null => {\n if (typeof window === 'undefined') return null\n const value = localStorage.getItem(getPrefixedKey(key))\n if (!value) return null\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n },\n setJSON: (key: string, value: unknown): void => {\n if (typeof window === 'undefined') return\n localStorage.setItem(getPrefixedKey(key), JSON.stringify(value))\n },\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmFhC,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6EvC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmF9B,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmF/B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmFhC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["isDevelopment","axios","isDevelopment","import_axios","import_axios","axios","axios","refreshAxios","refreshToken","refreshAxios","buildFullName","splitFullName","import_axios","React","axios","import_react_query","import_react","import_react_query","React","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react","import_react","import_fetch_event_source","import_react","import_react","import_react_query","import_react_query"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context/sdk-context.tsx","../src/constants.ts","../src/types/store/index.ts","../src/services/cart.service.ts","../src/services/order.service.ts","../src/services/auth.service.ts","../src/services/product.service.ts","../src/services/collection.service.ts","../src/services/wishlist.service.ts","../src/services/payment.service.ts","../src/services/consultation.service.ts","../src/services/logistics.service.ts","../src/services/bespoke.service.ts","../src/services/service-booking.service.ts","../src/services/notifications.service.ts","../src/services/app.service.ts","../src/services/config.service.ts","../src/services/cms.service.ts","../src/utils/cache.ts","../src/utils/logger.ts","../src/utils/sanitize-url.ts","../src/utils/customer.ts","../src/utils/checkout.ts","../src/utils/error-handler.ts","../src/utils/storage.ts","../src/utils/validators.ts"],"sourcesContent":["/**\n * @kasuvia/sdk\n * \n * Kasuvia SDK - Core data fetching, authentication, and API client layer\n * Stateless architecture - no global state, all configuration passed as parameters.\n * \n * @example\n * ```ts\n * import { getStorefrontProductBySlug } from '@kasuvia/sdk'\n * import { useCart, useAuth } from '@kasuvia/sdk/hooks'\n * import type { SdkConfig } from '@kasuvia/sdk'\n * \n * // Use in server components\n * const config: SdkConfig = {\n * businessId: 'B-123ABC',\n * storefrontApiKey: 'your-api-key',\n * backendUrls: {\n * auth: 'http://...',\n * store: 'http://...',\n * payment: 'http://...',\n * notifications: 'http://...',\n * cms: 'http://...',\n * }\n * }\n * const product = await getStorefrontProductBySlug(config, 'slug')\n * \n * // Use in client components\n * function Cart() {\n * const { cart, addToCart } = useCart()\n * // ...\n * }\n * ```\n */\n\n// Configuration\nexport type { SdkConfig } from './config'\nexport { SdkProvider, useSdkContext } from './context/sdk-context'\nexport type { SdkContextValue, SdkProviderProps } from './context/sdk-context'\n\n// Constants\nexport { STORAGE_KEYS } from './constants'\n\n// Types\nexport * from './types'\n\n// Services (for server components)\nexport * from './services'\n\n// Utils\nexport { getCacheTier, setEnvironmentMode } from './utils/cache'\nexport { logger, setLoggerEnvironmentMode } from './utils/logger'\nexport * from './utils/sanitize-url'\nexport * from './utils/customer'\nexport * from './utils/checkout'\nexport * from './utils/error-handler'\nexport { sessionStore, localStore } from './utils/storage'\nexport * from './utils/validators'\n\n// App service functions\nexport { googleTranslate } from './services/app.service'\n\n// Note: React hooks are exported separately via '@kasuvia/sdk/hooks' to avoid\n// importing them in server components. Use:\n// import { useCart, useAuth } from '@kasuvia/sdk/hooks'\n","'use client';\n\n/**\n * SdkContext\n *\n * Provides SdkConfig and the current access token to all SDK hooks\n * in the component tree, so individual hooks do not require explicit\n * config/accessToken parameters when called from client components.\n *\n * Usage in storefront:\n * // In your AuthProvider or root layout:\n * <SdkProvider config={sdkConfig} accessToken={accessToken}>\n * {children}\n * </SdkProvider>\n *\n * // In any client component:\n * const { items, addItem } = useCart() // no args needed\n */\n\nimport React, { createContext, useContext, type ReactNode } from 'react';\nimport type { SdkConfig } from '../config';\n\nexport interface SdkContextValue {\n config: SdkConfig;\n accessToken: string | null;\n}\n\nconst SdkContext = createContext<SdkContextValue | null>(null);\n\nexport interface SdkProviderProps {\n config: SdkConfig;\n accessToken: string | null;\n children: ReactNode;\n}\n\nexport function SdkProvider({ config, accessToken, children }: SdkProviderProps) {\n return (\n <SdkContext.Provider value={{ config, accessToken }}>\n {children}\n </SdkContext.Provider>\n );\n}\n\n/**\n * Returns the SdkContext value, or null if no SdkProvider is present.\n * SDK hooks use this internally to fall back to context when explicit\n * parameters are not provided.\n */\nexport function useSdkContext(): SdkContextValue | null {\n return useContext(SdkContext);\n}\n\n/**\n * Resolves config and accessToken from explicit arguments or SdkContext.\n * Throws if neither source is available.\n */\nexport function resolveHookArgs(\n explicitConfig: SdkConfig | undefined,\n explicitToken: string | null | undefined,\n ctx: SdkContextValue | null\n): { config: SdkConfig; accessToken: string | null } {\n const config = explicitConfig ?? ctx?.config;\n if (!config) {\n throw new Error(\n '[kasuvia-sdk] No SdkConfig found. Either pass config explicitly or wrap your app with <SdkProvider config={...}>.'\n );\n }\n const accessToken = explicitToken !== undefined ? explicitToken : (ctx?.accessToken ?? null);\n return { config, accessToken };\n}\n","/**\n * SDK Constants\n * \n * Centralized constants to avoid hardcoded strings across the codebase.\n */\n\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: 'kasuvia_access_token',\n REFRESH_TOKEN: 'kasuvia_refresh_token',\n CHECKOUT_STATE: 'kasuvia_checkout_state',\n ORDERS_LINKED: 'kasuvia_orders_linked',\n STOREFRONT_STATE: 'storefront_state_v3',\n} as const;\n","import type { DeliveryAddress } from \"./shipping\";\n\nexport * from \"./shipping\";\nexport type { DeliveryAddress };\n\nexport type ProductType = \"physical\" | \"digital\" | \"service\" | \"bespoke\";\n\nexport enum ServiceTypeEnum {\n APPOINTMENT = 'appointment',\n PROJECT = 'project',\n RECURRING = 'recurring',\n}\n\nexport type ServiceType = ServiceTypeEnum | 'appointment' | 'project' | 'recurring'\n\nexport enum ServiceLocationTypeEnum {\n REMOTE = 'remote',\n PHYSICAL = 'physical',\n BOTH = 'both',\n}\n\nexport type ServiceLocationType = ServiceLocationTypeEnum | 'remote' | 'physical' | 'both'\n\nexport enum ServiceRecurringIntervalEnum {\n WEEKLY = 'weekly',\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n}\n\nexport type ServiceRecurringInterval = ServiceRecurringIntervalEnum | 'weekly' | 'monthly' | 'yearly' | ''\n\nexport interface Address {\n street: string\n city: string\n state: string\n country: string\n zip?: string\n}\n\nexport interface Collection {\n id: string\n business_id?: string\n name: string\n slug: string\n description?: string\n image?: string\n collection_type?: string\n rules?: Record<string, unknown>\n status?: string\n sort_order?: number\n created_at: string\n updated_at: string\n}\n\nexport interface Inventory {\n id: string\n product_id: string\n variant_id?: string\n quantity: number\n reserved: number\n reorder_point: number\n reorder_quantity: number\n track_quantity: boolean\n allow_backorder: boolean\n available: number\n is_in_stock: boolean\n is_low_stock: boolean\n updated_at: string\n}\n\nexport interface ProductVariant {\n id: string\n product_id: string\n sku?: string\n attributes: Record<string, string>\n price?: number\n images: string[]\n weight_kg?: number\n is_active: boolean\n inventory?: Inventory\n created_at: string\n updated_at: string\n}\n\nexport interface CustomField {\n label: string\n unit?: string\n required: boolean\n type?: string\n key?: string\n placeholder?: string\n}\n\nexport interface Product {\n id: string\n business_id: string\n name: string\n slug: string\n description?: string\n brand?: string\n product_type: ProductType\n requires_shipping: boolean\n is_consumable: boolean\n is_bespoke: boolean\n is_physical?: boolean | null // For bespoke products: indicates if custom item requires physical delivery\n base_price: number\n currency: string\n sale_price?: number\n sale_start?: string\n sale_end?: string\n images: string[]\n tags: string[]\n custom_fields: CustomField[]\n is_published: boolean\n is_featured: boolean\n is_popular: boolean\n is_new: boolean\n is_temporary: boolean\n digital_file_key?: string\n download_limit?: number\n download_expires_at?: string\n // Service-specific fields\n service_type?: ServiceType | null\n service_duration_minutes?: number | null\n service_location_type?: ServiceLocationType | null\n service_requires_consultation?: boolean\n service_max_capacity_per_slot?: number | null\n service_buffer_minutes?: number\n service_is_recurring?: boolean\n service_recurring_interval?: ServiceRecurringInterval | null\n service_project_based?: boolean\n weight_kg: number\n length_cm?: number\n width_cm?: number\n height_cm?: number\n created_at: string\n updated_at: string\n variants: ProductVariant[]\n collections: Collection[]\n}\n\nexport interface ListParams {\n page?: number\n pageSize?: number\n search?: string\n ordering?: string\n collectionSlug?: string\n excludeProductId?: string\n}\n\nexport interface PaginatedResponse<T> {\n items: T[]\n total: number\n page: number\n page_size: number\n total_pages: number\n}\n\n// ============================================================================\n// CART TYPES\n// ============================================================================\n\nexport interface CartItem {\n id: string\n product_id: string\n product_slug: string\n product_name: string\n image?: string\n variant_id?: string\n variant_attributes?: string | Record<string, string>\n unit_price: number\n quantity: number\n custom_measurements?: string\n is_bespoke: boolean\n created_at: string\n updated_at: string\n}\n\nexport interface CartResponse {\n items: CartItem[]\n subtotal: number\n total: number\n item_count: number\n product_type?: string // \"physical\", \"digital\", \"bespoke\"\n}\n\n// ============================================================================\n// WISHLIST TYPES\n// ============================================================================\n\nexport interface WishlistItem {\n id: string\n product_id: string\n notes?: string\n created_at: string\n product_name?: string\n product_slug?: string\n product_price?: number\n product_image?: string\n}\n\nexport interface WishlistListResponse {\n items: WishlistItem[]\n total: number\n page: number\n page_size: number\n total_pages: number\n}\n\nexport interface WishlistCheckResponse {\n in_wishlist: boolean\n}\n\nexport type OrderStatus =\n | 'pending'\n | 'confirmed'\n | 'processing'\n | 'packed'\n | 'picked_up'\n | 'in_transit'\n | 'shipped'\n | 'delivered'\n | 'voided'\n | 'refunded'\n | 'failed';\nexport type BespokeStageKey = \"received\" | \"development\" | \"finished\" | \"dispatched\";\n\nexport interface OrderItem {\n id: string;\n productName: string;\n image: string;\n quantity: number;\n price: number;\n}\n\nexport interface Order {\n id: string;\n display_id?: string;\n items: OrderItem[];\n total: number;\n status: OrderStatus;\n customerEmail: string;\n customerName: string;\n createdAt: number;\n updatedAt: number;\n deliveryMethod?: string;\n trackingNumber?: string;\n deliveryAddress?: string;\n shippingAddress?: DeliveryAddress;\n cancellationReason?: string;\n hasBespoke?: boolean;\n bespokeStage?: BespokeStageKey;\n bespokeBrief?: string;\n deliveryStatus?: string;\n carrierName?: string;\n terminalShipmentId?: string;\n guestToken?: string;\n guestEmail?: string;\n guestPhone?: string;\n guestName?: string;\n}\n\n// ============================================================================\n// CHECKOUT TYPES\n// ============================================================================\n\nexport interface CheckoutCustomer {\n first_name: string;\n last_name: string;\n email: string;\n phone: string;\n}\n\nexport interface ShippingLocation {\n street: string;\n city: string;\n state: string;\n lga: string;\n country: string;\n postal: string;\n}\n\n// ============================================================================\n// ORDER SERVICE PARAMS\n// ============================================================================\n\nexport interface FindOrderParams {\n email: string;\n order_id: string;\n}\n\nexport interface CreateOrderParams {\n customer_id?: string | null;\n status?: string;\n shipping_address?: DeliveryAddress;\n checkout_session_id?: string;\n items: Array<{\n product_id: string;\n product_name: string;\n quantity: number;\n unit_price: number;\n variant_id?: string;\n variant_details?: Record<string, unknown>;\n custom_measurements?: Record<string, unknown>;\n }>;\n delivery_method?: string;\n delivery_address?: string;\n total?: number;\n payment_method?: string;\n shipping_rate_id?: string;\n guest_token?: string;\n guest_email?: string;\n guest_phone?: string;\n guest_name?: string;\n product_type?: string;\n bespoke_brief?: string;\n bespoke_reference_images?: string[];\n bespoke_measurements?: Record<string, string>;\n bespoke_preferred_timeline?: string;\n bespoke_special_instructions?: string;\n}\n","/**\n * Cart Service\n * \n * Handles cart operations for both guest and authenticated users.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { CartItem, CartResponse } from '../types/store'\n\nfunction parseItems(items: CartItem[]): CartItem[] {\n return items.map((item) => ({\n ...item,\n variant_attributes:\n item.variant_attributes && typeof item.variant_attributes === \"string\"\n ? JSON.parse(item.variant_attributes)\n : item.variant_attributes,\n }));\n}\n\n/**\n * Fetch guest cart from backend (Redis-backed).\n */\nexport async function getGuestCart(config: SdkConfig, guestSessionId: string): Promise<CartItem[]> {\n if (!guestSessionId) return []\n\n try {\n const response = await fetch(`${config.backendUrls.store}/cart/`, {\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n \"X-Guest-Session\": guestSessionId \n },\n })\n if (!response.ok) return []\n const data = await response.json()\n return parseItems(data.items || [])\n } catch {\n return []\n }\n}\n\n/**\n * Add item to guest cart (Redis-backed).\n */\nexport async function addToGuestCart(config: SdkConfig, guestSessionId: string, item: CartItem): Promise<CartItem[]> {\n if (!guestSessionId) return []\n\n const payload = {\n product_id: item.product_id,\n product_slug: item.product_slug,\n product_name: item.product_name,\n image: item.image,\n variant_id: item.variant_id,\n variant_attributes:\n typeof item.variant_attributes === \"string\"\n ? item.variant_attributes\n : JSON.stringify(item.variant_attributes),\n unit_price: item.unit_price,\n quantity: item.quantity,\n custom_measurements: item.custom_measurements,\n is_bespoke: item.is_bespoke,\n }\n\n const response = await fetch(`${config.backendUrls.store}/cart/`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n \"X-Guest-Session\": guestSessionId \n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) return []\n const data = await response.json()\n return parseItems(data.items || [])\n}\n\n/**\n * Update quantity of a guest cart item.\n */\nexport async function updateGuestCartItemQuantity(\n config: SdkConfig,\n guestSessionId: string,\n itemId: string,\n quantity: number\n): Promise<CartItem[]> {\n if (!guestSessionId) return []\n\n const response = await fetch(`${config.backendUrls.store}/cart/${itemId}`, {\n method: 'PATCH',\n headers: { \n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n \"X-Guest-Session\": guestSessionId \n },\n body: JSON.stringify({ quantity }),\n })\n if (!response.ok) return []\n const data = await response.json()\n return parseItems(data.items || [])\n}\n\n/**\n * Remove an item from the guest cart.\n */\nexport async function removeFromGuestCart(\n config: SdkConfig,\n guestSessionId: string,\n itemId: string\n): Promise<CartItem[]> {\n if (!guestSessionId) return []\n\n await fetch(`${config.backendUrls.store}/cart/${itemId}`, {\n method: 'DELETE',\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n \"X-Guest-Session\": guestSessionId \n },\n })\n\n return getGuestCart(config, guestSessionId)\n}\n\n/**\n * Clear the entire guest cart.\n */\nexport async function clearGuestCart(config: SdkConfig, guestSessionId: string): Promise<void> {\n if (!guestSessionId) return\n\n await fetch(`${config.backendUrls.store}/cart/clear`, {\n method: 'DELETE',\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n \"X-Guest-Session\": guestSessionId \n },\n })\n}\n\n/**\n * Fetch authenticated user's cart from backend.\n */\nexport async function getCart(config: SdkConfig, accessToken?: string | null): Promise<CartResponse> {\n if (!accessToken) {\n return { id: '', items: [], subtotal: 0, total: 0, product_type: 'physical' } as any;\n }\n const response = await fetch(`${config.backendUrls.store}/cart/`, {\n headers: { \n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to fetch cart')\n const data = await response.json()\n const parsedItems = parseItems(data.items || [])\n return { ...data, items: parsedItems }\n}\n\n/**\n * Add item to authenticated user's cart.\n */\nexport async function addToCart(\n config: SdkConfig,\n accessToken: string,\n item: {\n product_id: string\n product_slug: string\n product_name: string\n image?: string\n variant_id?: string\n variant_attributes?: string\n unit_price: number\n quantity: number\n custom_measurements?: string\n is_bespoke: boolean\n }\n): Promise<CartResponse> {\n const response = await fetch(`${config.backendUrls.store}/cart/`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(item),\n })\n if (!response.ok) throw new Error('Failed to add to cart')\n const data = await response.json()\n const parsedItems = parseItems(data.items || [])\n return { ...data, items: parsedItems }\n}\n\n/**\n * Update item quantity in authenticated user's cart.\n */\nexport async function updateCartItem(\n config: SdkConfig,\n accessToken: string,\n itemId: string,\n quantity: number\n): Promise<CartResponse> {\n const response = await fetch(`${config.backendUrls.store}/cart/${itemId}`, {\n method: 'PATCH',\n headers: { \n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({ quantity }),\n })\n if (!response.ok) throw new Error('Failed to update cart item')\n const data = await response.json()\n const parsedItems = parseItems(data.items || [])\n return { ...data, items: parsedItems }\n}\n\n/**\n * Remove item from authenticated user's cart.\n */\nexport async function removeFromCart(\n config: SdkConfig,\n accessToken: string,\n itemId: string\n): Promise<CartResponse> {\n await fetch(`${config.backendUrls.store}/cart/${itemId}`, {\n method: 'DELETE',\n headers: { \n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n return getCart(config, accessToken)\n}\n\n/**\n * Clear authenticated user's cart.\n */\nexport async function clearCart(config: SdkConfig, accessToken: string): Promise<void> {\n await fetch(`${config.backendUrls.store}/cart/clear`, {\n method: 'DELETE',\n headers: { \n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n}\n\n/**\n * Merge guest cart (from Redis) into authenticated user's DB cart.\n */\nexport async function mergeGuestCart(\n config: SdkConfig,\n accessToken: string,\n guestSessionId: string\n): Promise<CartResponse> {\n const guestItems = guestSessionId ? await getGuestCart(config, guestSessionId) : []\n \n if (guestItems.length === 0) {\n return getCart(config, accessToken)\n }\n\n const payloadItems = guestItems.map((item) => ({\n product_id: item.product_id,\n product_slug: item.product_slug,\n product_name: item.product_name,\n image: item.image,\n variant_id: item.variant_id,\n variant_attributes:\n typeof item.variant_attributes === \"string\"\n ? item.variant_attributes\n : JSON.stringify(item.variant_attributes ?? {}),\n unit_price: item.unit_price,\n quantity: item.quantity,\n custom_measurements:\n typeof item.custom_measurements === \"string\"\n ? item.custom_measurements\n : JSON.stringify(item.custom_measurements ?? {}),\n is_bespoke: item.is_bespoke,\n }))\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n }\n if (guestSessionId) {\n headers[\"X-Guest-Session\"] = guestSessionId\n }\n\n const response = await fetch(`${config.backendUrls.store}/cart/merge`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ items: payloadItems }),\n })\n if (!response.ok) throw new Error('Failed to merge guest cart')\n const data = await response.json()\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Convenience wrapper: merge guest cart if it has items (called post-login).\n */\nexport async function mergeGuestCartIfPresent(\n config: SdkConfig,\n accessToken: string,\n guestSessionId: string\n): Promise<void> {\n try {\n const guestItems = await getGuestCart(config, guestSessionId)\n if (guestItems.length === 0) return\n await mergeGuestCart(config, accessToken, guestSessionId)\n } catch (error) {\n console.warn(\"[Cart] Failed to merge guest cart:\", error)\n }\n}\n\n/**\n * Returns 0 — count is now server-driven. Use the hook instead.\n * Kept for backward compatibility.\n */\nexport function getGuestCartCount(): number {\n return 0\n}\n\n/**\n * Returns 0 — subtotal is now server-driven.\n * Kept for backward compatibility.\n */\nexport function getGuestCartSubtotal(): number {\n return 0\n}\n\n/**\n * Derive product type from items (guest cart, no backend lookup needed).\n */\nexport function getGuestCartProductType(): \"physical\" | \"digital\" | \"bespoke\" {\n return \"physical\"\n}\n","/**\n * Order Service\n * \n * Handles order operations including creation, lookup, and tracking.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { Order, OrderStatus, FindOrderParams, CreateOrderParams, OrderItem } from '../types/store'\nimport type { DeliveryAddress } from '../types/store'\n\nexport type { FindOrderParams, CreateOrderParams, OrderStatus }\n\ninterface RawOrderItem {\n id: string\n product_name?: string\n productName?: string\n image?: string\n quantity?: number\n unit_price?: number\n price?: number\n}\n\ninterface RawShippingAddress {\n first_name?: string\n last_name?: string\n phone?: string\n street?: string\n city?: string\n state?: string\n country?: string\n postal?: string\n lga?: string\n}\n\ninterface RawOrder {\n id: string\n display_id?: string\n items?: RawOrderItem[]\n total_amount?: number\n total?: number\n status: OrderStatus\n customer_email?: string\n customer_name?: string\n guest_email?: string\n guest_phone?: string\n guest_name?: string\n guest_token?: string\n shipping_address?: RawShippingAddress | string | null\n delivery_method?: string\n tracking_number?: string\n delivery_status?: string\n carrier_name?: string\n terminal_shipment_id?: string\n product_type?: string\n bespoke_stage?: string\n bespoke_brief?: string\n created_at?: string\n updated_at?: string\n cancellation_reason?: string\n}\n\nfunction deriveCustomerName(raw: RawOrder): string {\n if (raw.customer_name) return raw.customer_name\n if (raw.guest_name) return raw.guest_name\n\n const addr = typeof raw.shipping_address === 'object' && raw.shipping_address !== null\n ? raw.shipping_address as RawShippingAddress\n : null\n if (addr) {\n const full = `${addr.first_name ?? ''} ${addr.last_name ?? ''}`.trim()\n if (full) return full\n }\n\n const email = raw.guest_email ?? raw.customer_email ?? ''\n if (email) return email.split('@')[0]\n\n return ''\n}\n\nfunction normaliseStorefrontOrder(raw: RawOrder): Order {\n const items: OrderItem[] = (raw.items ?? []).map((item) => ({\n id: item.id,\n productName: item.product_name ?? item.productName ?? '',\n image: item.image ?? '',\n quantity: item.quantity ?? 1,\n price: item.unit_price ?? item.price ?? 0,\n }))\n\n const addr = typeof raw.shipping_address === 'object' && raw.shipping_address !== null\n ? raw.shipping_address as RawShippingAddress\n : null\n\n return {\n id: raw.id,\n display_id: raw.display_id,\n items,\n total: raw.total_amount ?? raw.total ?? 0,\n status: raw.status,\n customerEmail: raw.guest_email ?? raw.customer_email ?? '',\n customerName: deriveCustomerName(raw),\n createdAt: raw.created_at ? new Date(raw.created_at).getTime() : Date.now(),\n updatedAt: raw.updated_at ? new Date(raw.updated_at).getTime() : Date.now(),\n deliveryMethod: raw.delivery_method,\n trackingNumber: raw.tracking_number,\n deliveryAddress: typeof raw.shipping_address === 'string'\n ? raw.shipping_address\n : addr\n ? `${addr.street}, ${addr.city}, ${addr.state}, ${addr.country}`\n : undefined,\n shippingAddress: addr\n ? {\n first_name: addr.first_name ?? '',\n last_name: addr.last_name ?? '',\n phone: addr.phone ?? '',\n street: addr.street ?? '',\n city: addr.city ?? '',\n state: addr.state ?? '',\n lga: addr.lga ?? '',\n country: addr.country ?? '',\n postal: addr.postal ?? '',\n }\n : undefined,\n cancellationReason: raw.cancellation_reason,\n hasBespoke: raw.product_type === 'bespoke',\n bespokeStage: raw.bespoke_stage as Order['bespokeStage'],\n bespokeBrief: raw.bespoke_brief,\n deliveryStatus: raw.delivery_status,\n carrierName: raw.carrier_name,\n terminalShipmentId: raw.terminal_shipment_id,\n guestToken: raw.guest_token,\n guestEmail: raw.guest_email,\n guestPhone: raw.guest_phone,\n guestName: raw.guest_name,\n }\n}\n\nexport async function createOrder(config: SdkConfig, accessToken: string, payload: CreateOrderParams): Promise<Order> {\n const response = await fetch(`${config.backendUrls.store}/orders/storefront`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to create order')\n const data = await response.json()\n return normaliseStorefrontOrder(data)\n}\n\nexport async function findOrder(config: SdkConfig, params: FindOrderParams & { guest_token?: string }): Promise<Order> {\n const queryParams = new URLSearchParams()\n if (params.email) queryParams.set('email', params.email)\n if (params.order_id) queryParams.set('order_id', params.order_id)\n if (params.guest_token) queryParams.set('guest_token', params.guest_token)\n \n const response = await fetch(`${config.backendUrls.store}/orders/find/?${queryParams.toString()}`, {\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to find order')\n const data = await response.json()\n return normaliseStorefrontOrder(data)\n}\n\nexport async function findOrderByToken(config: SdkConfig, token: string): Promise<Order> {\n const response = await fetch(`${config.backendUrls.store}/orders/find/?guest_token=${token}`, {\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to find order by token')\n const data = await response.json()\n return normaliseStorefrontOrder(data)\n}\n\nexport async function getOrders(config: SdkConfig, accessToken: string, params?: { email?: string; page?: number; page_size?: number }): Promise<Order[]> {\n const queryParams = new URLSearchParams()\n if (params?.email) queryParams.set('email', params.email)\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.page_size) queryParams.set('page_size', params.page_size.toString())\n \n const response = await fetch(`${config.backendUrls.store}/orders/?${queryParams.toString()}`, {\n headers: { \n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get orders')\n const data = await response.json()\n const items: RawOrder[] = Array.isArray(data) ? data : (data.items ?? [])\n return items.map(normaliseStorefrontOrder)\n}\n\nexport async function cancelOrder(config: SdkConfig, accessToken: string, orderId: string, reason: string): Promise<Order> {\n const response = await fetch(`${config.backendUrls.store}/orders/${orderId}/cancel/`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({ reason }),\n })\n if (!response.ok) throw new Error('Failed to cancel order')\n const data = await response.json()\n return normaliseStorefrontOrder(data)\n}\n\nexport async function trackOrder(config: SdkConfig, orderId: string, token?: string): Promise<Order> {\n const queryParams = token ? `?token=${token}` : ''\n const response = await fetch(`${config.backendUrls.store}/orders/track/${orderId}${queryParams}`, {\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to track order')\n const data = await response.json()\n return normaliseStorefrontOrder(data)\n}\n","/**\n * Customer auth service — all API calls scoped to this storefront's business tenant.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport { logger } from '../utils/logger'\nimport { STORAGE_KEYS } from '../constants'\nimport type {\n CustomerAuthResponse,\n CustomerLoginPayload,\n CustomerRegisterPayload,\n LogoutPayload,\n RefreshTokenResponse,\n CustomerUser,\n AuthUserResponse,\n UpdateProfilePayload,\n} from '../types/auth'\n\n// ── Auth API Calls ────────────────────────────────────────────────────────────\n\n/**\n * POST /auth/login/customer/\n * The `tenant_id` is automatically filled from config.businessId.\n */\nexport async function loginCustomer(\n config: SdkConfig,\n payload: Omit<CustomerLoginPayload, 'tenant_id'>\n): Promise<CustomerAuthResponse> {\n const response = await fetch(`${config.backendUrls.auth}/auth/login/customer/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Storefront-Key': config.storefrontApiKey,\n 'X-Business-ID': config.businessId,\n },\n body: JSON.stringify({\n ...payload,\n tenant_id: config.businessId,\n }),\n })\n\n if (!response.ok) {\n throw new Error('Login failed')\n }\n\n const data = await response.json()\n return data\n}\n\n/**\n * POST /auth/register/customer/\n * The `tenant_id` is automatically filled from config.businessId.\n */\nexport async function registerCustomer(\n config: SdkConfig,\n payload: Omit<CustomerRegisterPayload, 'tenant_id'>\n): Promise<CustomerAuthResponse> {\n const response = await fetch(`${config.backendUrls.auth}/auth/register/customer/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Storefront-Key': config.storefrontApiKey,\n 'X-Business-ID': config.businessId,\n },\n body: JSON.stringify({\n ...payload,\n tenant_id: config.businessId,\n }),\n })\n\n if (!response.ok) {\n throw new Error('Registration failed')\n }\n\n const data = await response.json()\n return data\n}\n\n/** POST /auth/token/refresh/\n */\nexport async function refreshToken(\n config: SdkConfig,\n refresh: string\n): Promise<RefreshTokenResponse> {\n const response = await fetch(`${config.backendUrls.auth}/auth/token/refresh/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refresh }),\n })\n\n if (!response.ok) {\n throw new Error('Token refresh failed')\n }\n\n const data = await response.json()\n return data\n}\n\n/** POST /auth/logout/ — revokes the server-side session. */\nexport async function logout(\n config: SdkConfig,\n refresh?: string\n): Promise<void> {\n const payload: LogoutPayload = refresh ? { refresh } : {}\n try {\n await fetch(`${config.backendUrls.auth}/auth/logout/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })\n } catch {\n // Swallow server errors\n }\n}\n\n/**\n * Verify a social provider id_token (or access_token for Facebook) with the backend.\n */\nexport async function verifySocialToken(\n config: SdkConfig,\n provider: 'google' | 'facebook',\n token: string\n): Promise<CustomerAuthResponse> {\n const response = await fetch(`${config.backendUrls.auth}/auth/social/verify/${provider}/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id_token: token,\n storefront_key: config.storefrontApiKey,\n }),\n })\n\n if (!response.ok) {\n throw new Error('Social token verification failed')\n }\n\n const data = await response.json()\n return data\n}\n\n/** Decode a JWT payload without verifying signature (client-side use only). */\nfunction parseJwtPayload(token: string): Record<string, unknown> {\n try {\n return JSON.parse(atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')))\n } catch {\n return {}\n }\n}\n\nfunction resolveProvider(data: Pick<AuthUserResponse, 'is_google_auth_enabled' | 'is_facebook_auth_enabled'>): CustomerUser['provider'] {\n if (data.is_google_auth_enabled) return 'google'\n if (data.is_facebook_auth_enabled) return 'facebook'\n return 'email'\n}\n\nfunction resolveAvatar(profilePicture: unknown): string | null {\n if (!profilePicture) return null\n if (typeof profilePicture === 'string') return profilePicture\n if (typeof profilePicture === 'object' && profilePicture !== null && 'url' in profilePicture) {\n const url = (profilePicture as { url?: string }).url\n return typeof url === 'string' ? url : null\n }\n return null\n}\n\n/** Map kasuvia-auth UserSerializer response to storefront CustomerUser. */\nexport function mapAuthUserToCustomer(data: AuthUserResponse, provider?: CustomerUser['provider']): CustomerUser {\n const firstname = data.profile?.firstname?.trim() || undefined\n const lastname = data.profile?.lastname?.trim() || undefined\n const phone = data.profile?.phone?.trim() || undefined\n\n return {\n id: String(data.id),\n email: data.email,\n firstname,\n lastname,\n phone,\n full_name: buildFullName(firstname, lastname),\n avatar: resolveAvatar(data.profile?.profile_picture),\n provider: provider ?? resolveProvider(data),\n }\n}\n\nfunction buildCustomerFromClaims(claims: Record<string, unknown>): CustomerUser {\n const provider: CustomerUser['provider'] = claims.is_google_auth_enabled\n ? 'google'\n : claims.is_facebook_auth_enabled\n ? 'facebook'\n : 'email'\n\n const jwtFullName = String(claims.full_name ?? claims.name ?? '').trim() || undefined\n const { firstname: splitFirst, lastname: splitLast } = splitFullName(jwtFullName)\n\n return {\n id: String(claims.user_id ?? claims.sub ?? ''),\n email: String(claims.email ?? ''),\n firstname: splitFirst || undefined,\n lastname: splitLast || undefined,\n phone: String(claims.phone ?? '').trim() || undefined,\n full_name: jwtFullName,\n avatar: claims.avatar as string | null,\n provider,\n }\n}\n\n/** GET /auth/profile/ */\nexport async function getMe(config?: SdkConfig, accessToken?: string): Promise<CustomerUser> {\n if (!config || !accessToken) {\n const response = await fetch('/api/auth/me', { credentials: 'include' })\n if (!response.ok) throw new Error('Failed to fetch profile')\n const data = await response.json()\n return data.user\n }\n\n const response = await fetch(`${config.backendUrls.auth}/auth/profile/`, {\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n },\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch profile')\n }\n\n const data = await response.json()\n return mapAuthUserToCustomer(data)\n}\n\n/** GET /auth/profile/ - alias for getMe for backward compatibility */\nexport async function getAuthUser(config?: SdkConfig, accessToken?: string): Promise<AuthUserResponse> {\n if (!config || !accessToken) {\n const response = await fetch('/api/auth/me', { credentials: 'include' })\n if (!response.ok) throw new Error('Failed to fetch auth user')\n const data = await response.json()\n return data.user\n }\n\n const response = await fetch(`${config.backendUrls.auth}/auth/profile/`, {\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n },\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch auth user')\n }\n\n const data = await response.json()\n return data\n}\n\n/** PUT /auth/profile/ — update firstname, lastname, phone */\nexport async function updateProfile(\n configOrPayload: SdkConfig | UpdateProfilePayload,\n accessTokenOrPayload?: string | UpdateProfilePayload,\n payloadParam?: UpdateProfilePayload\n): Promise<CustomerUser> {\n const isArg1Config = typeof configOrPayload === 'object' && configOrPayload !== null && 'businessId' in configOrPayload\n if (!isArg1Config) {\n const payload = configOrPayload as UpdateProfilePayload\n const response = await fetch('/api/auth/profile', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to update profile')\n return response.json()\n }\n\n const config = configOrPayload as SdkConfig\n const accessToken = accessTokenOrPayload as string\n const payload = payloadParam as UpdateProfilePayload\n\n const response = await fetch(`${config.backendUrls.auth}/auth/profile/`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`,\n },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n throw new Error('Failed to update profile')\n }\n\n const data = await response.json()\n return mapAuthUserToCustomer(data)\n}\n\n/**\n * Silently refresh the access token on app boot.\n * Builds CustomerUser from JWT claims — no additional profile API call needed.\n * Returns null if no refresh token exists or if the refresh fails.\n */\nexport async function silentRefresh(\n config: SdkConfig,\n refresh: string\n): Promise<{ user: CustomerUser; provider: CustomerUser['provider']; newAccessToken: string; newRefreshToken: string } | null> {\n try {\n const data = await refreshToken(config, refresh)\n if (!data.access || !data.refresh) {\n return null\n }\n const claims = parseJwtPayload(data.access)\n const user = buildCustomerFromClaims(claims)\n const provider = user.provider\n return { user, provider, newAccessToken: data.access, newRefreshToken: data.refresh }\n } catch {\n return null\n }\n}\n\n// ── Helper Functions ─────────────────────────────────────────────────────────\n\nfunction buildFullName(firstname?: string, lastname?: string): string {\n if (firstname && lastname) return `${firstname} ${lastname}`\n return firstname || lastname || ''\n}\n\nfunction splitFullName(fullName?: string): { firstname: string; lastname: string } {\n if (!fullName) return { firstname: '', lastname: '' }\n\n const parts = fullName.trim().split(/\\s+/)\n if (parts.length === 1) {\n return { firstname: parts[0], lastname: '' }\n }\n\n return {\n firstname: parts[0],\n lastname: parts.slice(1).join(' ')\n }\n}\n\n/**\n * Store tokens in localStorage (client-side utility)\n * This is a convenience function for storefronts to store auth tokens\n */\nexport function storeTokens(accessToken: string, refreshToken: string): void {\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, accessToken)\n localStorage.setItem(STORAGE_KEYS.REFRESH_TOKEN, refreshToken)\n }\n}\n\n/**\n * Clear tokens from localStorage (client-side utility)\n */\nexport function clearTokens(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEYS.ACCESS_TOKEN)\n localStorage.removeItem(STORAGE_KEYS.REFRESH_TOKEN)\n }\n}\n\n/**\n * Get stored tokens from localStorage (client-side utility)\n */\nexport function getStoredTokens(): { accessToken: string | null; refreshToken: string | null } {\n if (typeof window === 'undefined') {\n return { accessToken: null, refreshToken: null }\n }\n return {\n accessToken: localStorage.getItem(STORAGE_KEYS.ACCESS_TOKEN),\n refreshToken: localStorage.getItem(STORAGE_KEYS.REFRESH_TOKEN),\n }\n}\n","/**\n * Product Service\n * \n * Handles product operations using GraphQL.\n * Stateless - all configuration passed as parameters.\n */\nimport { GraphQLClient } from 'graphql-request'\nimport type { Product, PaginatedResponse, ListParams } from '../types/store'\nimport type { SdkConfig } from '../config'\n\n/**\n * Create GraphQL client with provided config\n */\nfunction createGraphQLClient(config: SdkConfig): GraphQLClient {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Storefront-Key': config.storefrontApiKey,\n 'X-Business-ID': config.businessId,\n }\n return new GraphQLClient(`${config.backendUrls.store}/graphql`, { headers })\n}\n\nconst GET_STOREFRONT_PRODUCTS = `\n query GetStorefrontProducts($page: Int!, $pageSize: Int!, $collectionSlug: String, $search: String) {\n storefront_products(page: $page, pageSize: $pageSize, collectionSlug: $collectionSlug, search: $search) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_PRODUCT_BY_SLUG = `\n query GetStorefrontProductBySlug($slug: String!) {\n storefront_product_by_slug(slug: $slug) {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n }\n`\n\nconst GET_STOREFRONT_LATEST = `\n query GetStorefrontLatest($page: Int!, $pageSize: Int!) {\n storefront_latest(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_POPULAR = `\n query GetStorefrontPopular($page: Int!, $pageSize: Int!) {\n storefront_popular(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_FEATURED = `\n query GetStorefrontFeatured($page: Int!, $pageSize: Int!) {\n storefront_featured(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_NEW = `\n query GetStorefrontNew($page: Int!, $pageSize: Int!) {\n storefront_new(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n sale_price\n sale_start\n sale_end\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_ON_SALE = `\n query GetStorefrontOnSale($page: Int!, $pageSize: Int!) {\n storefront_on_sale(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n sale_price\n sale_start\n sale_end\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_LOW_STOCK = `\n query GetStorefrontLowStock($page: Int!, $pageSize: Int!) {\n storefront_low_stock(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n sale_price\n sale_start\n sale_end\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_RECOMMENDED = `\n query GetStorefrontRecommended($page: Int!, $pageSize: Int!, $excludeProductId: String) {\n storefront_recommended(page: $page, pageSize: $pageSize, excludeProductId: $excludeProductId) {\n items {\n id\n business_id\n name\n slug\n description\n brand\n product_type\n requires_shipping\n is_consumable\n is_bespoke\n base_price\n currency\n images\n tags\n custom_fields { label unit required }\n is_published\n is_featured\n is_popular\n is_new\n is_temporary\n digital_file_key\n download_limit\n download_expires_at\n weight_kg\n length_cm\n width_cm\n height_cm\n created_at\n updated_at\n variants {\n id\n product_id\n sku\n attributes\n price\n images\n weight_kg\n is_active\n inventory {\n id\n product_id\n variant_id\n quantity\n reserved\n reorder_point\n reorder_quantity\n track_quantity\n allow_backorder\n available\n is_in_stock\n is_low_stock\n updated_at\n }\n created_at\n updated_at\n }\n collections {\n id\n business_id\n name\n slug\n description\n image\n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\n/**\n * Fetch all active products for the storefront.\n */\nexport async function getStorefrontProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n collectionSlug: params?.collectionSlug,\n search: params?.search,\n }\n const data = await client.request(GET_STOREFRONT_PRODUCTS, variables)\n return data.storefront_products\n}\n\n/**\n * Fetch a single product by slug for the storefront.\n */\nexport async function getStorefrontProductBySlug(\n config: SdkConfig,\n slug: string\n): Promise<Product> {\n const client = createGraphQLClient(config)\n const data = await client.request(GET_STOREFRONT_PRODUCT_BY_SLUG, { slug })\n return data.storefront_product_by_slug\n}\n\n/**\n * Fetch latest products for the storefront.\n */\nexport async function getLatestProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_LATEST, variables)\n return data.storefront_latest\n}\n\n/**\n * Fetch popular products for the storefront.\n */\nexport async function getPopularProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_POPULAR, variables)\n return data.storefront_popular\n}\n\n/**\n * Fetch featured products for the storefront.\n */\nexport async function getFeaturedProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_FEATURED, variables)\n return data.storefront_featured\n}\n\n/**\n * Fetch new products for the storefront.\n */\nexport async function getNewProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_NEW, variables)\n return data.storefront_new\n}\n\n/**\n * Fetch products currently on sale for the storefront.\n */\nexport async function getOnSaleProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_ON_SALE, variables)\n return data.storefront_on_sale\n}\n\n/**\n * Fetch products with low stock for the storefront.\n */\nexport async function getLowStockProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n }\n const data = await client.request(GET_STOREFRONT_LOW_STOCK, variables)\n return data.storefront_low_stock\n}\n\n/**\n * Fetch recommended products for the storefront.\n * Returns featured, popular, and new products.\n * Optionally excludes a specific product ID.\n */\nexport async function getRecommendedProducts(\n config: SdkConfig,\n params?: ListParams & { excludeProductId?: string }\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n excludeProductId: params?.excludeProductId,\n }\n const data = await client.request(GET_STOREFRONT_RECOMMENDED, variables)\n return data.storefront_recommended\n}\n\n","/**\n * Collection Service\n * \n * Handles collection operations using GraphQL.\n * Stateless - all configuration passed as parameters.\n */\nimport { GraphQLClient } from 'graphql-request'\nimport type { Collection, PaginatedResponse, ListParams } from '../types/store'\nimport type { SdkConfig } from '../config'\n\nconst GET_STOREFRONT_COLLECTIONS = `\n query GetStorefrontCollections($page: Int!, $pageSize: Int!) {\n storefront_collections(page: $page, pageSize: $pageSize) {\n items {\n id\n business_id\n name\n slug\n description\n image \n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst GET_STOREFRONT_COLLECTION_BY_SLUG = `\n query GetStorefrontCollectionBySlug($slug: String!) {\n storefront_collection_by_slug(slug: $slug) {\n id\n business_id\n name\n slug\n description\n image \n collection_type\n rules\n status\n sort_order\n created_at\n updated_at\n }\n }\n`\n\n/**\n * Create GraphQL client with provided config\n */\nfunction createGraphQLClient(config: SdkConfig): GraphQLClient {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Storefront-Key': config.storefrontApiKey,\n 'X-Business-ID': config.businessId,\n }\n return new GraphQLClient(`${config.backendUrls.store}/graphql`, { headers })\n}\n\n/**\n * Fetch paginated active collections for the storefront.\n */\nexport async function getStorefrontCollections(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Collection>> {\n const client = createGraphQLClient(config)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n }\n const data = await client.request(GET_STOREFRONT_COLLECTIONS, variables)\n return data.storefront_collections\n}\n\n/**\n * Fetch a single collection by its slug.\n */\nexport async function getStorefrontCollectionBySlug(\n config: SdkConfig,\n slug: string\n): Promise<Collection> {\n const client = createGraphQLClient(config)\n const data = await client.request(GET_STOREFRONT_COLLECTION_BY_SLUG, { slug })\n return data.storefront_collection_by_slug\n}\n","/**\n * Wishlist Service\n * \n * Handles wishlist operations.\n * Stateless - all configuration passed as parameters.\n */\nimport { GraphQLClient } from 'graphql-request'\nimport type { SdkConfig } from '../config'\nimport type { WishlistItem, WishlistListResponse, WishlistCheckResponse } from '../types/store'\n\nconst GET_STOREFRONT_WISHLIST = `\n query GetStorefrontWishlist($page: Int!, $pageSize: Int!) {\n storefront_wishlist(page: $page, pageSize: $pageSize) {\n items {\n id\n product_id\n notes\n created_at\n product_name\n product_slug\n product_price\n currency\n product_image\n }\n total\n page\n page_size\n total_pages\n }\n }\n`\n\nconst CHECK_IN_STOREFRONT_WISHLIST = `\n query CheckInStorefrontWishlist($productId: String!) {\n check_in_storefront_wishlist(productId: $productId) {\n in_wishlist\n }\n }\n`\n\n/**\n * Create GraphQL client with provided config\n */\nfunction createGraphQLClient(config: SdkConfig, accessToken?: string): GraphQLClient {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Storefront-Key': config.storefrontApiKey,\n 'X-Business-ID': config.businessId,\n }\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`\n }\n return new GraphQLClient(`${config.backendUrls.store}/graphql`, { headers })\n}\n\n/**\n * Fetch the customer's wishlist for the current business.\n */\nexport async function getWishlist(config: SdkConfig, accessToken: string, params?: { page?: number; pageSize?: number }): Promise<WishlistListResponse> {\n const client = createGraphQLClient(config, accessToken)\n const variables = {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n }\n const data = await client.request(GET_STOREFRONT_WISHLIST, variables)\n return data.storefront_wishlist\n}\n\n/**\n * Check if a product is in the customer's wishlist.\n */\nexport async function checkInWishlist(config: SdkConfig, accessToken: string, productId: string): Promise<WishlistCheckResponse> {\n const client = createGraphQLClient(config, accessToken)\n const data = await client.request(CHECK_IN_STOREFRONT_WISHLIST, { productId })\n return data.check_in_storefront_wishlist\n}\n\n/**\n * Add a product to the customer's wishlist.\n */\nexport async function addToWishlist(config: SdkConfig, accessToken: string, productId: string, notes?: string): Promise<WishlistItem> {\n const response = await fetch(`${config.backendUrls.store}/wishlist/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({\n product_id: productId,\n notes: notes || undefined,\n }),\n })\n if (!response.ok) throw new Error('Failed to add to wishlist')\n return response.json()\n}\n\n/**\n * Remove an item from the customer's wishlist by item ID.\n */\nexport async function removeFromWishlist(config: SdkConfig, accessToken: string, itemId: string): Promise<void> {\n const response = await fetch(`${config.backendUrls.store}/wishlist/${itemId}`, {\n method: 'DELETE',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to remove from wishlist')\n}\n\n/**\n * Remove a product from the customer's wishlist by product ID.\n */\nexport async function removeProductFromWishlist(config: SdkConfig, accessToken: string, productId: string): Promise<void> {\n const response = await fetch(`${config.backendUrls.store}/wishlist/product/${productId}`, {\n method: 'DELETE',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to remove product from wishlist')\n}\n","/**\n * Payment Service\n * \n * Customer-facing payment API for payment initiation and verification.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n ConversionQuote,\n DVACreateRequest,\n DVADetails,\n PaymentInitiateRequest,\n PaymentInitiateResponse,\n TransactionVerifyResponse,\n} from '../types/payments/index'\n\n/**\n * Create a Monnify Dedicated Virtual Account so the customer can pay via\n * bank transfer. Note: Monnify DVA only supports NGN currency - the backend\n * will reject non-NGN requests for this payment method.\n */\nexport async function createDedicatedAccount(\n config: SdkConfig,\n accessToken: string,\n request: DVACreateRequest\n): Promise<DVADetails> {\n const isValidUUID = (str: string) => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(str);\n }\n\n const response = await fetch(`${config.backendUrls.payment}/payments/dedicated-account`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({\n order_id: request.order_id && isValidUUID(request.order_id) ? request.order_id : undefined,\n amount: request.amount,\n customer_email: request.customer_email,\n customer_name: request.customer_name,\n currency: request.currency,\n idempotency_key: request.idempotency_key,\n }),\n })\n if (!response.ok) throw new Error('Failed to create dedicated account')\n const data = await response.json()\n return data\n}\n\n/**\n * Initiate a card payment (customer → business owner).\n * Routes to Monnify (NGN) or Flutterwave (non-NGN) on the backend.\n * Returns a checkout_url to redirect the customer to the gateway.\n */\nexport async function initiatePayment(\n config: SdkConfig,\n accessToken: string,\n request: PaymentInitiateRequest\n): Promise<PaymentInitiateResponse> {\n const isValidUUID = (str: string) => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(str);\n }\n\n const validOrderId = request.order_id && isValidUUID(request.order_id) ? request.order_id : undefined;\n\n const response = await fetch(`${config.backendUrls.payment}/payments/storefront/initiate`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({\n amount: request.amount,\n currency: request.currency,\n order_id: validOrderId,\n quote_id: request.quote_id,\n metadata_json: {\n customer_email: request.customer_email,\n customer_name: request.customer_name ?? '',\n order_id: validOrderId,\n ...(request.metadata ?? {}),\n },\n idempotency_key: request.idempotency_key,\n }),\n })\n if (!response.ok) throw new Error('Failed to initiate payment')\n const data = await response.json()\n\n return {\n id: data.id,\n gateway_ref: data.gateway_ref,\n gateway: data.gateway,\n status: data.status,\n checkout_url: data.metadata_json?.checkout_url ?? '',\n }\n}\n\n/**\n * Request a 15-minute rate-locked conversion quote for non-NGN transactions.\n */\nexport async function requestQuote(\n config: SdkConfig,\n amount: number\n): Promise<ConversionQuote> {\n const response = await fetch(`${config.backendUrls.payment}/payments/quote`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({ amount }),\n })\n if (!response.ok) throw new Error('Failed to request quote')\n const data = await response.json()\n return data\n}\n\n/**\n * Verify a payment after the gateway redirects back to /checkout/verify.\n */\nexport async function verifyTransaction(\n configOrReference: SdkConfig | string,\n reference?: string\n): Promise<TransactionVerifyResponse> {\n if (typeof configOrReference === 'string') {\n const ref = configOrReference\n const response = await fetch(`/api/payments/verify/${ref}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n })\n if (!response.ok) throw new Error('Failed to verify transaction')\n return response.json()\n }\n\n const config = configOrReference\n const ref = reference || ''\n const response = await fetch(`${config.backendUrls.payment}/payments/verify/${ref}`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to verify transaction')\n const data = await response.json()\n return data\n}\n\n/**\n * Poll transaction status by internal transaction ID.\n */\nexport async function getTransactionStatus(\n config: SdkConfig,\n transactionId: string\n): Promise<TransactionVerifyResponse> {\n const response = await fetch(`${config.backendUrls.payment}/payments/transactions/${transactionId}`, {\n headers: { \n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get transaction status')\n const data = await response.json()\n return data\n}\n\nexport const paymentService = {\n createDedicatedAccount,\n initiatePayment,\n requestQuote,\n verifyTransaction,\n getTransactionStatus,\n} as const\n","/**\n * Consultation Service\n * \n * Handles consultation operations for bespoke and service products.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n Consultation,\n ConsultationCreatePayload,\n ConsultationMessagePayload,\n ConsultationQuoteAcceptPayload,\n} from '../types/consultations'\n\nexport async function createConsultation(config: SdkConfig, accessToken: string, payload: ConsultationCreatePayload): Promise<Consultation> {\n const response = await fetch(`${config.backendUrls.store}/social/consultations/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to create consultation')\n return response.json()\n}\n\nexport async function getConsultations(config: SdkConfig, accessToken: string): Promise<Consultation[]> {\n const response = await fetch(`${config.backendUrls.store}/social/consultations/`, {\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get consultations')\n return response.json()\n}\n\nexport async function getConsultation(config: SdkConfig, accessToken: string, id: string): Promise<Consultation> {\n const response = await fetch(`${config.backendUrls.store}/social/consultations/${id}`, {\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get consultation')\n return response.json()\n}\n\nexport async function sendMessage(config: SdkConfig, accessToken: string, id: string, payload: ConsultationMessagePayload): Promise<void> {\n await fetch(`${config.backendUrls.store}/social/consultations/${id}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n}\n\nexport async function acceptQuote(config: SdkConfig, accessToken: string, id: string, payload: ConsultationQuoteAcceptPayload): Promise<Consultation> {\n const response = await fetch(`${config.backendUrls.store}/social/consultations/${id}/accept-quote`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to accept quote')\n return response.json()\n}\n\nexport async function rejectQuote(config: SdkConfig, accessToken: string, id: string, reason?: string): Promise<Consultation> {\n const response = await fetch(`${config.backendUrls.store}/social/consultations/${id}/reject-quote`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({ reason }),\n })\n if (!response.ok) throw new Error('Failed to reject quote')\n return response.json()\n}\n\n// Service object export for backward compatibility\nexport const consultationService = {\n createConsultation,\n getConsultations,\n getConsultation,\n sendMessage,\n acceptQuote,\n rejectQuote,\n}\n","/**\n * Logistics Service\n * \n * Handles shipping rates and address validation.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { ShippingRatesResponse } from '../types/store/shipping'\nimport type { Product, ProductVariant } from '../types/store'\n\nexport interface CartItemPayload {\n product: {\n name: string\n price: number\n weight: number\n }\n variant: ProductVariant | null\n quantity: number\n}\n\nexport interface RateAddress {\n city: string\n state: string\n country: string\n}\n\nexport interface ShippingRatesRequest {\n cart_items: CartItemPayload[]\n origin_address: RateAddress\n destination_address: RateAddress\n currency?: string\n}\n\n/**\n * Fetch shipping rates for a cart.\n */\nexport async function getShippingRates(\n config: SdkConfig,\n payload: ShippingRatesRequest\n): Promise<ShippingRatesResponse> {\n const response = await fetch(`${config.backendUrls.store}/logistics/shipping/rates`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to get shipping rates')\n return response.json()\n}\n\n/**\n * Fetch the seller's registered shipping address.\n */\nexport async function getSellerShippingAddress(config: SdkConfig): Promise<{\n terminal_address_id: string | null\n address_details: {\n city: string\n state: string\n country: string\n line1: string\n line2: string\n zip: string\n } | null\n business_id: string\n message: string\n}> {\n const response = await fetch(`${config.backendUrls.store}/logistics/shipping-address`, {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get seller shipping address')\n return response.json()\n}\n\n/**\n * Validate a shipping address.\n */\nexport async function validateShippingAddress(\n config: SdkConfig,\n payload: {\n first_name: string\n last_name: string\n phone: string\n address_line1: string\n address_line2?: string\n city: string\n state: string\n country: string\n postal_code?: string\n }\n): Promise<{\n valid: boolean\n message?: string\n data?: Array<{ name: string; city_id: string; stateCode: string; countryCode: string }>\n}> {\n const response = await fetch(`${config.backendUrls.store}/logistics/shipping-address/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to validate shipping address')\n return response.json()\n}\n\n// Service object for backward compatibility\nexport const logisticsService = {\n getShippingRates,\n getSellerShippingAddress,\n validateShippingAddress,\n}\n","/**\n * Bespoke Service\n * \n * Handles bespoke product availability checks.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { BespokeAvailability } from '../types/consultations'\n\nexport async function checkAvailability(config: SdkConfig, product_id: string): Promise<BespokeAvailability> {\n const response = await fetch(`${config.backendUrls.store}/bespoke/availability/${product_id}`, {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n\n if (!response.ok) throw new Error('Failed to check bespoke availability')\n return response.json()\n}\n\n// Service object export for backward compatibility\nexport const bespokeService = {\n checkAvailability,\n}\n","/**\n * Service Booking Service\n * \n * Handles service appointments and deliverables.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n ServiceAppointment,\n ServiceAppointmentCreatePayload,\n AvailableSlot,\n ServiceDeliverable,\n DeliverableApprovalPayload,\n} from '../types/services'\n\nexport async function getAvailableSlots(\n config: SdkConfig,\n product_id: string,\n date_from: string,\n date_to: string\n): Promise<AvailableSlot[]> {\n const response = await fetch(\n `${config.backendUrls.store}/service/available-slots/${product_id}?date_from=${date_from}&date_to=${date_to}`,\n {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n }\n )\n if (!response.ok) throw new Error('Failed to get available slots')\n return response.json()\n}\n\nexport async function bookAppointment(\n config: SdkConfig,\n accessToken: string,\n payload: ServiceAppointmentCreatePayload\n): Promise<ServiceAppointment> {\n const response = await fetch(`${config.backendUrls.store}/service/appointments/`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to book appointment')\n return response.json()\n}\n\nexport async function getAppointments(config: SdkConfig, accessToken: string): Promise<ServiceAppointment[]> {\n const response = await fetch(`${config.backendUrls.store}/service/bookings/my`, {\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get appointments')\n return response.json()\n}\n\nexport async function getAppointment(config: SdkConfig, accessToken: string, id: string): Promise<ServiceAppointment> {\n const response = await fetch(`${config.backendUrls.store}/service/bookings/${id}`, {\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get appointment')\n return response.json()\n}\n\nexport async function cancelAppointment(config: SdkConfig, accessToken: string, id: string): Promise<void> {\n await fetch(`${config.backendUrls.store}/service/bookings/${id}`, {\n method: 'DELETE',\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n}\n\nexport async function getDeliverables(config: SdkConfig, accessToken: string, order_id: string): Promise<ServiceDeliverable[]> {\n const response = await fetch(`${config.backendUrls.store}/service/projects/${order_id}/deliverables/`, {\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get deliverables')\n return response.json()\n}\n\nexport async function approveDeliverable(\n config: SdkConfig,\n accessToken: string,\n order_id: string,\n deliverable_id: string\n): Promise<ServiceDeliverable> {\n const response = await fetch(\n `${config.backendUrls.store}/service/projects/${order_id}/deliverables/${deliverable_id}/approve`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({ approved: true }),\n }\n )\n if (!response.ok) throw new Error('Failed to approve deliverable')\n return response.json()\n}\n\nexport async function requestRevision(\n config: SdkConfig,\n accessToken: string,\n order_id: string,\n deliverable_id: string,\n feedback: string\n): Promise<ServiceDeliverable> {\n const response = await fetch(\n `${config.backendUrls.store}/service/projects/${order_id}/deliverables/${deliverable_id}/revision`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify({ approved: false, feedback }),\n }\n )\n if (!response.ok) throw new Error('Failed to request revision')\n return response.json()\n}\n\n// Service object export for backward compatibility\nexport const serviceBookingService = {\n getAvailableSlots,\n bookAppointment,\n getAppointments,\n getAppointment,\n cancelAppointment,\n getDeliverables,\n approveDeliverable,\n requestRevision,\n}\n","/**\n * Notification Service\n * \n * Handles contact form submissions and email notifications.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\n\nexport interface ContactFormData {\n name: string\n email: string\n subject: string\n message: string\n source?: string\n company_name?: string\n current_year?: number\n turnstile_token?: string\n}\n\n/**\n * Send contact email to Kasuvia team.\n * POST /contact/send-contact-email\n */\nexport async function sendContactEmail(\n config: SdkConfig,\n payload: ContactFormData\n): Promise<{ detail: string }> {\n const response = await fetch(`${config.backendUrls.notifications}/contact/send-contact-email`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to send contact email')\n return response.json()\n}\n\n/**\n * Send confirmation email to user.\n * POST /contact/send-contact-confirmation\n */\nexport async function sendContactConfirmation(\n config: SdkConfig,\n payload: Omit<ContactFormData, 'turnstile_token'>\n): Promise<{ detail: string }> {\n const response = await fetch(`${config.backendUrls.notifications}/contact/send-contact-confirmation`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(payload),\n })\n if (!response.ok) throw new Error('Failed to send contact confirmation')\n return response.json()\n}\n\nexport const notificationsService = {\n sendContactEmail,\n sendContactConfirmation,\n} as const\n","/**\n * App Service\n * \n * Handles translation and other app-level utilities.\n */\n\nexport async function googleTranslate(text: string, target: string, source = \"en\"): Promise<string> {\n if (!text || target === source) return text;\n try {\n const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${source}&tl=${target}&dt=t&q=${encodeURIComponent(text)}`;\n const res = await fetch(url);\n const data = (await res.json()) as [Array<[string, string]>, ...unknown[]];\n return (data?.[0] || []).map((s) => s[0]).join(\"\");\n } catch {\n return text;\n }\n}\n","/**\n * Config Service\n *\n * Handles configuration endpoints (languages, currencies, locales, business config).\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { BackendLanguage, SupportedLanguagesResponse, SupportedCurrenciesResponse } from '../types/payments'\nimport type { BusinessConfig } from '../types/business'\n\n/**\n * Fetch supported languages from the payment system.\n * Resolves to: {kasuviaPaymentBackendUrl}/config/supported-languages\n */\nexport async function getSupportedLanguages(config: SdkConfig): Promise<SupportedLanguagesResponse> {\n const response = await fetch(`${config.backendUrls.payment}/config/supported-languages`, {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get supported languages')\n return response.json()\n}\n\n/**\n * Fetch supported currencies from the payment system.\n * Resolves to: {kasuviaPaymentBackendUrl}/config/supported-currencies\n */\nexport async function getSupportedCurrencies(config: SdkConfig): Promise<SupportedCurrenciesResponse> {\n const response = await fetch(`${config.backendUrls.payment}/config/supported-currencies`, {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get supported currencies')\n return response.json()\n}\n\n/**\n * Fetch the business's public configuration, including store_currency.\n * Uses storefront API key header (X-Storefront-Key).\n * Resolves to: {kasuviaAuthBackendUrl}/internal/businesses/{business_id}/\n * This endpoint is designed for storefronts to fetch business config using their storefront API key.\n */\nexport async function getBusinessConfig(config: SdkConfig): Promise<BusinessConfig> {\n const response = await fetch(`${config.backendUrls.auth}/internal/businesses/${config.businessId}/`, {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n })\n if (!response.ok) throw new Error('Failed to get business config')\n return response.json()\n}\n\nexport const configService = {\n getSupportedLanguages,\n getSupportedCurrencies,\n getBusinessConfig,\n} as const\n","/**\n * CMS Service\n * \n * Handles CMS model and entry operations using the kasuvia-cms SDK endpoints.\n * Protected by X-Storefront-Key and X-Business-ID headers.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n CmsEntry,\n CmsEntryListResponse,\n CreateCmsEntryParams,\n UpdateCmsEntryParams,\n ListCmsEntriesParams,\n} from '../types/cms'\n\n/**\n * List CMS entries for a specific model.\n * Requires public_api.read permission on the model.\n */\nexport async function listCmsEntries(\n config: SdkConfig,\n modelSlug: string,\n params?: ListCmsEntriesParams\n): Promise<CmsEntryListResponse> {\n const queryParams = new URLSearchParams()\n queryParams.set('page', (params?.page || 1).toString())\n queryParams.set('page_size', (params?.page_size || 50).toString())\n\n const response = await fetch(\n `${config.backendUrls.cms}/sdk/${config.businessId}/${modelSlug}/entries?${queryParams.toString()}`,\n {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n }\n )\n\n if (!response.ok) throw new Error('Failed to list CMS entries')\n return response.json()\n}\n\n/**\n * Get a single CMS entry by ID.\n * Requires public_api.read permission on the model.\n */\nexport async function getCmsEntry(\n config: SdkConfig,\n modelSlug: string,\n entryId: string\n): Promise<CmsEntry> {\n const response = await fetch(\n `${config.backendUrls.cms}/sdk/${config.businessId}/${modelSlug}/entries/${entryId}`,\n {\n headers: {\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n }\n )\n\n if (!response.ok) throw new Error('Failed to get CMS entry')\n return response.json()\n}\n\n/**\n * Create a new CMS entry.\n * Requires public_api.create permission on the model.\n */\nexport async function createCmsEntry(\n config: SdkConfig,\n accessToken: string,\n modelSlug: string,\n params: CreateCmsEntryParams\n): Promise<CmsEntry> {\n const response = await fetch(\n `${config.backendUrls.cms}/sdk/${config.businessId}/${modelSlug}/entries`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(params),\n }\n )\n\n if (!response.ok) throw new Error('Failed to create CMS entry')\n return response.json()\n}\n\n/**\n * Update an existing CMS entry.\n * Requires public_api.update permission on the model.\n */\nexport async function updateCmsEntry(\n config: SdkConfig,\n accessToken: string,\n modelSlug: string,\n entryId: string,\n params: UpdateCmsEntryParams\n): Promise<CmsEntry> {\n const response = await fetch(\n `${config.backendUrls.cms}/sdk/${config.businessId}/${modelSlug}/entries/${entryId}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n body: JSON.stringify(params),\n }\n )\n\n if (!response.ok) throw new Error('Failed to update CMS entry')\n return response.json()\n}\n\n/**\n * Delete a CMS entry.\n * Requires public_api.delete permission on the model.\n */\nexport async function deleteCmsEntry(\n config: SdkConfig,\n accessToken: string,\n modelSlug: string,\n entryId: string\n): Promise<void> {\n const response = await fetch(\n `${config.backendUrls.cms}/sdk/${config.businessId}/${modelSlug}/entries/${entryId}`,\n {\n method: 'DELETE',\n headers: {\n \"Authorization\": `Bearer ${accessToken}`,\n \"X-Storefront-Key\": config.storefrontApiKey,\n \"X-Business-ID\": config.businessId,\n },\n }\n )\n\n if (!response.ok) throw new Error('Failed to delete CMS entry')\n}\n","/**\n * Cache Tiers Utility\n * \n * Provides cache configuration for React Query based on environment.\n */\n\nconst CACHE_TIERS = {\n none: { staleTime: 0, gcTime: 0 },\n infinity: { staleTime: Infinity, gcTime: 0 },\n low: { staleTime: 1000 * 30, gcTime: 1000 * 60 }, // 30s / 1m\n medium: { staleTime: 1000 * 60 * 5, gcTime: 1000 * 60 * 10 }, // 5m / 10m\n high: { staleTime: 1000 * 60 * 30, gcTime: 1000 * 60 * 60 }, // 30m / 1h\n} as const;\n\nexport type CacheTier = keyof typeof CACHE_TIERS;\n\nlet isDevelopment = true;\n\n/**\n * Set the environment mode for cache configuration\n */\nexport function setEnvironmentMode(development: boolean): void {\n isDevelopment = development;\n}\n\n/**\n * Get cache configuration for a given tier\n * In development, returns 'none' tier to disable caching\n */\nexport const getCacheTier = (tier: CacheTier) => {\n if (isDevelopment) return CACHE_TIERS.none;\n return CACHE_TIERS[tier];\n};\n","/**\n * Logger Utility\n * \n * Environment-gated logger that suppresses output in production.\n */\n\nlet isDevelopment = true;\n\n/**\n * Set the environment mode for logging\n */\nexport function setLoggerEnvironmentMode(development: boolean): void {\n isDevelopment = development;\n}\n\nexport const logger = {\n log: (...args: unknown[]) => {\n if (isDevelopment) {\n console.log(...args)\n }\n },\n\n warn: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(...args)\n }\n },\n\n /**\n * Logs a warning to the console in development only.\n * Alias for warn() for Python logging compatibility.\n * In production, this is a no-op.\n */\n warning: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(...args)\n }\n },\n\n error: (...args: unknown[]) => {\n if (isDevelopment) {\n console.error(...args)\n }\n },\n\n info: (...args: unknown[]) => {\n if (isDevelopment) {\n console.info(...args)\n }\n },\n\n createScope: (scope: string) => ({\n log: (...args: unknown[]) => {\n if (isDevelopment) {\n console.log(`[${scope}]`, ...args)\n }\n },\n warn: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(`[${scope}]`, ...args)\n }\n },\n warning: (...args: unknown[]) => {\n if (isDevelopment) {\n console.warn(`[${scope}]`, ...args)\n }\n },\n error: (...args: unknown[]) => {\n if (isDevelopment) {\n console.error(`[${scope}]`, ...args)\n }\n },\n info: (...args: unknown[]) => {\n if (isDevelopment) {\n console.info(`[${scope}]`, ...args)\n }\n },\n }),\n}\n","export class InvalidBaseURLError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"InvalidBaseURLError\";\r\n }\r\n}\r\n\r\nconst ALLOWED_SCHEMES = new Set([\"http:\", \"https:\", \"ws:\", \"wss:\"]);\r\n\r\n/**\r\n * Normalizes a URL by trimming whitespace and stripping trailing slashes.\r\n */\r\nexport function sanitizeBaseUrl(\r\n url: string | undefined | null,\r\n name = \"URL\"\r\n): string {\r\n if (url == null) {\r\n throw new InvalidBaseURLError(`${name} is not set`);\r\n }\r\n\r\n const cleaned0 = url.trim();\r\n if (!cleaned0) {\r\n throw new InvalidBaseURLError(`${name} is empty`);\r\n }\r\n\r\n // Strip all trailing slashes\r\n const cleaned = cleaned0.replace(/\\/+$/, \"\");\r\n\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(cleaned);\r\n } catch {\r\n throw new InvalidBaseURLError(\r\n `${name} must start with http://, https://, ws://, or wss://, got: ${url}`\r\n );\r\n }\r\n\r\n if (!ALLOWED_SCHEMES.has(parsed.protocol)) {\r\n throw new InvalidBaseURLError(\r\n `${name} must start with http://, https://, ws://, or wss://, got: ${url}`\r\n );\r\n }\r\n\r\n if (!parsed.hostname) {\r\n throw new InvalidBaseURLError(`${name} is missing a host: ${url}`);\r\n }\r\n\r\n if (parsed.search || parsed.hash) {\r\n throw new InvalidBaseURLError(\r\n `${name} should not contain a query or fragment: ${url}`\r\n );\r\n }\r\n\r\n return cleaned;\r\n}","import type { CustomerUser } from \"../types\";\n\nexport function buildFullName(firstname?: string, lastname?: string): string | undefined {\n const name = [firstname, lastname].filter(Boolean).join(' ').trim()\n return name || undefined\n}\n\nexport function splitFullName(fullName?: string): { firstname: string; lastname: string } {\n if (!fullName?.trim()) return { firstname: '', lastname: '' }\n const parts = fullName.trim().split(/\\s+/)\n return {\n firstname: parts[0] ?? '',\n lastname: parts.slice(1).join(' '),\n }\n}\n\nexport function getCustomerDisplayName(user: CustomerUser): string {\n const fromParts = buildFullName(user.firstname, user.lastname)\n return fromParts || user.full_name || user.email.split('@')[0]\n}\n\n/**\n * Constructs live storefront URL for a business.\n * If custom domain is not yet connected/verified, defaults to `https://<business_id>.kasuvia.com`.\n */\nexport function getStorefrontUrl(businessId: string, customDomain?: string | null): string {\n if (customDomain && customDomain.trim()) {\n const cleanDomain = customDomain.trim().replace(/^https?:\\/\\//, '');\n return `https://${cleanDomain}`;\n }\n const cleanBid = (businessId || 'store').toLowerCase().trim();\n return `https://${cleanBid}.kasuvia.com`;\n}\n\n","import { buildFullName } from \"./customer\";\nimport type { CheckoutCustomer, DeliveryAddress, Order, ShippingLocation } from \"../types\";\n\nexport function buildDeliveryAddress(customer: CheckoutCustomer, location: ShippingLocation): DeliveryAddress {\n return {\n first_name: customer.first_name,\n last_name: customer.last_name,\n phone: customer.phone,\n ...location,\n };\n}\n\nexport function getCheckoutCustomerName(customer: CheckoutCustomer): string {\n return buildFullName(customer.first_name, customer.last_name) ?? customer.email.split(\"@\")[0];\n}\n\nexport function enrichCompletedOrder(\n order: Order,\n options: {\n customer: CheckoutCustomer;\n location?: ShippingLocation;\n bespokeBrief?: string;\n productType?: \"physical\" | \"digital\" | \"bespoke\" | null;\n },\n): Order {\n const customerName = getCheckoutCustomerName(options.customer);\n\n return {\n ...order,\n customerName: order.customerName || customerName,\n customerEmail: order.customerEmail || options.customer.email,\n shippingAddress:\n order.shippingAddress ??\n (options.productType === \"physical\" && options.location\n ? buildDeliveryAddress(options.customer, options.location)\n : undefined),\n bespokeBrief: order.bespokeBrief ?? options.bespokeBrief,\n };\n}\n","/**\n * Type-safe way to extract an error message from an API error.\n * Updated for fetch-based errors (no axios dependency).\n */\nexport function getErrorMessage(error: unknown, fallback: string = \"Something went wrong\"): string {\n if (error instanceof Error) {\n return error.message;\n }\n // Handle fetch Response objects that might be thrown\n if (error instanceof Response) {\n return `HTTP ${error.status}: ${error.statusText}`;\n }\n // Handle objects with detail or message properties (from API responses)\n if (typeof error === 'object' && error !== null) {\n const err = error as { detail?: string; message?: string; status?: number };\n return err.detail || err.message || fallback;\n }\n return fallback;\n}\n","/**\n * @file storage.ts\n * @description Centralized tenant-isolated storage utility for sessionStorage and localStorage.\n * Automatically prefixes all keys with the storefront Business ID to guarantee multi-tenant segregation.\n * Stateless - requires businessId parameter.\n */\n\nfunction getPrefixedKey(businessId: string, key: string): string {\n const cleanKey = key.startsWith('kasuvia_') ? key.substring(5) : key\n return businessId ? `kasuvia-sf-${businessId}-${cleanKey}` : `kasuvia-sf-anon-${cleanKey}`\n}\n\nexport const sessionStore = {\n get: (businessIdOrKey: string, key?: string): string | null => {\n if (typeof window === 'undefined') return null\n const bId = key ? businessIdOrKey : ''\n const k = key || businessIdOrKey\n return sessionStorage.getItem(getPrefixedKey(bId, k))\n },\n set: (businessIdOrKey: string, keyOrVal: string, val?: string): void => {\n if (typeof window === 'undefined') return\n const bId = val !== undefined ? businessIdOrKey : ''\n const k = val !== undefined ? keyOrVal : businessIdOrKey\n const v = val !== undefined ? val : keyOrVal\n sessionStorage.setItem(getPrefixedKey(bId, k), v)\n },\n remove: (businessIdOrKey: string, key?: string): void => {\n if (typeof window === 'undefined') return\n const bId = key ? businessIdOrKey : ''\n const k = key || businessIdOrKey\n sessionStorage.removeItem(getPrefixedKey(bId, k))\n },\n getJSON: <T = unknown>(businessIdOrKey: string, key?: string): T | null => {\n if (typeof window === 'undefined') return null\n const bId = key ? businessIdOrKey : ''\n const k = key || businessIdOrKey\n const value = sessionStorage.getItem(getPrefixedKey(bId, k))\n if (!value) return null\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n },\n setJSON: (businessIdOrKey: string, keyOrVal: unknown, val?: unknown): void => {\n if (typeof window === 'undefined') return\n const bId = val !== undefined ? (businessIdOrKey as string) : ''\n const k = val !== undefined ? (keyOrVal as string) : (businessIdOrKey as string)\n const v = val !== undefined ? val : keyOrVal\n sessionStorage.setItem(getPrefixedKey(bId, k), JSON.stringify(v))\n },\n}\n\nexport const localStore = {\n get: (businessIdOrKey: string, key?: string): string | null => {\n if (typeof window === 'undefined') return null\n const bId = key ? businessIdOrKey : ''\n const k = key || businessIdOrKey\n return localStorage.getItem(getPrefixedKey(bId, k))\n },\n set: (businessIdOrKey: string, keyOrVal: string, val?: string): void => {\n if (typeof window === 'undefined') return\n const bId = val !== undefined ? businessIdOrKey : ''\n const k = val !== undefined ? keyOrVal : businessIdOrKey\n const v = val !== undefined ? val : keyOrVal\n localStorage.setItem(getPrefixedKey(bId, k), v)\n },\n remove: (businessIdOrKey: string, key?: string): void => {\n if (typeof window === 'undefined') return\n const bId = key ? businessIdOrKey : ''\n const k = key || businessIdOrKey\n localStorage.removeItem(getPrefixedKey(bId, k))\n },\n getJSON: <T = unknown>(businessIdOrKey: string, key?: string): T | null => {\n if (typeof window === 'undefined') return null\n const bId = key ? businessIdOrKey : ''\n const k = key || businessIdOrKey\n const value = localStorage.getItem(getPrefixedKey(bId, k))\n if (!value) return null\n try {\n return JSON.parse(value) as T\n } catch {\n return null\n }\n },\n setJSON: (businessIdOrKey: string, keyOrVal: unknown, val?: unknown): void => {\n if (typeof window === 'undefined') return\n const bId = val !== undefined ? (businessIdOrKey as string) : ''\n const k = val !== undefined ? (keyOrVal as string) : (businessIdOrKey as string)\n const v = val !== undefined ? val : keyOrVal\n localStorage.setItem(getPrefixedKey(bId, k), JSON.stringify(v))\n },\n}\n","/**\n * Form validation utilities for kasuvia-sdk\n * Provides realtime validation for email, password, name, confirm password, and message fields\n */\n\nexport function validateEmail(email: string): string | null {\n if (!email || email.trim() === \"\") {\n return \"Email is required\";\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n return \"Please enter a valid email address\";\n }\n return null;\n}\n\nexport function validatePassword(password: string): string | null {\n if (!password || password.trim() === \"\") {\n return \"Password is required\";\n }\n if (password.length < 8) {\n return \"Password must be at least 8 characters\";\n }\n if (password.length > 72) {\n return \"Password cannot exceed 72 characters\";\n }\n if (!/[A-Z]/.test(password)) {\n return \"Password must contain at least one uppercase letter\";\n }\n if (!/[a-z]/.test(password)) {\n return \"Password must contain at least one lowercase letter\";\n }\n if (!/[0-9]/.test(password)) {\n return \"Password must contain at least one number\";\n }\n return null;\n}\n\nexport function validateName(name: string, fieldName: string = \"Name\"): string | null {\n if (!name || name.trim() === \"\") {\n return `${fieldName} is required`;\n }\n if (name.trim().length < 2) {\n return `${fieldName} must be at least 2 characters`;\n }\n if (name.trim().length > 50) {\n return `${fieldName} cannot exceed 50 characters`;\n }\n // Allow letters, spaces, hyphens, and apostrophes\n const nameRegex = /^[a-zA-Z\\s\\-'\\u00C0-\\u017F]+$/;\n if (!nameRegex.test(name.trim())) {\n return `${fieldName} can only contain letters, spaces, hyphens, and apostrophes`;\n }\n return null;\n}\n\nexport function validateRequired(value: string, fieldName: string): string | null {\n if (!value || value.trim() === \"\") {\n return `${fieldName} is required`;\n }\n return null;\n}\n\n/**\n * Validates the confirm-password field.\n * Returns null (no error) when the field is empty — avoids nagging the user\n * before they've had a chance to type anything.\n */\nexport function validateConfirmPassword(password: string, confirmPassword: string): string | null {\n if (!confirmPassword) return null;\n if (confirmPassword !== password) {\n return \"Passwords do not match\";\n }\n return null;\n}\n\nexport function validateMessage(message: string): string | null {\n if (!message || message.trim() === \"\") {\n return \"Message is required\";\n }\n if (message.trim().length < 10) {\n return \"Message must be at least 10 characters\";\n }\n return null;\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmFhC,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6EvC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmF9B,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmF/B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmFhC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsF3B,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsF/B,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsFjC,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["buildFullName","splitFullName","ServiceTypeEnum","ServiceLocationTypeEnum","ServiceRecurringIntervalEnum","response","data","payload","refreshToken","import_graphql_request","createGraphQLClient","import_graphql_request","createGraphQLClient","ref","response","isDevelopment","buildFullName","splitFullName","buildFullName"]}
|