@kasuvia/sdk 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/hooks/index.d.mts +429 -0
  2. package/dist/hooks/index.d.ts +429 -0
  3. package/dist/hooks/index.js +3073 -0
  4. package/dist/hooks/index.js.map +1 -0
  5. package/dist/hooks/index.mjs +2962 -0
  6. package/dist/hooks/index.mjs.map +1 -0
  7. package/dist/index.d.mts +250 -1161
  8. package/dist/index.d.ts +250 -1161
  9. package/dist/index.js +1544 -2359
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +1527 -2258
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/sdk-context-Cy51kEKT.d.mts +565 -0
  14. package/dist/sdk-context-Cy51kEKT.d.ts +565 -0
  15. package/package.json +6 -2
  16. package/src/config/index.ts +10 -91
  17. package/src/constants.ts +13 -0
  18. package/src/context/sdk-context.tsx +70 -0
  19. package/src/graphql/collections.graphql.ts +2 -10
  20. package/src/graphql/products.graphql.ts +215 -65
  21. package/src/graphql/wishlist.graphql.ts +7 -6
  22. package/src/hooks/index.ts +2 -0
  23. package/src/hooks/use-auth.ts +82 -158
  24. package/src/hooks/use-bespoke-availability.ts +25 -8
  25. package/src/hooks/use-cart.ts +222 -119
  26. package/src/hooks/use-cms.ts +179 -86
  27. package/src/hooks/use-collections.ts +52 -15
  28. package/src/hooks/use-consultation-stream.ts +4 -3
  29. package/src/hooks/use-consultations.ts +120 -51
  30. package/src/hooks/use-countries.ts +35 -13
  31. package/src/hooks/use-currencies.ts +26 -13
  32. package/src/hooks/use-google-translate.ts +22 -8
  33. package/src/hooks/use-languages.ts +40 -20
  34. package/src/hooks/use-mobile.ts +23 -0
  35. package/src/hooks/use-order-stream.ts +9 -5
  36. package/src/hooks/use-orders.ts +99 -44
  37. package/src/hooks/use-payment.ts +108 -40
  38. package/src/hooks/use-products.ts +251 -53
  39. package/src/hooks/use-service-booking.ts +152 -90
  40. package/src/hooks/use-states.ts +35 -15
  41. package/src/hooks/use-wishlist.ts +92 -91
  42. package/src/index.ts +26 -30
  43. package/src/services/auth.service.ts +209 -167
  44. package/src/services/bespoke.service.ts +12 -4
  45. package/src/services/cart.service.ts +172 -70
  46. package/src/services/cms.service.ts +70 -35
  47. package/src/services/collection.service.ts +22 -5
  48. package/src/services/config.service.ts +34 -14
  49. package/src/services/consultation.service.ts +72 -18
  50. package/src/services/logistics.service.ts +35 -11
  51. package/src/services/notifications.service.ts +27 -12
  52. package/src/services/order.service.ts +74 -15
  53. package/src/services/payment.service.ts +86 -31
  54. package/src/services/product.service.ts +279 -39
  55. package/src/services/service-booking.service.ts +98 -26
  56. package/src/services/wishlist.service.ts +69 -25
  57. package/src/types/auth/index.ts +6 -4
  58. package/src/types/business/index.ts +7 -2
  59. package/src/types/payments/index.ts +3 -3
  60. package/src/types/services/index.ts +2 -5
  61. package/src/types/store/index.ts +38 -3
  62. package/src/utils/error-handler.ts +10 -5
  63. package/src/utils/storage.ts +48 -26
  64. package/src/utils/validators.ts +85 -0
  65. package/src/client/authClient.ts +0 -135
  66. package/src/client/graphqlClient.ts +0 -53
  67. package/src/client/httpClient.ts +0 -298
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-cart.ts","../../src/services/cart.service.ts","../../src/context/sdk-context.tsx","../../src/hooks/use-orders.ts","../../src/services/order.service.ts","../../src/utils/cache.ts","../../src/utils/logger.ts","../../src/hooks/use-auth.ts","../../src/services/auth.service.ts","../../src/hooks/use-countries.ts","../../src/hooks/use-states.ts","../../src/hooks/use-languages.ts","../../src/services/config.service.ts","../../src/hooks/use-currencies.ts","../../src/hooks/use-bespoke-availability.ts","../../src/services/bespoke.service.ts","../../src/hooks/use-collections.ts","../../src/hooks/use-products.ts","../../src/hooks/use-wishlist.ts","../../src/services/wishlist.service.ts","../../src/hooks/use-service-booking.ts","../../src/services/service-booking.service.ts","../../src/hooks/use-consultations.ts","../../src/services/consultation.service.ts","../../src/hooks/use-consultation-stream.ts","../../src/hooks/use-order-stream.ts","../../src/hooks/use-is-mounted.ts","../../src/hooks/use-mobile.ts","../../src/hooks/use-google-translate.ts","../../src/hooks/use-payment.ts","../../src/services/payment.service.ts","../../src/hooks/use-cms.ts","../../src/services/cms.service.ts"],"sourcesContent":["/**\n * Cart Hook & Context Provider\n *\n * React Query hooks for cart operations with unified drawer state sharing.\n * config and accessToken are optional — if omitted, they are read from SdkContext.\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 type { CartItem, CartResponse, Product } from '../types/store'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\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: (guestSessionId: string) => 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(config?: SdkConfig, accessToken?: string | null): UseCartReturn {\n const ctx = useSdkContext();\n try {\n const resolved = resolveHookArgs(config, accessToken, ctx);\n const resolvedConfig = resolved.config;\n const resolvedToken = resolved.accessToken;\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: async () => {\n if (resolvedToken) {\n return getCart(resolvedConfig, resolvedToken)\n }\n if (typeof window !== 'undefined') {\n const res = await fetch('/api/cart', { credentials: 'include' })\n if (!res.ok) throw new Error('Failed to fetch cart')\n return res.json()\n }\n return undefined\n },\n enabled: true,\n })\n\n const addToCartMutation = useMutation({\n mutationFn: async (item: Parameters<typeof addToCart>[2]) => {\n if (resolvedToken) {\n return addToCart(resolvedConfig, resolvedToken, item)\n }\n if (typeof window !== 'undefined') {\n const res = await fetch('/api/cart', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify(item),\n })\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n throw { status: res.status, data }\n }\n return res.json()\n }\n throw new Error('No access token and not in browser context')\n },\n onSuccess: () => {\n setProductTypeMismatch(null)\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n onError: (error: unknown) => {\n // Handle product type mismatch errors from backend\n const err = error as { status?: number; data?: { detail?: ProductTypeMismatchDetail } }\n if (err.status === 409 && err.data?.detail?.code === 'CART_PRODUCT_TYPE_MISMATCH') {\n const errorDetail = err.data.detail\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 const updateCartItemMutation = useMutation({\n mutationFn: async ({ itemId, quantity }: { itemId: string; quantity: number }) => {\n if (resolvedToken) {\n return updateCartItem(resolvedConfig, resolvedToken, itemId, quantity)\n }\n if (typeof window !== 'undefined') {\n const res = await fetch(`/api/cart/${itemId}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ quantity }),\n })\n if (!res.ok) throw new Error('Failed to update cart item')\n return res.json()\n }\n throw new Error('No access token')\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n const removeFromCartMutation = useMutation({\n mutationFn: async (itemId: string) => {\n if (resolvedToken) {\n return removeFromCart(resolvedConfig, resolvedToken, itemId)\n }\n if (typeof window !== 'undefined') {\n const res = await fetch(`/api/cart/${itemId}`, {\n method: 'DELETE',\n credentials: 'include',\n })\n if (!res.ok) throw new Error('Failed to remove cart item')\n return res.json()\n }\n throw new Error('No access token')\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n const clearCartMutation = useMutation({\n mutationFn: async () => {\n if (resolvedToken) {\n return clearCart(resolvedConfig, resolvedToken)\n }\n if (typeof window !== 'undefined') {\n const res = await fetch('/api/cart/clear', {\n method: 'DELETE',\n credentials: 'include',\n })\n if (!res.ok) throw new Error('Failed to clear cart')\n return res.json()\n }\n throw new Error('No access token')\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n const mergeGuestCartMutation = useMutation({\n mutationFn: (guestSessionId: string) =>\n resolvedToken ? mergeGuestCartIfPresent(resolvedConfig, resolvedToken, guestSessionId) : Promise.resolve(),\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] || undefined,\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: number, item: CartItem) => 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 } catch (error) {\n // If called outside QueryClientProvider, return safe fallback\n console.warn('[useCart] Called outside QueryClientProvider, returning empty cart')\n const context = CartCtx ? useContext(CartCtx) : null\n const isOpen = context ? context.isOpen : false\n const setOpen = context ? context.setOpen : () => {}\n \n return {\n cart: undefined,\n items: [],\n count: 0,\n isOpen,\n setOpen,\n isLoading: false,\n error: null,\n addToCart: () => {},\n updateCartItem: () => {},\n removeFromCart: () => {},\n clearCart: () => {},\n clear: () => {},\n mergeGuestCart: () => {},\n addItem: () => {},\n updateQty: () => {},\n removeItem: () => {},\n subtotal: 0,\n productTypeMismatch: null,\n handleClearCartAndAdd: () => {},\n handleKeepCurrentCart: () => {},\n } as any\n }\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","'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 * Orders Hook\n *\n * React Query hooks for order operations.\n * config and accessToken are optional — if omitted, they are read from SdkContext.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { getOrders, findOrder, createOrder, cancelOrder, trackOrder } from '../services/order.service'\nimport type { FindOrderParams, CreateOrderParams } from '../types/store'\nimport type { SdkConfig } from '../config'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport function useOrders(arg1?: SdkConfig | { page?: number; pageSize?: number }, arg2?: string | null, arg3?: { page?: number; pageSize?: number }) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? arg2 : undefined\n const params = isArg1Config ? arg3 : (arg1 as { page?: number; pageSize?: number } | undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n return useQuery({\n queryKey: ['orders', params],\n queryFn: () => token ? getOrders(cfg, token, params || {}) : Promise.resolve(undefined),\n enabled: !!token,\n })\n } catch (error) {\n logger.warn('[useOrders] Called outside QueryClientProvider, returning empty list')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useOrdersList(arg1?: any, arg2?: any, arg3?: any) {\n return useOrders(arg1, arg2, arg3)\n}\n\nexport function useFindOrder(arg1?: SdkConfig | string | FindOrderParams, arg2?: FindOrderParams) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const params: FindOrderParams | undefined = isArg1Config\n ? arg2\n : typeof arg1 === 'string'\n ? { order_id: arg1, email: '' }\n : (arg1 as FindOrderParams | undefined)\n\n try {\n const { config: cfg } = resolveHookArgs(explicitConfig, undefined, ctx)\n return useQuery({\n queryKey: ['order', params],\n queryFn: () => params ? findOrder(cfg, params) : Promise.resolve(undefined),\n enabled: !!params?.order_id,\n })\n } catch (error) {\n logger.warn('[useFindOrder] Called outside QueryClientProvider, returning undefined')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useOrder(arg1?: SdkConfig | string | FindOrderParams, arg2?: FindOrderParams) {\n return useFindOrder(arg1, arg2)\n}\n\nexport function useOrderTracking(arg1?: SdkConfig | string, arg2?: string, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const orderId = isArg1Config ? arg2 : (typeof arg1 === 'string' ? arg1 : undefined)\n const guestToken = isArg1Config ? arg3 : (typeof arg2 === 'string' ? arg2 : undefined)\n\n try {\n const { config: cfg } = resolveHookArgs(explicitConfig, undefined, ctx)\n return useQuery({\n queryKey: ['order-tracking', orderId, guestToken],\n queryFn: () => trackOrder(cfg, orderId!, guestToken),\n enabled: !!orderId,\n refetchInterval: 30000,\n })\n } catch (error) {\n logger.warn('[useOrderTracking] Called outside QueryClientProvider, returning undefined')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useCreateOrder(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CreateOrderParams) => createOrder(cfg, token || '', payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n } catch (error) {\n logger.warn('[useCreateOrder] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useCancelOrder(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ orderId, reason = '' }: { orderId: string; reason?: string }) =>\n token ? cancelOrder(cfg, token, orderId, reason) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n } catch (error) {\n logger.warn('[useCancelOrder] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\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 * 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","/**\n * Auth Hooks\n *\n * Stateless React Query hooks for authentication operations.\n * The storefront should provide its own AuthProvider context that manages\n * tokens and passes config to these hooks.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { getAuthUser, loginCustomer, registerCustomer, updateProfile, logout as logoutService } from '../services/auth.service'\nimport { logger } from '../utils/logger'\nimport type {\n CustomerLoginPayload,\n CustomerRegisterPayload,\n UpdateProfilePayload,\n CustomerUser,\n} from '../types/auth'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\n// ── Hooks ────────────────────────────────────────────────────────────────────\n\nexport function useAuthUser(config?: SdkConfig, accessToken?: string) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken ?? null, ctx)\n return useQuery({\n queryKey: ['auth-user'],\n queryFn: () => getAuthUser(cfg, token ?? ''),\n enabled: !!token,\n })\n } catch (error) {\n logger.warn('[useAuthUser] Called outside QueryClientProvider, returning empty user')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useLogin(config?: SdkConfig) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: Omit<CustomerLoginPayload, 'tenant_id'>) => loginCustomer(cfg, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n } catch (error) {\n logger.warn('[useLogin] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useRegister(config?: SdkConfig) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: Omit<CustomerRegisterPayload, 'tenant_id'>) => registerCustomer(cfg, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n } catch (error) {\n logger.warn('[useRegister] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useUpdateProfile(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: UpdateProfilePayload) =>\n token ? updateProfile(cfg, token, payload) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n },\n })\n } catch (error) {\n logger.warn('[useUpdateProfile] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useLogout(config?: SdkConfig, refreshToken?: string) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: () => logoutService(cfg, refreshToken),\n onSuccess: () => {\n queryClient.clear()\n },\n })\n } catch (error) {\n logger.warn('[useLogout] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\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 * Countries Hook\n * \n * React Query hook for fetching countries list.\n * Stateless - requires config parameter.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { SdkConfig } from '../config'\nimport type { Country } from '../types/ui'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport async function getCountries(config: SdkConfig): Promise<Country[]> {\n const response = await fetch(`${config.backendUrls.auth}/auth/countries/`, {\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 fetch countries')\n return response.json()\n}\n\nexport function useCountries(config?: SdkConfig) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['countries'],\n queryFn: () => getCountries(cfg),\n retry: 1,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n staleTime: 24 * 60 * 60 * 1000,\n })\n } catch (error) {\n logger.warn('[useCountries] Called outside QueryClientProvider, returning empty list')\n return {\n data: [],\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: [] }),\n } as any\n }\n}\n","/**\n * States Hook\n * \n * React Query hook for fetching states for a country.\n * Stateless - requires config parameter.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { SdkConfig } from '../config'\nimport type { State } from '../types/ui'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport async function getStates(config: SdkConfig, countryIso: string): Promise<State[]> {\n if (!countryIso) return []\n const response = await fetch(`${config.backendUrls.auth}/auth/countries/?iso=${countryIso}`, {\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 fetch states')\n return response.json()\n}\n\nexport function useStates(countryIso: string, config?: SdkConfig) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['states', countryIso],\n queryFn: () => getStates(cfg, countryIso),\n enabled: !!countryIso,\n retry: 1,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n staleTime: 24 * 60 * 60 * 1000,\n })\n } catch (error) {\n logger.warn('[useStates] Called outside QueryClientProvider, returning empty list')\n return {\n data: [],\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: [] }),\n } as any\n }\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query'\nimport { getCacheTier } from '../utils/cache'\nimport { getSupportedLanguages } from '../services/config.service'\nimport type { SdkConfig } from '../config'\nimport type { BackendLanguage, SupportedLang } from '../types/payments'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport async function getSupportedLanguagesList(config: SdkConfig): Promise<SupportedLang[]> {\n const data = await getSupportedLanguages(config)\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(config?: SdkConfig): UseQueryResult<SupportedLang[], Error> {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['supported-languages'],\n queryFn: () => getSupportedLanguagesList(cfg),\n retry: 1,\n ...getCacheTier('high'),\n });\n } catch {\n return {\n data: [],\n isLoading: false,\n error: null,\n isFetching: false,\n isPending: false,\n isError: false,\n isSuccess: true,\n status: 'success',\n fetchStatus: 'idle',\n refetch: async () => ({\n data: [],\n isLoading: false,\n error: null,\n isFetching: false,\n isPending: false,\n isError: false,\n isSuccess: true,\n status: 'success',\n fetchStatus: 'idle',\n } as unknown as UseQueryResult<SupportedLang[], Error>),\n } as unknown as UseQueryResult<SupportedLang[], Error>;\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 * Currencies Hook\n *\n * React Query hook for fetching supported currencies from the payment service.\n * Stateless - requires config parameter.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { getCacheTier } from '../utils/cache'\nimport { getSupportedCurrencies } from '../services/config.service'\nimport type { SdkConfig } from '../config'\nimport type { Currency } from '../types/payments'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport async function getSupportedCurrenciesList(config: SdkConfig): Promise<Currency[]> {\n const data = await getSupportedCurrencies(config)\n return data.currencies || []\n}\n\nexport function useCurrencies(config?: SdkConfig) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['supported-currencies'],\n queryFn: () => getSupportedCurrenciesList(cfg),\n retry: 1,\n ...getCacheTier('high'),\n })\n } catch (error) {\n logger.warn('[useCurrencies] Called outside QueryClientProvider, returning empty list')\n return {\n data: [],\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: [] }),\n } as any\n }\n}\n","/**\n * Bespoke Availability Hook\n * \n * React Query hook for checking bespoke service availability.\n * Stateless - requires config parameter.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { checkAvailability } from '../services/bespoke.service'\nimport type { SdkConfig } from '../config'\nimport type { BespokeAvailability } from '../types/consultations'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\n/**\n * Get bespoke availability for a product\n */\nexport function useBespokeAvailability(product_id: string, config?: SdkConfig) {\n const ctx = useSdkContext()\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['bespoke-availability', product_id],\n queryFn: () => checkAvailability(cfg, product_id),\n enabled: !!product_id,\n retry: false,\n })\n } catch (error) {\n logger.warn('[useBespokeAvailability] Called outside QueryClientProvider, returning undefined')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\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 * Collections Hooks\n * \n * React Query hooks for fetching collections via Next.js API routes.\n * Client-side hooks fetch from API routes to avoid exposing backend URLs to browser.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { ListParams } from '../types/store'\nimport { getCacheTier } from '../utils/cache'\nimport { logger } from '../utils'\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 * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useStorefrontCollections(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: collectionKeys.list(params),\n queryFn: async () => {\n const response = await fetch(`/api/collections?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch collections')\n return response.json()\n },\n // medium — collections change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useStorefrontCollections] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook to fetch a single collection by slug for the storefront.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useStorefrontCollection(slug: string) {\n try {\n return useQuery({\n queryKey: collectionKeys.slug(slug),\n queryFn: async () => {\n const response = await fetch(`/api/collections/${slug}`)\n if (!response.ok) throw new Error('Failed to fetch collection')\n return response.json()\n },\n // medium — collection details change infrequently\n ...getCacheTier('medium'),\n enabled: !!slug,\n })\n } catch (error) {\n logger.warn('[useStorefrontCollection] Called outside QueryClientProvider, returning undefined')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n","/**\n * Products Hooks\n * \n * React Query hooks for fetching products via Next.js API routes.\n * Client-side hooks fetch from API routes to avoid exposing backend URLs to browser.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { ListParams } from '../types/store'\nimport { getCacheTier } from '../utils/cache'\nimport { logger } from '../utils'\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 onSale: (params?: ListParams) => [...productKeys.all, \"onSale\", params] as const,\n lowStock: (params?: ListParams) => [...productKeys.all, \"lowStock\", params] as const,\n}\n\n/**\n * Hook for fetching latest products.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useLatestProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: productKeys.latest(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/latest?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch latest products')\n return response.json()\n },\n // medium — latest products change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useLatestProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching popular products.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function usePopularProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: productKeys.popular(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/popular?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch popular products')\n return response.json()\n },\n // medium — popular products change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[usePopularProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching featured products.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useFeaturedProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: productKeys.featured(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/featured?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch featured products')\n return response.json()\n },\n // medium — featured products change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useFeaturedProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching new products.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useNewProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: productKeys.new(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/new?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch new products')\n return response.json()\n },\n // medium — new products change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useNewProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching products currently on sale.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useOnSaleProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: productKeys.onSale(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/on-sale?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch on-sale products')\n return response.json()\n },\n // medium — sale products change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useOnSaleProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching products with low stock.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useLowStockProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n \n return useQuery({\n queryKey: productKeys.lowStock(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/low-stock?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch low-stock products')\n return response.json()\n },\n // low — low stock status changes frequently\n ...getCacheTier('low'),\n })\n } catch (error) {\n logger.warn('[useLowStockProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching all active storefront products.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useStorefrontProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n if (params?.collectionSlug) queryParams.set('collectionSlug', params.collectionSlug)\n if (params?.search) queryParams.set('search', params.search)\n \n return useQuery({\n queryKey: productKeys.list(params),\n queryFn: async () => {\n const response = await fetch(`/api/products?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch products')\n return response.json()\n },\n // medium — product catalog changes infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useStorefrontProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching a single product by slug.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useProduct(slug: string) {\n try {\n return useQuery({\n queryKey: productKeys.detail(slug),\n queryFn: async () => {\n const response = await fetch(`/api/products/${slug}`)\n if (!response.ok) throw new Error('Failed to fetch product')\n return response.json()\n },\n // medium — product details change infrequently\n ...getCacheTier('medium'),\n enabled: !!slug,\n })\n } catch (error) {\n logger.warn('[useProduct] Called outside QueryClientProvider, returning undefined')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n\n/**\n * Hook for fetching recommended products.\n * Fetches from Next.js API route to avoid exposing backend URLs.\n */\nexport function useRecommendedProducts(params?: ListParams) {\n try {\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.pageSize) queryParams.set('pageSize', params.pageSize.toString())\n if (params?.excludeProductId) queryParams.set('excludeProductId', params.excludeProductId)\n \n return useQuery({\n queryKey: productKeys.recommended(params),\n queryFn: async () => {\n const response = await fetch(`/api/products/recommended?${queryParams.toString()}`)\n if (!response.ok) throw new Error('Failed to fetch recommended products')\n return response.json()\n },\n // medium — recommendations change infrequently\n ...getCacheTier('medium'),\n })\n } catch (error) {\n logger.warn('[useRecommendedProducts] Called outside QueryClientProvider, returning empty list')\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any\n }\n}\n","/**\n * Wishlist Hooks\n *\n * React Query hooks for wishlist operations.\n * config and accessToken are optional — if omitted, they are read from SdkContext.\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 type { SdkConfig } from '../config'\nimport { getCacheTier } from '../utils/cache'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\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\nexport function useWishlist(arg1?: SdkConfig | { page?: number; pageSize?: number }, arg2?: string | null, arg3?: { page?: number; pageSize?: number }) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? arg2 : undefined\n const params = isArg1Config ? arg3 : (arg1 as { page?: number; pageSize?: number } | undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n return useQuery({\n queryKey: [...wishlistKeys.list(), params],\n queryFn: () => token ? getWishlist(cfg, token, params) : Promise.resolve(undefined),\n enabled: !!token,\n ...getCacheTier('medium'),\n })\n } catch (error) {\n console.warn('[useWishlist] Called outside QueryClientProvider, returning empty wishlist')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useCheckInWishlist(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const productId = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n return useQuery({\n queryKey: wishlistKeys.check(productId ?? ''),\n queryFn: () => token && productId ? checkInWishlist(cfg, token, productId) : Promise.resolve({ in_wishlist: false }),\n ...getCacheTier('low'),\n enabled: !!productId && !!token,\n })\n } catch (error) {\n console.warn('[useCheckInWishlist] Called outside QueryClientProvider, returning false')\n return { data: false, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: false }) } as any\n }\n}\n\nexport function useAddToWishlist(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ productId, notes }: { productId: string; notes?: string }) =>\n token ? addToWishlist(cfg, token, productId, notes) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n } catch (error) {\n console.warn('[useAddToWishlist] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useRemoveFromWishlist(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (itemId: string) =>\n token ? removeFromWishlist(cfg, token, itemId) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n } catch (error) {\n console.warn('[useRemoveFromWishlist] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useRemoveProductFromWishlist(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (productId: string) =>\n token ? removeProductFromWishlist(cfg, token, productId) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n } catch (error) {\n console.warn('[useRemoveProductFromWishlist] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\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 * Service Booking Hooks\n *\n * React Query hooks for service bookings.\n * config and accessToken are optional — if omitted, they are read from SdkContext.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n getAvailableSlots,\n bookAppointment,\n getAppointments,\n getAppointment,\n cancelAppointment,\n getDeliverables,\n approveDeliverable,\n requestRevision,\n} from '../services/service-booking.service'\nimport type { SdkConfig } from '../config'\nimport type {\n ServiceAppointmentCreatePayload,\n} from '../types/services'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport function useAvailableSlots(\n arg1?: SdkConfig | string,\n arg2?: string,\n arg3?: string,\n arg4?: string\n) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const product_id = isArg1Config ? arg2 : (typeof arg1 === 'string' ? arg1 : undefined)\n const date_from = isArg1Config ? arg3 : (typeof arg2 === 'string' ? arg2 : undefined)\n const date_to = isArg1Config ? arg4 : (typeof arg3 === 'string' ? arg3 : undefined)\n\n try {\n const { config: cfg } = resolveHookArgs(explicitConfig, undefined, ctx)\n return useQuery({\n queryKey: [\"available-slots\", product_id, date_from, date_to],\n queryFn: () => getAvailableSlots(cfg, product_id!, date_from!, date_to!),\n enabled: !!product_id && !!date_from && !!date_to,\n })\n } catch (error) {\n logger.warn('[useAvailableSlots] Called outside QueryClientProvider, returning undefined')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useBookAppointment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: ServiceAppointmentCreatePayload) =>\n token ? bookAppointment(cfg, token, payload) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n } catch (error) {\n logger.warn('[useBookAppointment] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useAppointments(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: [\"appointments\"],\n queryFn: () => token ? getAppointments(cfg, token) : Promise.resolve([]),\n enabled: !!token,\n })\n } catch (error) {\n logger.warn('[useAppointments] Called outside QueryClientProvider, returning empty list')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useAppointment(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const id = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n return useQuery({\n queryKey: [\"appointment\", id],\n queryFn: () => token && id ? getAppointment(cfg, token, id) : Promise.resolve(undefined),\n enabled: !!id && !!token,\n })\n } catch (error) {\n logger.warn('[useAppointment] Called outside QueryClientProvider, returning undefined')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useCancelAppointment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (id: string) =>\n token ? cancelAppointment(cfg, token, id) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n } catch (error) {\n logger.warn('[useCancelAppointment] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useDeliverables(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const order_id = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n return useQuery({\n queryKey: [\"deliverables\", order_id],\n queryFn: () => token && order_id ? getDeliverables(cfg, token, order_id) : Promise.resolve([]),\n enabled: !!order_id && !!token,\n })\n } catch (error) {\n logger.warn('[useDeliverables] Called outside QueryClientProvider, returning empty list')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useApproveDeliverable(config?: SdkConfig, accessToken?: string | null, order_id?: string, deliverable_id?: string) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: () =>\n token && order_id && deliverable_id\n ? approveDeliverable(cfg, token, order_id, deliverable_id)\n : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"deliverables\", order_id] })\n },\n })\n } catch (error) {\n logger.warn('[useApproveDeliverable] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useRequestRevision(config?: SdkConfig, accessToken?: string | null, order_id?: string, deliverable_id?: string) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (feedback: string) =>\n token && order_id && deliverable_id\n ? requestRevision(cfg, token, order_id, deliverable_id, feedback)\n : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"deliverables\", order_id] })\n },\n })\n } catch (error) {\n logger.warn('[useRequestRevision] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\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 * Consultations Hooks\n *\n * React Query hooks for consultation operations.\n * config and accessToken are optional — if omitted, they are read from SdkContext.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n getConsultations,\n getConsultation,\n createConsultation,\n sendMessage,\n acceptQuote,\n rejectQuote,\n} from '../services/consultation.service'\nimport type { SdkConfig } from '../config'\nimport type {\n ConsultationCreatePayload,\n ConsultationMessagePayload,\n ConsultationQuoteAcceptPayload,\n} from '../types/consultations'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport function useConsultations(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: ['consultations'],\n queryFn: () => token ? getConsultations(cfg, token) : Promise.resolve([]),\n enabled: !!token,\n })\n } catch (error) {\n logger.warn('[useConsultations] Called outside QueryClientProvider, returning empty list')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useConsultation(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const id = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n return useQuery({\n queryKey: ['consultation', id],\n queryFn: () => token && id ? getConsultation(cfg, token, id) : Promise.resolve(undefined),\n enabled: !!id && !!token,\n })\n } catch (error) {\n logger.warn('[useConsultation] Called outside QueryClientProvider, returning undefined')\n return { data: undefined, isLoading: false, error: null, isFetching: false, refetch: () => Promise.resolve({ data: undefined }) } as any\n }\n}\n\nexport function useCreateConsultation(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: ConsultationCreatePayload) =>\n token ? createConsultation(cfg, token, payload) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultations'] })\n },\n })\n } catch (error) {\n logger.warn('[useCreateConsultation] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useSendMessage(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const consultationId = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: ConsultationMessagePayload) =>\n token && consultationId ? sendMessage(cfg, token, consultationId, payload) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultation', consultationId] })\n },\n })\n } catch (error) {\n logger.warn('[useSendMessage] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useAcceptQuote(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const consultationId = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: ConsultationQuoteAcceptPayload) =>\n token && consultationId ? acceptQuote(cfg, token, consultationId, payload) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultation', consultationId] })\n },\n })\n } catch (error) {\n logger.warn('[useAcceptQuote] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\n\nexport function useRejectQuote(arg1?: SdkConfig | string, arg2?: string | null, arg3?: string) {\n const ctx = useSdkContext()\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined\n const explicitToken = isArg1Config ? (arg2 as string | null) : undefined\n const consultationId = isArg1Config ? arg3 : (typeof arg1 === 'string' ? arg1 : undefined)\n\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(explicitConfig, explicitToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (reason?: string) =>\n token && consultationId ? rejectQuote(cfg, token, consultationId, reason) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['consultation', consultationId] })\n },\n })\n } catch (error) {\n logger.warn('[useRejectQuote] Called outside QueryClientProvider, returning no-op mutation')\n return { mutate: () => {}, mutateAsync: () => Promise.resolve(undefined) } as any\n }\n}\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","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { fetchEventSource, EventSourceMessage } from '@microsoft/fetch-event-source';\nimport type { SdkConfig } 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 config: SdkConfig;\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 config,\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 streamUrl = `${config.backendUrls.payment}/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 type { SdkConfig } from '../config';\nimport { logger } from '../utils';\nimport { useSdkContext } from '../context/sdk-context';\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\nexport interface UseOrderStreamOptions {\n config?: SdkConfig;\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 config: explicitConfig,\n orderId, \n onPaymentComplete, \n onDigitalReady, \n onBespokeUpdate, \n onConsultationUpdate, \n onServiceBookingUpdate, \n onError \n}: UseOrderStreamOptions) {\n const ctx = useSdkContext();\n const config = explicitConfig ?? ctx?.config;\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!orderId || !config) {\n return;\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n const streamUrl = `${config.backendUrls.payment}/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","/**\n * Mobile Detection Hook\n * \n * React hook for detecting mobile viewport using matchMedia.\n * Generic utility that can be used across different storefronts.\n */\nimport { useEffect, useState } from 'react'\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = useState(false)\n\n useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => setIsMobile(mql.matches)\n mql.addEventListener('change', onChange)\n setIsMobile(mql.matches)\n return () => mql.removeEventListener('change', onChange)\n }, [])\n\n return isMobile\n}\n","import { useEffect, useCallback, useState, useRef } from \"react\";\nimport { useSupportedLanguages } from \"./use-languages\";\nimport type { SdkConfig } from \"../config\";\nimport { useSdkContext, resolveHookArgs } from \"../context/sdk-context\";\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(configOrLang?: SdkConfig | string, appLang?: string) {\n const ctx = useSdkContext();\n let cfg: SdkConfig;\n let lang: string;\n\n if (typeof configOrLang === 'string') {\n lang = configOrLang;\n cfg = resolveHookArgs(undefined, undefined, ctx).config;\n } else {\n lang = appLang ?? 'en';\n cfg = resolveHookArgs(configOrLang, undefined, ctx).config;\n }\n\n const [isLoaded, setIsLoaded] = useState(false);\n const initRef = useRef(false);\n const { data: supportedLangs = [] } = useSupportedLanguages(cfg);\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 (lang === \"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: { code: string }) => 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 }, [lang, supportedLangs]);\n\n // Sync language changes\n useEffect(() => {\n if (isLoaded || (lang === \"en\" && initRef.current)) {\n changeLanguage(lang);\n }\n }, [lang, isLoaded, changeLanguage]);\n\n return { isLoaded };\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { createDedicatedAccount, initiatePayment, verifyTransaction, getTransactionStatus } from \"../services/payment.service\";\nimport type { SdkConfig } from \"../config\";\nimport type { DVACreateRequest, PaymentInitiateRequest } from \"../types/payments\";\nimport { logger } from \"../utils\";\nimport { useSdkContext, resolveHookArgs } from \"../context/sdk-context\";\n\n/**\n * Hook for creating a Dedicated Virtual Account (DVA)\n * Optional config and accessToken — read from SdkContext if omitted.\n */\nexport function useCreateDVA(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext();\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (request: DVACreateRequest) =>\n token ? createDedicatedAccount(cfg, token, request) : Promise.reject('No access token'),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['payment'] });\n },\n });\n } catch (error) {\n logger.warn('[useCreateDVA] Called outside QueryClientProvider, returning no-op mutation');\n return {\n mutate: () => {},\n mutateAsync: () => Promise.resolve(undefined),\n } as any;\n }\n}\n\n/**\n * Hook for initiating card payment\n * Optional config and accessToken — read from SdkContext if omitted.\n */\nexport function useInitiatePayment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext();\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n return useMutation({\n mutationFn: (request: PaymentInitiateRequest) =>\n token ? initiatePayment(cfg, token, request) : Promise.reject('No access token'),\n });\n } catch (error) {\n logger.warn('[useInitiatePayment] Called outside QueryClientProvider, returning no-op mutation');\n return {\n mutate: () => {},\n mutateAsync: () => Promise.resolve(undefined),\n } as any;\n }\n}\n\n/**\n * Hook for verifying a transaction\n * Optional config — read from SdkContext if omitted.\n */\nexport function useVerifyTransaction(config?: SdkConfig) {\n const ctx = useSdkContext();\n try {\n const { config: cfg } = resolveHookArgs(config, undefined, ctx);\n return useMutation({\n mutationFn: (reference: string) => verifyTransaction(cfg, reference),\n });\n } catch (error) {\n logger.warn('[useVerifyTransaction] Called outside QueryClientProvider, returning no-op mutation');\n return {\n mutate: () => {},\n mutateAsync: () => Promise.resolve(undefined),\n } as any;\n }\n}\n\n/**\n * Hook for getting transaction status\n * Optional config — read from SdkContext if omitted.\n */\nexport function useTransactionStatus(arg1?: SdkConfig | string, arg2?: string | boolean, arg3?: boolean) {\n const ctx = useSdkContext();\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1;\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined;\n const transactionId = isArg1Config ? (arg2 as string) : (typeof arg1 === 'string' ? arg1 : '');\n const enabled = isArg1Config ? (arg3 ?? false) : (typeof arg2 === 'boolean' ? arg2 : false);\n\n try {\n const { config: cfg } = resolveHookArgs(explicitConfig, undefined, ctx);\n return useQuery({\n queryKey: ['transaction', 'status', transactionId],\n queryFn: () => getTransactionStatus(cfg, transactionId),\n enabled: enabled && !!transactionId,\n refetchInterval: 3000,\n });\n } catch (error) {\n logger.warn('[useTransactionStatus] Called outside QueryClientProvider, returning undefined');\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any;\n }\n}\n\n/**\n * Hook for checking transaction status with automatic polling\n * Optional config — read from SdkContext if omitted.\n */\nexport function usePollTransactionStatus(arg1?: SdkConfig | string, arg2?: string | boolean, arg3?: boolean) {\n const ctx = useSdkContext();\n const isArg1Config = typeof arg1 === 'object' && arg1 !== null && 'businessId' in arg1;\n const explicitConfig = isArg1Config ? (arg1 as SdkConfig) : undefined;\n const reference = isArg1Config ? (arg2 as string) : (typeof arg1 === 'string' ? arg1 : '');\n const enabled = isArg1Config ? (arg3 ?? false) : (typeof arg2 === 'boolean' ? arg2 : false);\n\n try {\n const { config: cfg } = resolveHookArgs(explicitConfig, undefined, ctx);\n return useQuery({\n queryKey: ['transaction', 'poll', reference],\n queryFn: () => verifyTransaction(cfg, reference),\n enabled: enabled && !!reference,\n refetchInterval: 2000,\n retry: 10,\n });\n } catch (error) {\n logger.warn('[usePollTransactionStatus] Called outside QueryClientProvider, returning undefined');\n return {\n data: undefined,\n isLoading: false,\n error: null,\n isFetching: false,\n refetch: () => Promise.resolve({ data: undefined }),\n } as any;\n }\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 * CMS Hooks\n *\n * React Query hooks for CMS model and entry operations.\n * config and accessToken are optional — if omitted, they are read from SdkContext.\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 type { SdkConfig } from '../config'\nimport type {\n CmsEntry,\n CreateCmsEntryParams,\n UpdateCmsEntryParams,\n ListCmsEntriesParams,\n} from '../types/cms'\nimport { logger } from '../utils'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\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 * Signature can be:\n * useCmsEntries(config, modelSlug, params)\n * useCmsEntries(modelSlug, params)\n */\nexport function useCmsEntries(\n configOrModelSlug: SdkConfig | string,\n modelSlugOrParams?: string | ListCmsEntriesParams,\n maybeParams?: ListCmsEntriesParams\n): UseCmsEntriesReturn {\n const ctx = useSdkContext()\n let cfg: SdkConfig\n let slug: string\n let params: ListCmsEntriesParams | undefined\n\n if (typeof configOrModelSlug === 'string') {\n slug = configOrModelSlug\n params = modelSlugOrParams as ListCmsEntriesParams | undefined\n cfg = resolveHookArgs(undefined, undefined, ctx).config\n } else {\n cfg = configOrModelSlug\n slug = modelSlugOrParams as string\n params = maybeParams\n }\n\n try {\n const query = useQuery({\n queryKey: ['cms-entries', slug, params],\n queryFn: () => listCmsEntries(cfg, slug, params),\n enabled: !!slug,\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 } catch (error) {\n logger.warn('[useCmsEntries] Called outside QueryClientProvider, returning empty list')\n return {\n entries: [],\n total: 0,\n page: 1,\n page_size: 50,\n isLoading: false,\n error: null,\n refetch: () => {},\n }\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 * Signature can be:\n * useCmsEntry(config, modelSlug, entryId)\n * useCmsEntry(modelSlug, entryId)\n */\nexport function useCmsEntry(\n configOrModelSlug: SdkConfig | string,\n modelSlugOrEntryId: string,\n maybeEntryId?: string\n): UseCmsEntryReturn {\n const ctx = useSdkContext()\n let cfg: SdkConfig\n let slug: string\n let entryId: string\n\n if (maybeEntryId !== undefined) {\n cfg = configOrModelSlug as SdkConfig\n slug = modelSlugOrEntryId\n entryId = maybeEntryId\n } else {\n cfg = resolveHookArgs(undefined, undefined, ctx).config\n slug = configOrModelSlug as string\n entryId = modelSlugOrEntryId\n }\n\n try {\n const query = useQuery({\n queryKey: ['cms-entry', slug, entryId],\n queryFn: () => getCmsEntry(cfg, slug, entryId),\n enabled: !!slug && !!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 } catch (error) {\n logger.warn('[useCmsEntry] Called outside QueryClientProvider, returning undefined')\n return {\n entry: undefined,\n isLoading: false,\n error: null,\n refetch: () => {},\n }\n }\n}\n\nexport interface UseCreateCmsEntryReturn {\n createEntry: (params: CreateCmsEntryParams) => void\n isLoading: boolean\n error: Error | null\n}\n\nexport function useCreateCmsEntry(config?: SdkConfig, accessToken?: string | null, modelSlug?: string): UseCreateCmsEntryReturn {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: (params: CreateCmsEntryParams) =>\n token && modelSlug ? createCmsEntry(cfg, token, modelSlug, params) : Promise.reject('No access token or modelSlug'),\n onSuccess: () => {\n if (modelSlug) 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 } catch (error) {\n logger.warn('[useCreateCmsEntry] Called outside QueryClientProvider, returning no-op mutation')\n return {\n createEntry: () => {},\n isLoading: false,\n error: null,\n }\n }\n}\n\nexport interface UseUpdateCmsEntryReturn {\n updateEntry: (entryId: string, params: UpdateCmsEntryParams) => void\n isLoading: boolean\n error: Error | null\n}\n\nexport function useUpdateCmsEntry(config?: SdkConfig, accessToken?: string | null, modelSlug?: string): UseUpdateCmsEntryReturn {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: ({ entryId, params }: { entryId: string; params: UpdateCmsEntryParams }) =>\n token && modelSlug ? updateCmsEntry(cfg, token, modelSlug, entryId, params) : Promise.reject('No access token or modelSlug'),\n onSuccess: () => {\n if (modelSlug) {\n queryClient.invalidateQueries({ queryKey: ['cms-entries', modelSlug] })\n queryClient.invalidateQueries({ queryKey: ['cms-entry', modelSlug] })\n }\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 } catch (error) {\n logger.warn('[useUpdateCmsEntry] Called outside QueryClientProvider, returning no-op mutation')\n return {\n updateEntry: () => {},\n isLoading: false,\n error: null,\n }\n }\n}\n\nexport interface UseDeleteCmsEntryReturn {\n deleteEntry: (entryId: string) => void\n isLoading: boolean\n error: Error | null\n}\n\nexport function useDeleteCmsEntry(config?: SdkConfig, accessToken?: string | null, modelSlug?: string): UseDeleteCmsEntryReturn {\n const ctx = useSdkContext()\n try {\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: (entryId: string) =>\n token && modelSlug ? deleteCmsEntry(cfg, token, modelSlug, entryId) : Promise.reject('No access token or modelSlug'),\n onSuccess: () => {\n if (modelSlug) {\n queryClient.invalidateQueries({ queryKey: ['cms-entries', modelSlug] })\n queryClient.invalidateQueries({ queryKey: ['cms-entry', modelSlug] })\n }\n },\n })\n\n return {\n deleteEntry: mutation.mutate,\n isLoading: mutation.isPending,\n error: mutation.error as Error | null,\n }\n } catch (error) {\n logger.warn('[useDeleteCmsEntry] Called outside QueryClientProvider, returning no-op mutation')\n return {\n deleteEntry: () => {},\n isLoading: false,\n error: null,\n }\n }\n}\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"],"mappings":"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","names":["React","useContext","React","useContext","useQuery","useMutation","useQueryClient","isDevelopment","isDevelopment","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","buildFullName","response","data","payload","buildFullName","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useState","useState","useEffect","useRef","fetchEventSource","useRef","useEffect","fetchEventSource","useEffect","useState","useEffect","useState","useEffect","useState","useRef","useState","useRef","useEffect","useQuery","useMutation","useQueryClient","ref","response","useQueryClient","useMutation","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation"]}