@kasuvia/sdk 0.0.8 → 0.0.9

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 (176) hide show
  1. package/README.md +42 -15
  2. package/dist/AddressAutocomplete-CjcqPElD.d.mts +46 -0
  3. package/dist/AddressAutocomplete-CvJHuRkf.d.ts +46 -0
  4. package/dist/components/index.d.mts +497 -0
  5. package/dist/components/index.d.ts +497 -0
  6. package/dist/components/index.js +4217 -0
  7. package/dist/components/index.js.map +1 -0
  8. package/dist/components/index.mjs +4194 -0
  9. package/dist/components/index.mjs.map +1 -0
  10. package/dist/config/server.d.mts +26 -0
  11. package/dist/config/server.d.ts +26 -0
  12. package/dist/config/server.js +38 -0
  13. package/dist/config/server.js.map +1 -0
  14. package/dist/config/server.mjs +13 -0
  15. package/dist/config/server.mjs.map +1 -0
  16. package/dist/hooks/index.d.mts +393 -160
  17. package/dist/hooks/index.d.ts +393 -160
  18. package/dist/hooks/index.js +2792 -2137
  19. package/dist/hooks/index.js.map +1 -1
  20. package/dist/hooks/index.mjs +2734 -2121
  21. package/dist/hooks/index.mjs.map +1 -1
  22. package/dist/index-CNW_LINy.d.mts +578 -0
  23. package/dist/index-CNW_LINy.d.ts +578 -0
  24. package/dist/{index-C1chUA3P.d.mts → index-F7N6UItS.d.mts} +1 -1
  25. package/dist/{index-C1chUA3P.d.ts → index-F7N6UItS.d.ts} +1 -1
  26. package/dist/index-NkI10J_E.d.mts +40 -0
  27. package/dist/index-NkI10J_E.d.ts +40 -0
  28. package/dist/index.d.mts +20437 -103
  29. package/dist/index.d.ts +20437 -103
  30. package/dist/index.js +2111 -1802
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.mjs +2006 -1786
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/media.service-Cx7dQjzX.d.mts +1393 -0
  35. package/dist/media.service-mrBFJ2UQ.d.ts +1393 -0
  36. package/dist/services/index.d.mts +908 -2
  37. package/dist/services/index.d.ts +908 -2
  38. package/dist/services/index.js +1492 -1686
  39. package/dist/services/index.js.map +1 -1
  40. package/dist/services/index.mjs +1431 -1670
  41. package/dist/services/index.mjs.map +1 -1
  42. package/package.json +46 -6
  43. package/src/components/bespoke/BespokeAvailabilityBadge.tsx +32 -0
  44. package/src/components/bespoke/BespokeProgressTracker.tsx +58 -0
  45. package/src/components/bespoke/index.ts +3 -0
  46. package/src/components/booking/SlotPicker.tsx +97 -0
  47. package/src/components/booking/index.ts +1 -0
  48. package/src/components/cart/CartItem.tsx +81 -0
  49. package/src/components/cart/CartSidebar.tsx +115 -0
  50. package/src/components/cart/CartTypeMismatchBanner.tsx +55 -0
  51. package/src/components/cart/index.ts +3 -0
  52. package/src/components/index.ts +8 -0
  53. package/src/components/orders/DeliverableReviewer.tsx +139 -0
  54. package/src/components/orders/index.ts +1 -0
  55. package/src/components/product/ProductCard.tsx +350 -0
  56. package/src/components/product/ProductGrid.tsx +84 -0
  57. package/src/components/product/index.ts +2 -0
  58. package/src/components/shared/AddressAutocomplete.tsx +212 -0
  59. package/src/components/shared/AnalyticsScripts.tsx +56 -0
  60. package/src/components/shared/CookieConsentBanner.tsx +98 -0
  61. package/src/components/shared/ImageEditorModal.tsx +1066 -0
  62. package/src/components/shared/ImageViewerModal.tsx +598 -0
  63. package/src/components/shared/LucideReactIcon.tsx +52 -0
  64. package/src/components/shared/MapPinDrop.tsx +101 -0
  65. package/src/components/shared/MultiSelectPicker.tsx +193 -0
  66. package/src/components/shared/OfflineBanner.tsx +46 -0
  67. package/src/components/shared/SearchableInput.tsx +153 -0
  68. package/src/components/shared/SearchablePopover.tsx +166 -0
  69. package/src/components/shared/SmartImage.tsx +311 -0
  70. package/src/components/shared/TruncatedValue.tsx +27 -0
  71. package/src/components/shared/UnsavedChangesGuard.tsx +138 -0
  72. package/src/components/shared/index.ts +15 -0
  73. package/src/components/skeletons/CardSkeleton.tsx +26 -0
  74. package/src/components/skeletons/CartItemSkeleton.tsx +26 -0
  75. package/src/components/skeletons/OrderItemSkeleton.tsx +26 -0
  76. package/src/components/skeletons/ProductCardSkeleton.tsx +26 -0
  77. package/src/components/skeletons/TableSkeleton.tsx +42 -0
  78. package/src/components/skeletons/index.ts +5 -0
  79. package/src/config/index.ts +22 -4
  80. package/src/config/server.ts +45 -0
  81. package/src/context/sdk-context.tsx +5 -2
  82. package/src/generated/auth-openapi.ts +2935 -0
  83. package/src/generated/cart-openapi.ts +652 -0
  84. package/src/generated/cms-openapi.ts +1668 -0
  85. package/src/generated/crm-openapi.ts +986 -0
  86. package/src/generated/graphql.ts +126 -0
  87. package/src/generated/index.ts +11 -0
  88. package/src/generated/media-openapi.ts +613 -0
  89. package/src/generated/notification-openapi.ts +862 -0
  90. package/src/generated/payment-openapi.ts +2713 -0
  91. package/src/generated/store-openapi.ts +9510 -0
  92. package/src/graphql/operations/collections.graphql +32 -0
  93. package/src/graphql/operations/products.graphql +197 -0
  94. package/src/graphql/operations/wishlist.graphql +25 -0
  95. package/src/hooks/index.ts +9 -2
  96. package/src/hooks/use-auth.ts +163 -69
  97. package/src/hooks/use-bespoke-availability.ts +39 -22
  98. package/src/hooks/use-business-config.ts +51 -0
  99. package/src/hooks/use-cart.ts +310 -238
  100. package/src/hooks/use-cms.ts +107 -127
  101. package/src/hooks/use-collections.ts +35 -55
  102. package/src/hooks/use-consultations.ts +9 -136
  103. package/src/hooks/use-countries.ts +19 -28
  104. package/src/hooks/use-currencies.ts +8 -20
  105. package/src/hooks/use-customer-address.ts +64 -0
  106. package/src/hooks/use-feedback.ts +34 -0
  107. package/src/hooks/use-languages.ts +26 -39
  108. package/src/hooks/use-media-upload.ts +23 -0
  109. package/src/hooks/use-notification-stream.ts +88 -0
  110. package/src/hooks/use-notifications.ts +163 -0
  111. package/src/hooks/use-order-stream.ts +29 -29
  112. package/src/hooks/use-orders.ts +91 -73
  113. package/src/hooks/use-payment.ts +116 -84
  114. package/src/hooks/use-products.ts +65 -269
  115. package/src/hooks/use-push-notifications.ts +122 -0
  116. package/src/hooks/use-reviews.ts +175 -0
  117. package/src/hooks/use-service-booking.ts +109 -132
  118. package/src/hooks/use-states.ts +16 -30
  119. package/src/hooks/use-wishlist.ts +44 -69
  120. package/src/index.ts +15 -11
  121. package/src/services/auth.service.ts +422 -132
  122. package/src/services/bespoke.service.ts +69 -10
  123. package/src/services/cart.service.ts +155 -186
  124. package/src/services/cms.service.ts +41 -50
  125. package/src/services/collection.service.ts +25 -63
  126. package/src/services/config.service.ts +10 -21
  127. package/src/services/consultation.service.ts +36 -93
  128. package/src/services/feedback.service.ts +76 -0
  129. package/src/services/index.ts +7 -1
  130. package/src/services/legal.service.ts +62 -0
  131. package/src/services/logistics.service.ts +235 -53
  132. package/src/services/media.service.ts +115 -0
  133. package/src/services/notifications.service.ts +204 -20
  134. package/src/services/order.service.ts +498 -127
  135. package/src/services/payment.service.ts +149 -100
  136. package/src/services/product.service.ts +157 -814
  137. package/src/services/review.service.ts +211 -0
  138. package/src/services/service-booking.service.ts +198 -99
  139. package/src/services/wishlist.service.ts +27 -74
  140. package/src/types/auth/index.ts +161 -18
  141. package/src/types/business/index.ts +9 -1
  142. package/src/types/cms/index.ts +91 -6
  143. package/src/types/cms/legal.ts +18 -0
  144. package/src/types/consultations/index.ts +60 -68
  145. package/src/types/index.ts +5 -3
  146. package/src/types/media/index.ts +35 -3
  147. package/src/types/payments/index.ts +80 -16
  148. package/src/types/reviews/index.ts +116 -0
  149. package/src/types/services/index.ts +113 -38
  150. package/src/types/store/checkout.ts +53 -0
  151. package/src/types/store/index.ts +273 -52
  152. package/src/types/store/invoice.ts +31 -0
  153. package/src/types/store/shipping.ts +84 -3
  154. package/src/types/ui/index.ts +1 -1
  155. package/src/utils/checkout.ts +19 -3
  156. package/src/utils/cookieConsent.ts +34 -0
  157. package/src/utils/format.ts +408 -0
  158. package/src/utils/geolocation.ts +134 -0
  159. package/src/utils/graphql-url.ts +47 -0
  160. package/src/utils/guest-session.ts +59 -0
  161. package/src/utils/http-client.ts +147 -0
  162. package/src/utils/index.ts +11 -4
  163. package/src/utils/status-colors.ts +79 -0
  164. package/src/utils/token-refresh.ts +115 -0
  165. package/src/utils/validators.ts +13 -0
  166. package/src/utils/youtube.ts +18 -0
  167. package/dist/index-C5YO9gTl.d.mts +0 -507
  168. package/dist/index-C5YO9gTl.d.ts +0 -507
  169. package/dist/index-CefG7_xq.d.mts +0 -793
  170. package/dist/index-DeHCf3zI.d.ts +0 -793
  171. package/src/graphql/collections.graphql.ts +0 -48
  172. package/src/graphql/index.ts +0 -7
  173. package/src/graphql/products.graphql.ts +0 -860
  174. package/src/graphql/wishlist.graphql.ts +0 -34
  175. package/src/hooks/use-consultation-stream.ts +0 -142
  176. package/src/types/bespoke/index.ts +0 -39
@@ -1 +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 { 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"]}
1
+ {"version":3,"sources":["../../src/hooks/use-cart.ts","../../src/utils/token-refresh.ts","../../src/utils/http-client.ts","../../src/services/cart.service.ts","../../src/utils/logger.ts","../../src/context/sdk-context.tsx","../../src/hooks/use-orders.ts","../../src/services/order.service.ts","../../src/hooks/use-consultations.ts","../../src/services/consultation.service.ts","../../src/hooks/use-feedback.ts","../../src/services/feedback.service.ts","../../src/hooks/use-customer-address.ts","../../src/utils/customer.ts","../../src/services/auth.service.ts","../../src/hooks/use-auth.ts","../../src/hooks/use-countries.ts","../../src/hooks/use-states.ts","../../src/hooks/use-languages.ts","../../src/utils/cache.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/utils/graphql-url.ts","../../src/generated/graphql.ts","../../src/services/collection.service.ts","../../src/hooks/use-products.ts","../../src/services/product.service.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-order-stream.ts","../../src/utils/format.ts","../../src/hooks/use-reviews.ts","../../src/services/review.service.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","../../src/hooks/use-business-config.ts","../../src/hooks/use-notifications.ts","../../src/services/notifications.service.ts","../../src/hooks/use-notification-stream.ts","../../src/hooks/use-push-notifications.ts","../../src/hooks/use-media-upload.ts","../../src/services/media.service.ts"],"sourcesContent":["/**\n * Cart Hook & Context Provider\n *\n * React Query hooks for cart operations with unified drawer state sharing.\n * All cart operations route directly to kasuvia-cart-management via the SDK\n * service functions — never through framework-coupled proxy routes.\n *\n * - Authenticated users: use Authorization Bearer token\n * - Guest users: use guestSessionId (X-Guest-Session header)\n *\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 {\n getCart,\n getGuestCart,\n addToCart,\n addToGuestCart,\n updateCartItem,\n updateGuestCartItemQuantity,\n removeFromCart,\n removeFromGuestCart,\n clearCart,\n clearGuestCart,\n mergeGuestCartIfPresent,\n} from '../services/cart.service'\nimport { logger } from '../utils/logger'\nimport type { CartItem, CartResponse, Product } from '../types/store'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\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 /** Rejects with the real backend error on failure — the optimistic UI update it made is already rolled back by then; catch this to show why. */\n updateQty: (itemId: string, quantity: number) => Promise<CartResponse>\n /** Rejects with the real backend error on failure — the optimistic UI update it made is already rolled back by then; catch this to show why. */\n removeItem: (itemId: string) => Promise<void>\n subtotal: number\n productTypeMismatch: ProductTypeMismatchDetail | null\n handleClearCartAndAdd: () => void\n handleKeepCurrentCart: () => void\n}\n\n// ── React Context for Shared Drawer State ─────────────────────────────────────\n\nexport interface ProductTypeMismatchDetail {\n message: string\n existing_type: string\n new_type: string\n}\n\nexport interface CartContextValue {\n isOpen: boolean\n setOpen: (open: boolean) => void\n // REAL BUG FIXED (2026-09-24): this used to be a plain useState() local to\n // every individual useCart() call - since each component invoking\n // useCart() gets its own separate hook instance, a mismatch set by\n // ProductDetailClient's addToCartMutation could never be seen by\n // CartClient's own \"keep cart or clear it\" dialog (a different component,\n // a different useCart() instance, a different local state). Lifted into\n // this same shared context isOpen/setOpen already use, for the same\n // reason: real cross-component cart state belongs here, not in a hook-\n // local useState.\n productTypeMismatch: ProductTypeMismatchDetail | null\n setProductTypeMismatch: (detail: ProductTypeMismatchDetail | null) => 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 const [productTypeMismatch, setProductTypeMismatch] = useState<ProductTypeMismatchDetail | null>(null)\n if (!CartCtx) return children\n return React.createElement(CartCtx.Provider, { value: { isOpen, setOpen: setIsOpen, productTypeMismatch, setProductTypeMismatch } }, children)\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────────\n\nexport function useCart(\n config?: SdkConfig,\n accessToken?: string | null,\n guestSessionId?: string | null\n): UseCartReturn {\n const ctx = useSdkContext();\n const resolved = resolveHookArgs(config, accessToken, ctx);\n const resolvedConfig = resolved.config;\n const resolvedToken = resolved.accessToken;\n // Falls back to SdkContext's guestSessionId (set by SdkProvider) when not\n // passed explicitly — matches config/accessToken's own resolution pattern,\n // so every real call site (none of which ever passed this explicitly) picks\n // it up automatically. See utils/guest-session.ts for why this matters:\n // without it, anonymous add-to-cart has never worked at all.\n guestSessionId = guestSessionId !== undefined ? guestSessionId : (ctx?.guestSessionId ?? null)\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 // See CartContextValue's own doc comment: this must be context-shared\n // (not a local useState) so the \"keep cart or clear it\" dialog on the\n // cart page can actually see a mismatch that happened while adding from\n // a product page - a different component, a different useCart() call.\n const productTypeMismatch = context ? context.productTypeMismatch : null\n const setProductTypeMismatch = context ? context.setProductTypeMismatch : () => {}\n\n // Single source of truth for this identity's cart query key — every\n // mutation's optimistic-update/rollback logic below targets this same key,\n // so it must never be computed two different ways.\n const cartQueryKey = ['cart', resolvedToken ?? guestSessionId ?? 'anon']\n\n // ── Cart Query ─────────────────────────────────────────────────────────────\n // Authenticated → getCart(token)\n // Guest → getGuestCart(guestSessionId)\n // No identity → return empty cart (do not throw)\n const cartQuery = useQuery({\n queryKey: cartQueryKey,\n queryFn: async (): Promise<CartResponse> => {\n if (resolvedToken) {\n return getCart(resolvedConfig, resolvedToken)\n }\n if (guestSessionId) {\n return getGuestCart(resolvedConfig, guestSessionId)\n }\n // No identity — return an empty cart shape; caller can render an empty state.\n return { items: [], subtotal: 0, total: 0, item_count: 0, product_type: undefined }\n },\n enabled: !!(resolvedToken || guestSessionId),\n })\n\n // ── Add to Cart Mutation ──────────────────────────────────────────────────\n const addToCartMutation = useMutation({\n mutationFn: async (item: Parameters<typeof addToCart>[2]) => {\n if (resolvedToken) {\n return addToCart(resolvedConfig, resolvedToken, item)\n }\n if (guestSessionId) {\n return addToGuestCart(resolvedConfig, guestSessionId, item)\n }\n throw new Error('Cannot add to cart: no access token or guest session ID provided.')\n },\n onSuccess: () => {\n setProductTypeMismatch(null)\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n // REAL BUG FIXED (2026-09-24), live-reported (\"mixed products between\n // physical to digital\"): this read `error.status`/`error.data` - but\n // apiRequest throws a real `ApiError` (utils/http-client.ts), whose\n // fields are `.status`/`.body`/`.message`, not `.data` - `err.data` was\n // always `undefined`, so this branch could never fire even when the\n // backend genuinely sent a 409. Separately, kasuvia-cart-management's\n // error body is a huma ErrorModel (`{detail: \"plain string\"}`), never a\n // nested `{detail: {code, ...}}` object - this service's own\n // TranslateServiceError doc comment already documents that convention\n // (a bracketed \"[CODE] ...\" prefix in the message string, matching\n // every other cart error). Parses that same convention here instead of\n // a response shape the backend never produces.\n onError: (error: unknown) => {\n const err = error as { status?: number; message?: string }\n if (err.status !== 409 || !err.message?.startsWith('[CART_PRODUCT_TYPE_MISMATCH]')) return\n const match = err.message.match(/contains (\\w+) items\\. Add (\\w+) items/i)\n setProductTypeMismatch({\n message: err.message.replace(/^\\[CART_PRODUCT_TYPE_MISMATCH\\]\\s*/, ''),\n existing_type: match?.[1] ?? 'unknown',\n new_type: match?.[2] ?? 'unknown',\n })\n },\n })\n\n // Recomputes subtotal/total/item_count for a locally-mutated items array —\n // mirrors kasuvia-cart-management's own BuildResponse exactly (Total ===\n // Subtotal at the cart stage; delivery/tax are only added at checkout).\n // Deliberately does NOT recompute `product_type` (DeriveProductType is\n // real backend logic this shouldn't reproduce client-side) - onSettled's\n // invalidateQueries reconciles that within one round-trip regardless.\n function recomputeCartTotals(previous: CartResponse, items: CartItem[]): CartResponse {\n const subtotal = items.reduce((sum, i) => sum + i.unit_price * i.quantity, 0)\n const item_count = items.reduce((sum, i) => sum + i.quantity, 0)\n return { ...previous, items, subtotal, total: subtotal, item_count }\n }\n\n // ── Update Cart Item Mutation ─────────────────────────────────────────────\n // REAL GAP FIXED (2026-09-23), owner-requested: add-to-cart already felt\n // instant (the caller shows its own success toast without waiting for the\n // mutation to settle), but remove/update-quantity only updated the visible\n // list once the server round-trip finished and the query refetched -\n // sluggish by comparison. Both now write the predicted result straight\n // into the query cache in onMutate (matching kasuvia-cart-management's own\n // upsertLine merge/removal semantics), roll back to the exact pre-mutation\n // snapshot in onError, and always reconcile with the server's real state\n // in onSettled - the cache can never end up out of sync with the backend,\n // even if two of these fire concurrently.\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 (guestSessionId) {\n return updateGuestCartItemQuantity(resolvedConfig, guestSessionId, itemId, quantity)\n }\n throw new Error('Cannot update cart: no access token or guest session ID provided.')\n },\n onMutate: async ({ itemId, quantity }) => {\n await queryClient.cancelQueries({ queryKey: cartQueryKey })\n const previous = queryClient.getQueryData<CartResponse>(cartQueryKey)\n if (previous) {\n // Matches the real backend's own \"quantity<=0 removes the line\"\n // contract (UpdateItemQuantity's doc comment in cart_service.go).\n const items = quantity > 0\n ? previous.items.map((i) => i.id === itemId ? { ...i, quantity } : i)\n : previous.items.filter((i) => i.id !== itemId)\n queryClient.setQueryData<CartResponse>(cartQueryKey, recomputeCartTotals(previous, items))\n }\n return { previous }\n },\n onError: (error, _variables, context) => {\n if (context?.previous) {\n queryClient.setQueryData(cartQueryKey, context.previous)\n }\n logger.error('[useCart] Failed to update item quantity, rolled back:', error)\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n // ── Remove from Cart Mutation ─────────────────────────────────────────────\n // Same optimistic/rollback pattern as updateCartItemMutation above.\n const removeFromCartMutation = useMutation({\n mutationFn: async (itemId: string) => {\n if (resolvedToken) {\n return removeFromCart(resolvedConfig, resolvedToken, itemId)\n }\n if (guestSessionId) {\n return removeFromGuestCart(resolvedConfig, guestSessionId, itemId)\n }\n throw new Error('Cannot remove from cart: no access token or guest session ID provided.')\n },\n onMutate: async (itemId) => {\n await queryClient.cancelQueries({ queryKey: cartQueryKey })\n const previous = queryClient.getQueryData<CartResponse>(cartQueryKey)\n if (previous) {\n const items = previous.items.filter((i) => i.id !== itemId)\n queryClient.setQueryData<CartResponse>(cartQueryKey, recomputeCartTotals(previous, items))\n }\n return { previous }\n },\n onError: (error, _itemId, context) => {\n if (context?.previous) {\n queryClient.setQueryData(cartQueryKey, context.previous)\n }\n logger.error('[useCart] Failed to remove item, rolled back:', error)\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n // ── Clear Cart Mutation ───────────────────────────────────────────────────\n const clearCartMutation = useMutation({\n mutationFn: async () => {\n if (resolvedToken) {\n return clearCart(resolvedConfig, resolvedToken)\n }\n if (guestSessionId) {\n return clearGuestCart(resolvedConfig, guestSessionId)\n }\n throw new Error('Cannot clear cart: no access token or guest session ID provided.')\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n // ── Merge Guest Cart Mutation ─────────────────────────────────────────────\n const mergeGuestCartMutation = useMutation({\n mutationFn: (sessionId: string) => {\n if (!resolvedToken) {\n logger.warn('[useCart] mergeGuestCart called without an access token — skipping merge.')\n return Promise.resolve()\n }\n return mergeGuestCartIfPresent(resolvedConfig, resolvedToken, sessionId)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n\n // ── Convenience: add by Product object ───────────────────────────────────\n // NOTE: product_slug, product_name, image_url, unit_price, is_bespoke are\n // intentionally NOT forwarded to the backend — kasuvia-cart-management\n // resolves them server-side. They're extracted from the Product here only\n // for any local optimistic-UI the caller may implement; the backend response\n // is the authoritative cart state.\n const addItem = (product: Product, variantId?: string, quantity: number = 1, customMeasurements?: Record<string, string>) => {\n return addToCartMutation.mutate({\n product_id: product.id,\n variant_id: variantId,\n quantity,\n custom_measurements: customMeasurements ? JSON.stringify(customMeasurements) : undefined,\n // Below are accepted by the mutation signature for UI convenience but stripped before the fetch:\n product_slug: product.slug || \"\",\n product_name: product.name,\n image_url: product.images[0] || undefined,\n })\n }\n\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 // mutateAsync (not mutate) so a caller's `await updateQty(...)`/`await\n // removeItem(...)` actually rejects on failure - both already have callers\n // using `await` + try/catch expecting this (CartClient.tsx/CartDrawer.tsx),\n // but `.mutate()` returns void, so those awaits previously resolved\n // instantly regardless of outcome and never caught a real failure. The\n // optimistic cache update above already applies/rolls back independently\n // of whether the caller awaits this at all.\n const updateQty = (itemId: string, quantity: number) => {\n return updateCartItemMutation.mutateAsync({ itemId, quantity })\n }\n\n const removeItem = (itemId: string) => {\n return removeFromCartMutation.mutateAsync(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 as Error | null,\n addToCart: addToCartMutation.mutate,\n updateCartItem: updateCartItemMutation.mutate,\n removeFromCart: removeFromCartMutation.mutate,\n clearCart: clearCartMutation.mutate,\n clear: clearCartMutation.mutate,\n mergeGuestCart: mergeGuestCartMutation.mutate,\n addItem,\n updateQty,\n removeItem,\n subtotal,\n productTypeMismatch,\n handleClearCartAndAdd,\n handleKeepCurrentCart,\n }\n}\n","/**\n * Silent-refresh registry for apiRequest's automatic 401 retry.\n *\n * REAL GAP FIXED (2026-09-28), live-reported (\"authentication in\n * kasuvia-storefront is terrible, sometimes it gets cut off while using\n * the app\"): AuthProvider only ever called /api/auth/refresh once, in a\n * useEffect on mount (restoreSession()) — every one of apiRequest's ~100+\n * real call sites had zero awareness of token expiry at all. The moment a\n * customer's access token expired mid-session (JWT_ACCESS_TOKEN_LIFETIME_\n * MINUTES defaults to 30 on kasuvia-auth — see common/utils/tokens.py),\n * every subsequent authenticated call 401'd and stayed broken for the rest\n * of that browser tab, with no recovery short of a full page reload\n * (which re-runs restoreSession() exactly once more, then the cycle\n * repeats). This is a fundamentally different failure mode than \"signed\n * out on refresh\" (investigated exhaustively earlier this session and\n * found structurally sound) - it only shows up while actively using the\n * app between page loads, matching the user's own description exactly.\n *\n * Compared directly against kasuvia/ (the merchant dashboard)'s own proven\n * architecture (lib/api/interceptors.ts's withAuthInterceptors): every\n * axios instance there has a response interceptor that, on any 401 from a\n * non-refresh endpoint, transparently calls the refresh endpoint once\n * (coalescing concurrent 401s into a single in-flight refresh via a\n * pending-request queue - never a stampede of parallel refresh calls),\n * updates the in-memory access token, and retries the original request\n * with the new token - completely invisible to the calling code and the\n * user. kasuvia/ can do this because its access token lives in a plain,\n * synchronously-readable/writable module-level variable\n * (lib/api/auth/axios.ts's tokenStore), not React state - exactly what\n * makes an imperative, outside-the-render-cycle interceptor possible.\n *\n * This module ports that same pattern into kasuvia-sdk's fetch-based\n * apiRequest, which every one of the storefront's ~100+ authenticated SDK\n * calls already funnels through - fixing it once here reaches every call\n * site with zero changes to any of them. A consumer (AuthProvider) calls\n * registerRefreshHandler() once with a function that knows how to obtain a\n * fresh token (POST /api/auth/refresh, in the storefront's case) and keeps\n * its own React state in sync; apiRequest below calls it automatically\n * whenever a request carrying an Authorization header gets a real 401,\n * with the same in-flight-coalescing guarantee kasuvia/'s interceptor has.\n * If no handler is registered (e.g. a server-side call, or a consumer that\n * never opts in), behavior is completely unchanged - a 401 throws\n * immediately, exactly as before this module existed.\n *\n * REAL BUG FOUND AND FIXED while live-verifying this exact mechanism\n * (2026-09-28): kasuvia-sdk's tsup config builds each package entry point\n * (`.` / `./services` / `./hooks` / `./components`) as a fully independent\n * bundle with no shared chunk - confirmed by grepping the built output,\n * every one of the 3 real dist files contains its OWN separate copy of this\n * file's code. A plain module-level `let refreshHandler` therefore gave\n * each entry point its own invisible-to-each-other copy of this state:\n * registering via `@kasuvia/sdk` (the root entry, what AuthProvider\n * imports from) silently did nothing for any authenticated call made\n * through `@kasuvia/sdk/hooks` (a different physical bundle, and the one\n * real hooks like useWalletBalance/useCart actually route through) - the\n * exact majority-of-real-traffic case this whole fix exists for. Storing\n * the registry on `globalThis` under a fixed key instead makes it a true\n * process/tab-wide singleton no matter how many separate bundle copies of\n * this module end up loaded side by side in the same browser tab - the\n * standard fix for this exact \"multiple bundled copies of one logical\n * module\" bug class, without needing to change the package's build/\n * splitting setup (out of scope for an auth fix, wider blast radius).\n */\n\nexport type RefreshHandler = () => Promise<string | null>\n\ninterface RefreshRegistry {\n handler: RefreshHandler | null\n inFlight: Promise<string | null> | null\n}\n\nconst GLOBAL_KEY = '__kasuviaSdkTokenRefreshRegistry__'\n\nfunction getRegistry(): RefreshRegistry {\n const g = globalThis as unknown as Record<string, RefreshRegistry | undefined>\n if (!g[GLOBAL_KEY]) {\n g[GLOBAL_KEY] = { handler: null, inFlight: null }\n }\n return g[GLOBAL_KEY]!\n}\n\n/**\n * Registers the function apiRequest calls to obtain a fresh access token\n * after a 401. Call this once, e.g. in AuthProvider's top-level mount\n * effect - not tied to login state, since the handler itself is stateless\n * (it always attempts a real refresh call and returns null on failure,\n * which is exactly correct behavior whether or not a customer happens to be\n * logged in right now). `null` is accepted for a consumer that genuinely\n * unmounts its provider (e.g. route-level teardown) and wants to stop\n * apiRequest from calling a handler whose closure is about to go stale.\n */\nexport function registerRefreshHandler(handler: RefreshHandler | null): void {\n getRegistry().handler = handler\n}\n\n/**\n * Runs the registered refresh handler, coalescing concurrent callers into\n * the single in-flight attempt (mirrors withAuthInterceptors' `_isRefreshing`\n * / `_pendingQueue` exactly - several requests failing with a 401 at once\n * must never each independently call the refresh endpoint).\n */\nexport async function refreshAccessToken(): Promise<string | null> {\n const registry = getRegistry()\n if (!registry.handler) return null\n if (registry.inFlight) return registry.inFlight\n\n registry.inFlight = registry.handler().finally(() => {\n registry.inFlight = null\n })\n return registry.inFlight\n}\n\nexport function hasRefreshHandler(): boolean {\n return getRegistry().handler !== null\n}\n","import type { SdkConfig } from '../config'\nimport { refreshAccessToken, hasRefreshHandler } from './token-refresh'\n\n/**\n * Thrown by apiRequest on any non-2xx response. Carries the real HTTP status\n * and parsed body so a caller that needs to branch on status (e.g. a 409\n * \"confirmation required\" two-step flow) can catch this instead of the\n * generic client special-casing every such flow.\n */\nexport class ApiError extends Error {\n status: number\n body: unknown\n constructor(message: string, status: number, body: unknown) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.body = body\n }\n}\n\n/**\n * Extract the real, specific error message from a Kasuvia backend's error\n * body, whichever of the two real shapes this platform's services return:\n *\n * - FastAPI/Pydantic (store-management, cart-management, cms, crm-go,\n * notification-go, payment-go): `{\"detail\": \"plain string\"}` for a\n * manually-raised HTTPException, or `{\"detail\": [{\"loc\": [...], \"msg\":\n * \"...\", \"type\": \"...\"}]}` for an automatic Pydantic validation failure.\n * - Django REST Framework (kasuvia-auth): `{\"detail\": \"plain string\"}` for\n * AuthenticationFailed/NotFound/PermissionDenied-style exceptions, or a\n * bare validation-error dict with no top-level `detail` at all -\n * `{\"non_field_errors\": [...]}` or `{\"email\": [...]}\"` - when a\n * serializer's own `is_valid(raise_exception=True)` fires.\n *\n * Previously two separately-named, independently-adopted copies of this\n * logic existed (`extractHttpErrorDetail`, `extractAuthErrorMessage`) - only\n * 7 of 18 SDK service files used either one at all. Merged into one function\n * every call site now goes through via apiRequest, so error quality no\n * longer depends on which service function happens to have remembered to\n * check for it.\n */\nexport function extractApiErrorMessage(body: unknown, fallback: string): string {\n if (typeof body !== 'object' || body === null) return fallback\n const record = body as Record<string, unknown>\n\n if (typeof record.detail === 'string') return record.detail\n\n if (Array.isArray(record.detail) && record.detail.length > 0) {\n const first = record.detail[0] as Record<string, unknown> | undefined\n if (first && typeof first.msg === 'string') {\n const loc = first.loc\n const field = Array.isArray(loc) ? loc[loc.length - 1] : undefined\n return typeof field === 'string' || typeof field === 'number' ? `${field}: ${first.msg}` : first.msg\n }\n }\n\n const firstStringOrArrayItem = (value: unknown): string | undefined => {\n if (typeof value === 'string') return value\n if (Array.isArray(value) && typeof value[0] === 'string') return value[0]\n return undefined\n }\n\n const nonFieldMessage = firstStringOrArrayItem(record.non_field_errors)\n if (nonFieldMessage) return nonFieldMessage\n\n for (const [key, value] of Object.entries(record)) {\n if (key === 'detail' || key === 'non_field_errors') continue\n const message = firstStringOrArrayItem(value)\n if (message) return message\n }\n\n return fallback\n}\n\n/** `{'X-Storefront-Key': ..., 'X-Business-ID': ...}` - every storefront-scoped call. */\nexport function storefrontHeaders(config: SdkConfig): Record<string, string> {\n return {\n 'X-Storefront-Key': config.storefrontApiKey,\n 'X-Business-ID': config.businessId,\n }\n}\n\n/** storefrontHeaders plus `Authorization: Bearer <token>` - every authenticated customer call. */\nexport function authHeaders(config: SdkConfig, accessToken: string): Record<string, string> {\n return {\n ...storefrontHeaders(config),\n Authorization: `Bearer ${accessToken}`,\n }\n}\n\nexport const JSON_HEADERS: Record<string, string> = { 'Content-Type': 'application/json' }\n\nexport interface ApiRequestOptions extends RequestInit {\n /** Used when the response is a non-2xx status whose body carries nothing usable. */\n fallbackErrorMessage?: string\n}\n\n/**\n * The one real HTTP call path every REST SDK service function should use.\n * Replaces each function independently doing fetch + response.ok check +\n * error-body parsing (100 call sites across 18 files, only 7 of which\n * consistently surfaced the real backend error before this existed).\n *\n * A 204/empty body resolves to `undefined` rather than throwing on the\n * `response.json()` call - real for logout and a few other no-content\n * responses on this platform.\n *\n * Silent-refresh-and-retry on 401 (see token-refresh.ts's own doc comment\n * for the full real-world bug this fixes and the kasuvia/ pattern it\n * ports): only triggers for a request that actually carried an\n * `Authorization: Bearer` header AND has a refresh handler registered -\n * a storefront-key-only public call's 401 means something else entirely\n * (wrong key/business) and must never trigger a token refresh attempt.\n * Retries at most once per call, mirroring withAuthInterceptors' own\n * `_retry` guard - a fresh token that still 401s is a genuine, final\n * failure, not something to loop on.\n */\nexport async function apiRequest<T>(url: string, options: ApiRequestOptions = {}): Promise<T> {\n const { fallbackErrorMessage = 'Request failed', ...init } = options\n const headers = new Headers(init.headers)\n const hadBearerToken = headers.get('Authorization')?.startsWith('Bearer ') ?? false\n\n const response = await fetch(url, { ...init, headers })\n\n if (response.status === 401 && hadBearerToken && hasRefreshHandler()) {\n const freshToken = await refreshAccessToken()\n if (freshToken) {\n const retryHeaders = new Headers(headers)\n retryHeaders.set('Authorization', `Bearer ${freshToken}`)\n const retryResponse = await fetch(url, { ...init, headers: retryHeaders })\n if (retryResponse.ok) {\n const retryText = await retryResponse.text()\n return (retryText ? JSON.parse(retryText) : undefined) as T\n }\n const retryBody = await retryResponse.json().catch(() => ({}))\n throw new ApiError(extractApiErrorMessage(retryBody, fallbackErrorMessage), retryResponse.status, retryBody)\n }\n }\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}))\n throw new ApiError(extractApiErrorMessage(body, fallbackErrorMessage), response.status, body)\n }\n\n const text = await response.text()\n return (text ? JSON.parse(text) : undefined) as T\n}\n","/**\n * Cart Service\n *\n * Handles cart operations for both guest and authenticated users via\n * kasuvia-cart-management (Go/Huma). All cart operations target the\n * cart-management service, which is the single source of truth for cart state.\n *\n * KEY CONSTRAINT — backend-resolved fields:\n * kasuvia-cart-management resolves product_name, product_slug, image_url,\n * variant_attributes, unit_price, is_bespoke, and product_type entirely\n * server-side from kasuvia-store-management at add/merge time. These MUST NOT\n * be sent in request payloads — only product_id, variant_id, quantity, and\n * custom_measurements are accepted by the backend.\n *\n * Stateless — all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport { ProductTypeEnum, type CartItem, type CartResponse, type ProductType } from '../types/store'\nimport { apiRequest, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\n// REAL BUG FIXED (2026-09-21): every fetch() in this file targeted\n// `config.backendUrls.store` (kasuvia-store-management) even though this\n// file's own header comment already documented that cart moved to\n// kasuvia-cart-management (a separate Go/Huma service, strangler-fig\n// migration). kasuvia-store-management's own router.py explicitly says\n// \"Cart is NOT registered here anymore\" — every one of these calls 404s\n// against `store`. Fixed by routing through `backendUrls.cart` instead,\n// which callers must now provide (kasuvia-cart-management, same\n// `/api/v1/cart/...` route shape it was ported from — only the base URL\n// changes).\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\nfunction guestHeaders(config: SdkConfig, guestSessionId: string, extra?: Record<string, string>): Record<string, string> {\n return { ...extra, ...storefrontHeaders(config), 'X-Guest-Session': guestSessionId }\n}\n\n/**\n * Fetch guest cart from backend (Redis-backed).\n */\nexport async function getGuestCart(config: SdkConfig, guestSessionId: string): Promise<CartResponse> {\n if (!guestSessionId) throw new Error('Guest session ID is required to fetch guest cart');\n\n const data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/`, {\n headers: guestHeaders(config, guestSessionId),\n fallbackErrorMessage: 'Failed to fetch guest cart',\n })\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Add item to guest cart (Redis-backed).\n * Only product_id, variant_id, quantity, and custom_measurements are sent —\n * all other fields are resolved server-side by kasuvia-cart-management.\n */\nexport async function addToGuestCart(\n config: SdkConfig,\n guestSessionId: string,\n item: {\n product_id: string\n variant_id?: string | null\n quantity: number\n custom_measurements?: string | null\n }\n): Promise<CartResponse> {\n if (!guestSessionId) throw new Error('Guest session ID is required to add to guest cart');\n\n const payload = {\n product_id: item.product_id,\n variant_id: item.variant_id ?? undefined,\n quantity: item.quantity,\n custom_measurements: item.custom_measurements ?? undefined,\n }\n\n const data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/`, {\n method: 'POST',\n headers: guestHeaders(config, guestSessionId, JSON_HEADERS),\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to add to guest cart',\n })\n return { ...data, items: 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<CartResponse> {\n if (!guestSessionId) throw new Error('Guest session ID is required to update guest cart item');\n\n const data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/${itemId}`, {\n method: 'PATCH',\n headers: guestHeaders(config, guestSessionId, JSON_HEADERS),\n body: JSON.stringify({ quantity }),\n fallbackErrorMessage: 'Failed to update guest cart item',\n })\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Remove an item from the guest cart.\n *\n * REAL BUG FIXED (2026-09-22), live-reproduced: this used to type its\n * result as `CartResponse` and read `data.items` off it, but the real\n * backend's `DELETE /cart/{item_id}` returns `204 No Content` with a\n * genuinely empty body (confirmed live: `HTTP_STATUS:204 BODY_LENGTH:0`) -\n * `apiRequest` resolves an empty body to `undefined`, so `data.items`\n * threw `TypeError: Cannot read properties of undefined (reading 'items')`\n * on every real delete. The item really was removed server-side (the\n * DELETE request itself succeeded), but the thrown error sent\n * `removeFromCartMutation` down `onError` instead of `onSuccess`, so\n * `queryClient.invalidateQueries` never ran - a customer's cart kept\n * showing the \"removed\" item until something else (a full page reload)\n * happened to trigger a fresh, uncached fetch. Matches `clearGuestCart`'s\n * existing `Promise<void>` shape, which was already correct for this same\n * \"backend returns no body\" pattern.\n */\nexport async function removeFromGuestCart(\n config: SdkConfig,\n guestSessionId: string,\n itemId: string\n): Promise<void> {\n if (!guestSessionId) throw new Error('Guest session ID is required to remove from guest cart');\n\n await apiRequest(`${config.backendUrls.cart}/cart/${itemId}`, {\n method: 'DELETE',\n headers: guestHeaders(config, guestSessionId),\n fallbackErrorMessage: 'Failed to remove item from guest cart',\n })\n}\n\n/**\n * Clear the entire guest cart.\n */\nexport async function clearGuestCart(config: SdkConfig, guestSessionId: string): Promise<void> {\n if (!guestSessionId) throw new Error('Guest session ID is required to clear guest cart');\n\n await apiRequest(`${config.backendUrls.cart}/cart/clear`, {\n method: 'DELETE',\n headers: guestHeaders(config, guestSessionId),\n fallbackErrorMessage: 'Failed to clear guest cart',\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 throw new Error('Access token is required to fetch authenticated cart');\n }\n const data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to fetch cart',\n })\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Add item to authenticated user's cart.\n * Only product_id, variant_id, quantity, and custom_measurements are sent —\n * all other fields are resolved server-side by kasuvia-cart-management.\n */\nexport async function addToCart(\n config: SdkConfig,\n accessToken: string,\n item: {\n product_id: string\n variant_id?: string | null\n quantity: number\n custom_measurements?: string | null\n // These fields are accepted from the caller for UI convenience but are\n // NOT forwarded to the backend — kasuvia-cart-management resolves them\n // server-side. Declared here so callers don't need to strip them.\n product_slug?: string\n product_name?: string\n image_url?: string\n variant_attributes?: string\n unit_price?: number\n is_bespoke?: boolean\n }\n): Promise<CartResponse> {\n // Only send the fields the backend accepts — strip everything else.\n const payload = {\n product_id: item.product_id,\n variant_id: item.variant_id ?? undefined,\n quantity: item.quantity,\n custom_measurements: item.custom_measurements ?? undefined,\n }\n\n const data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to add to cart',\n })\n return { ...data, items: parseItems(data.items || []) }\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 data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/${itemId}`, {\n method: 'PATCH',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify({ quantity }),\n fallbackErrorMessage: 'Failed to update cart item',\n })\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Remove item from authenticated user's cart.\n * Same real bug/fix as removeFromGuestCart above - see its doc comment.\n */\nexport async function removeFromCart(\n config: SdkConfig,\n accessToken: string,\n itemId: string\n): Promise<void> {\n await apiRequest(`${config.backendUrls.cart}/cart/${itemId}`, {\n method: 'DELETE',\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to remove cart item',\n })\n}\n\n/**\n * Clear authenticated user's cart.\n */\nexport async function clearCart(config: SdkConfig, accessToken: string): Promise<void> {\n await apiRequest(`${config.backendUrls.cart}/cart/clear`, {\n method: 'DELETE',\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to clear cart',\n })\n}\n\n/**\n * Merge guest cart items into the authenticated customer's cart.\n *\n * The backend (POST /api/v1/cart/merge) accepts only:\n * { items: [{ product_id, variant_id?, quantity, custom_measurements? }] }\n * Product name, image, price, type are all re-resolved server-side.\n *\n * Sends X-Guest-Session so the backend can atomically delete the guest\n * cart (best-effort) after merging.\n */\nexport async function mergeGuestCart(\n config: SdkConfig,\n accessToken: string,\n guestSessionId: string,\n guestItems: Pick<CartItem, 'product_id' | 'variant_id' | 'quantity' | 'custom_measurements'>[]\n): Promise<CartResponse> {\n const payloadItems = guestItems.map((item) => ({\n product_id: item.product_id,\n variant_id: item.variant_id ?? undefined,\n quantity: item.quantity,\n custom_measurements: item.custom_measurements ?? undefined,\n }))\n\n const headers: Record<string, string> = { ...JSON_HEADERS, ...authHeaders(config, accessToken) }\n if (guestSessionId) {\n headers[\"X-Guest-Session\"] = guestSessionId\n }\n\n const data = await apiRequest<CartResponse>(`${config.backendUrls.cart}/cart/merge`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ items: payloadItems }),\n fallbackErrorMessage: 'Failed to merge guest cart',\n })\n return { ...data, items: parseItems(data.items || []) }\n}\n\n/**\n * Convenience wrapper: fetch guest cart and merge 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 const guestCart = await getGuestCart(config, guestSessionId)\n if (!guestCart.items.length) return\n await mergeGuestCart(config, accessToken, guestSessionId, guestCart.items)\n}\n\n/**\n * Helper to get a guest cart's product type (for type-mismatch checks before adding an item).\n */\nexport function getGuestCartProductType(items?: CartItem[]): ProductType | null {\n if (!items || !items.length) return null;\n const types = new Set(items.map(i => i.product_type).filter(Boolean));\n if (types.size === 0) return null;\n if (types.size === 1) return ([...types][0] as ProductType) ?? null;\n return ProductTypeEnum.PHYSICAL;\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","'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 /** Current browser's guest cart session id (see utils/guest-session.ts) — null when unauthenticated context hasn't resolved one yet, or when the caller is authenticated and doesn't need one. */\n guestSessionId?: string | null;\n}\n\nconst SdkContext = createContext<SdkContextValue | null>(null);\n\nexport interface SdkProviderProps {\n config: SdkConfig;\n accessToken: string | null;\n guestSessionId?: string | null;\n children: ReactNode;\n}\n\nexport function SdkProvider({ config, accessToken, guestSessionId, children }: SdkProviderProps) {\n return (\n <SdkContext.Provider value={{ config, accessToken, guestSessionId }}>\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, createBespokeOrder, createServiceBookingOrder } from '../services/order.service'\nimport type { FindOrderParams, CreateOrderParams } from '../types/store'\nimport type { CreateBespokeOrderParams, CreateServiceBookingOrderParams } from '../services/order.service'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\n// REAL BUG FIXED (2026-09-21): this used `pageSize` (camelCase), but the\n// real `getOrders` param it's forwarded to reads `page_size` (snake_case,\n// matching every other Kasuvia paginated endpoint) — the value was silently\n// dropped on every call, always falling back to the backend's default page\n// size instead of the caller's requested one.\nexport function useOrders(arg1?: SdkConfig | { page?: number; page_size?: number }, arg2?: string | null, arg3?: { page?: number; page_size?: 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; page_size?: number } | undefined)\n\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.reject(new Error('No access token available')),\n enabled: !!token,\n })\n}\n\nexport function useOrdersList(arg1?: unknown, arg2?: unknown, arg3?: unknown) {\n return useOrders(arg1 as SdkConfig, arg2 as string, arg3 as { page?: number; page_size?: number })\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 const { config: cfg } = resolveHookArgs(explicitConfig, undefined, ctx)\n return useQuery({\n queryKey: ['order', params],\n queryFn: () => params ? findOrder(cfg, params) : Promise.reject(new Error('Missing search parameters')),\n // findOrder's real backend contract (POST /orders/track) requires both\n // order_id and email — matches that instead of firing on order_id alone.\n enabled: !!params?.order_id && !!params?.email,\n })\n}\n\nexport function useOrder(arg1?: SdkConfig | string | FindOrderParams, arg2?: FindOrderParams) {\n return useFindOrder(arg1, arg2)\n}\n\n/**\n * REAL BUG FIXED (2026-09-22): took an arbitrary \"guestToken\" string —\n * trackOrder's real backend endpoint (GET /orders/{id}) has no guest-token\n * concept at all, it requires a genuine authenticated JWT belonging to the\n * order's own customer (see trackOrder's doc comment). Resolves a real\n * accessToken from SdkContext like every other authenticated hook instead.\n */\nexport function useOrderTracking(config?: SdkConfig, accessToken?: string | null, orderId?: string) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: ['order-tracking', orderId],\n queryFn: () => token && orderId ? trackOrder(cfg, orderId, token) : Promise.reject(new Error('Missing order ID or access token')),\n enabled: !!orderId && !!token,\n refetchInterval: 30000,\n })\n}\n\n/**\n * REAL BUG FIXED (2026-09-22): passed `token || ''` — an empty string\n * `accessToken`, which used to produce a malformed `Authorization: Bearer `\n * header instead of genuinely omitting it. Combined with createOrder's own\n * fix (see its doc comment), guest checkout through this hook has never\n * actually worked even though the real backend endpoint was built to\n * support it via X-Guest-Session — the same guestSessionId SdkContext\n * already resolves for every useCart() call site now also reaches here.\n */\nexport function useCreateOrder(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const guestSessionId = ctx?.guestSessionId ?? undefined\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CreateOrderParams) => createOrder(cfg, token ?? undefined, payload, guestSessionId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n\nexport function useCreateBespokeOrder(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CreateBespokeOrderParams) => createBespokeOrder(cfg, token || undefined, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n\nexport function useCreateServiceBookingOrder(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CreateServiceBookingOrderParams) => createServiceBookingOrder(cfg, token || undefined, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n\nexport function useCancelOrder(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\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(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\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 { components } from '../generated/store-openapi'\nimport { apiRequest, ApiError, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\n// ─── Generated types (openapi/README.md — regenerate via `pnpm run codegen:rest`) ─\n// REAL BUG FOUND (2026-09-23) via this exact codegen initiative: the real\n// OrderResponse schema (kasuvia-store-management's app/schemas/order.py)\n// carries NO tracking_number/delivery_status/carrier_name/carrier_slug/\n// terminal_rate_id/terminal_shipment_id/shipping_address/shipping_surcharge_*/\n// declared_weight_kg/actual_weight_kg/pickup_verification_*/pickup_qr_payload\n// fields at its top level at all - confirmed by reading OrderBase/\n// OrderResponse's actual field lists directly, not just the generated\n// output. Every one of these genuinely lives nested under\n// `physical_fulfillment` (see PhysicalFulfillmentResponse below) - \"One\n// nested block per product type, instead of ~35 flat fields on OrderBase\"\n// per that file's own Order Schema Refactor comment. RawOrder/\n// normaliseStorefrontOrder below used to read every one of these as a flat\n// top-level field, so they were silently undefined on every real order -\n// a customer's tracking number, carrier, delivery status, and shipping\n// address never actually rendered anywhere on the storefront. Fixed to\n// read from the real nested location, same pattern already correctly\n// applied to bespoke_fulfillment (see deriveCustomerName/\n// normaliseStorefrontOrder's existing bespoke_fulfillment-first reads).\ntype OrderResponseSchema = components['schemas']['OrderResponse']\ntype PhysicalFulfillmentSchema = components['schemas']['PhysicalFulfillmentResponse']\ntype DigitalFulfillmentSchema = components['schemas']['DigitalFulfillmentResponse']\n\nexport type { FindOrderParams, CreateOrderParams, OrderStatus }\n\n/**\n * Request body for the real POST /orders/storefront/bespoke atomic checkout\n * (kasuvia-store-management's BespokeBookingCheckoutRequest). Bespoke\n * products can never be added to a cart (ErrBespokeNotCartable) — this is\n * the only real path to a paid bespoke commission from the storefront.\n */\nexport interface CreateBespokeOrderParams {\n product_id: string\n brief: string\n reference_images?: string[]\n measurements?: Record<string, string>\n preferred_timeline?: string\n special_instructions?: string\n deposit_ratio?: number\n physical?: {\n shipping_address: Record<string, unknown>\n }\n notes?: string\n discount_code?: string\n guest_email?: string\n guest_name?: string\n guest_phone?: string\n checkout_session_id?: string\n}\n\n/**\n * Request body for the real POST /orders/storefront/service atomic PAID\n * checkout (kasuvia-store-management's ServiceBookingCheckoutRequest) —\n * distinct from the free self-service `bookAppointment` flow\n * (service-booking.service.ts, POST /service/bookings/schedule). Service\n * products can never be added to a cart (ErrServiceNotCartable) — this is\n * the only path to a PAID service booking from the storefront.\n */\nexport interface CreateServiceBookingOrderParams {\n product_id: string\n scheduled_date: string\n scheduled_time: string\n staff_id?: string\n notes?: string\n discount_code?: string\n guest_email?: string\n guest_name?: string\n guest_phone?: string\n checkout_session_id?: string\n}\n\ntype RawOrderItem = NonNullable<OrderResponseSchema['items']>[number]\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\n/**\n * The real backend response, typed from the generated schema (see the\n * codegen comment above `OrderResponseSchema`). `status` is narrowed from\n * the schema's bare `string` (OrderResponse.status has no Literal/Enum on\n * the backend either — it's genuinely just `str` there) to the SDK's own\n * real OrderStatus union.\n *\n * `cancellation_reason` and `bespoke_stage` are NOT part of this type\n * (confirmed absent from OrderResponse/PhysicalFulfillmentResponse/\n * BespokeFulfillmentResponse's real field lists) — see\n * normaliseStorefrontOrder's own comments on both for what actually backs\n * (or doesn't back) the public Order type's equivalent fields.\n */\n// NOTE: deliberately NOT `Omit<OrderResponseSchema, 'status'> & {...}` -\n// OrderResponseSchema is intersected with a string-index signature\n// (`& {[key: string]: unknown}`, from the backend's `extra: \"allow\"`\n// model_config), and `Omit`'s `Pick<T, Exclude<keyof T, K>>` definition\n// makes `keyof` collapse to just `string` on a type with a string index\n// signature, silently losing every specific field (every property access\n// on the \"Omit\" result then wrongly resolves to `{}`). A plain\n// intersection avoids `keyof` entirely and works correctly instead.\ntype RawOrder = OrderResponseSchema & { status: OrderStatus }\n\n/** The real, non-null shipping_address shape (PhysicalFulfillmentResponse's\n * own field types as a schemaless `Dict[str, Any]` on the backend, so\n * openapi-typescript can't infer it beyond \"some object\" — this is the same\n * defensive cast the code already did before this fix, just now sourced\n * from the real nested location). */\nfunction extractShippingAddress(raw: RawOrder): RawShippingAddress | null {\n const val = raw.physical_fulfillment?.shipping_address\n return typeof val === 'object' && val !== null ? val as unknown as RawShippingAddress : null\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 = extractShippingAddress(raw)\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 order_id: item.order_id,\n product_id: item.product_id ?? undefined,\n variant_id: item.variant_id ?? undefined,\n product_name: item.product_name ?? '',\n quantity: item.quantity,\n unit_price: item.unit_price,\n variant_details: item.variant_details as Record<string, unknown> | undefined,\n custom_measurements: item.custom_measurements as Record<string, unknown> | undefined,\n image_url: item.image_url ?? undefined,\n }))\n\n const addr = extractShippingAddress(raw)\n\n const customerName = deriveCustomerName(raw)\n const customerEmail = raw.guest_email ?? raw.customer_email ?? ''\n const physical = raw.physical_fulfillment\n\n // No silent fallback: an order's currency determines what a subsequent\n // payment actually gets charged in. A missing value here means the backend\n // response is malformed — defaulting to a guessed currency would make the\n // failure invisible until money changes hands in the wrong currency\n // (see plan: Order Currency Fix).\n if (!raw.currency) {\n throw new Error(`Order ${raw.id} response is missing a currency field.`)\n }\n // REAL BUG FIXED (2026-09-22): same class of bug as the currency check\n // above, previously missed. `created_at`/`updated_at` silently fell back\n // to `new Date().toISOString()` (right now) when absent — fabricating a\n // plausible but wrong \"placed on\" date instead of surfacing a malformed\n // response. `business_id` silently fell back to `''`.\n if (!raw.created_at) {\n throw new Error(`Order ${raw.id} response is missing a created_at field.`)\n }\n if (!raw.updated_at) {\n throw new Error(`Order ${raw.id} response is missing an updated_at field.`)\n }\n if (!raw.business_id) {\n throw new Error(`Order ${raw.id} response is missing a business_id field.`)\n }\n\n return {\n id: raw.id,\n display_id: raw.display_id || raw.id,\n business_id: raw.business_id,\n customer_id: raw.customer_id ?? undefined,\n items,\n status: raw.status,\n payment_status: raw.payment_status || 'pending',\n product_type: (raw.product_type ?? undefined) as Order['product_type'],\n\n // Canonical backend fields\n total_amount: raw.total_amount,\n currency: raw.currency,\n subtotal_amount: raw.subtotal_amount ?? undefined,\n shipping_amount: raw.shipping_amount ?? undefined,\n discount_amount: raw.discount_amount ?? undefined,\n tax_amount: raw.tax_amount ?? undefined,\n customer_name: customerName,\n customer_email: customerEmail,\n // REAL BUG FIXED (2026-09-23) via the REST codegen initiative: every\n // field below this point used to read a flat `raw.<field>` that does\n // NOT exist anywhere on the real OrderResponse - confirmed by reading\n // the actual Pydantic classes, not just the generated types. They\n // genuinely live nested under `physical_fulfillment` (shipping/\n // tracking/carrier/pickup/surcharge/weight) or `digital_fulfillment`\n // (buyer_country) - \"One nested block per product type, instead of\n // ~35 flat fields on OrderBase\" per that schema file's own Order\n // Schema Refactor comment. Every one of these was silently `undefined`\n // on every real order: a customer's tracking number, carrier, delivery\n // status, and shipping address never actually rendered anywhere on the\n // storefront's order tracking page.\n tracking_number: physical?.tracking_number ?? undefined,\n delivery_status: physical?.delivery_status ?? undefined,\n carrier_name: physical?.carrier_name ?? undefined,\n carrier_slug: physical?.carrier_slug ?? undefined,\n terminal_rate_id: physical?.terminal_rate_id ?? undefined,\n guest_token: raw.guest_token ?? undefined,\n guest_email: raw.guest_email ?? undefined,\n guest_phone: raw.guest_phone ?? undefined,\n guest_name: raw.guest_name ?? undefined,\n buyer_country: raw.digital_fulfillment?.buyer_country ?? undefined,\n created_at: raw.created_at,\n updated_at: raw.updated_at,\n\n // Weight discrepancy & surcharge fields (Task 2) — physical_fulfillment\n shipping_surcharge_amount: physical?.shipping_surcharge_amount ?? undefined,\n shipping_surcharge_reason: physical?.shipping_surcharge_reason ?? undefined,\n shipping_surcharge_description: physical?.shipping_surcharge_description ?? undefined,\n shipping_surcharge_applied_at: physical?.shipping_surcharge_applied_at ?? undefined,\n declared_weight_kg: physical?.declared_weight_kg ?? undefined,\n actual_weight_kg: physical?.actual_weight_kg ?? undefined,\n\n // Self-pickup verification fields (Task 3) — physical_fulfillment\n pickup_verification_code: physical?.pickup_verification_code ?? undefined,\n pickup_verification_code_generated_at: physical?.pickup_verification_code_generated_at ?? undefined,\n pickup_verification_code_used_at: physical?.pickup_verification_code_used_at ?? undefined,\n pickup_verification_failed_attempts: physical?.pickup_verification_failed_attempts,\n pickup_verification_locked_until: physical?.pickup_verification_locked_until ?? undefined,\n pickup_qr_payload: physical?.pickup_qr_payload ?? undefined,\n\n // Bespoke fields — real backend nests these under `bespoke_fulfillment`.\n bespoke_brief: raw.bespoke_fulfillment?.brief ?? undefined,\n bespoke_reference_images: raw.bespoke_fulfillment?.reference_images ?? undefined,\n bespoke_measurements: raw.bespoke_fulfillment?.measurements ?? undefined,\n bespoke_preferred_timeline: raw.bespoke_fulfillment?.preferred_timeline ?? undefined,\n bespoke_special_instructions: raw.bespoke_fulfillment?.special_instructions ?? undefined,\n bespoke_deposit_ratio: raw.bespoke_fulfillment?.deposit_ratio ?? undefined,\n bespoke_deposit_amount: raw.bespoke_fulfillment?.deposit_amount ?? undefined,\n bespoke_balance_amount: raw.bespoke_fulfillment?.balance_amount ?? undefined,\n bespoke_status: raw.bespoke_fulfillment?.status ?? undefined,\n bespoke_deliverable_submitted_at: raw.bespoke_fulfillment?.deliverable_submitted_at ?? undefined,\n bespoke_deliverable_url: raw.bespoke_fulfillment?.deliverable_url ?? undefined,\n bespoke_deliverable_notes: raw.bespoke_fulfillment?.deliverable_notes ?? undefined,\n bespoke_buyer_approved_at: raw.bespoke_fulfillment?.buyer_approved_at ?? undefined,\n bespoke_revision_count: raw.bespoke_fulfillment?.revision_count ?? 0,\n bespoke_revision_notes: raw.bespoke_fulfillment?.revision_notes ?? undefined,\n\n // SDK camelCase convenience aliases\n total: raw.total_amount ?? undefined,\n shippingAmount: raw.shipping_amount ?? undefined,\n discountAmount: raw.discount_amount ?? undefined,\n customerEmail: customerEmail,\n customerName: customerName,\n createdAt: new Date(raw.created_at).getTime(),\n updatedAt: new Date(raw.updated_at).getTime(),\n // REAL BUG FIXED (2026-09-23), found alongside the nesting bug above:\n // `deliveryMethod` reads physical_fulfillment.shipping_method now\n // (was reading a flat `delivery_method` field that never existed at\n // all, anywhere - not even nested). The real value is \"carrier\" or\n // \"self_pickup\" (PhysicalFulfillmentCreate.shipping_method's own\n // docstring) - see the matching fix in kasuvia-storefront's\n // OrderDeliveryInfo.tsx, which used to compare against the wrong\n // string \"pickup\".\n deliveryMethod: physical?.shipping_method ?? undefined,\n trackingNumber: physical?.tracking_number ?? undefined,\n deliveryAddress: 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 // REAL GAP (2026-09-23), NOT fixed here: confirmed cancellation_reason\n // does not exist anywhere in OrderResponse or any of its fulfillment\n // sub-schemas (kasuvia-store-management's app/schemas/order.py) - the\n // cancel-order endpoint accepts a `reason` in its request body but the\n // backend never persists/returns it back on the order. Permanently\n // undefined until the backend adds real storage for it; kept as a\n // field on the public Order type rather than silently removed, since\n // deleting a public SDK field is a breaking change this fix's scope\n // doesn't cover.\n cancellationReason: undefined,\n hasBespoke: raw.product_type === 'bespoke',\n // REAL GAP (2026-09-23), NOT fixed here: same as cancellationReason -\n // confirmed no `bespoke_stage` field exists anywhere; the real,\n // equivalent concept is bespoke_fulfillment.status (already exposed\n // above as `bespoke_status`). Reads that here rather than staying\n // permanently undefined, since it's genuinely the same real data the\n // consuming components (BespokeProgress) want to key off of.\n bespokeStage: raw.bespoke_fulfillment?.status ?? undefined,\n bespokeBrief: raw.bespoke_fulfillment?.brief ?? undefined,\n deliveryStatus: physical?.delivery_status ?? undefined,\n carrierName: physical?.carrier_name ?? undefined,\n terminalShipmentId: physical?.terminal_shipment_id ?? undefined,\n guestToken: raw.guest_token ?? undefined,\n guestEmail: raw.guest_email ?? undefined,\n guestPhone: raw.guest_phone ?? undefined,\n guestName: raw.guest_name ?? undefined,\n }\n}\n\n/**\n * REAL BUG FIXED (2026-09-22): `accessToken` was mandatory (`string`, not\n * optional) — the real backend endpoint (`POST /orders/storefront`,\n * create_storefront_order) explicitly supports guest checkout: `if not\n * user_id and not x_guest_session: raise 401`, matching the same\n * X-Guest-Session pattern cart.service.ts already uses. This endpoint\n * redeems the customer's real server-side cart (guest or authenticated) —\n * `payload.items`/`payload.product_type` are ignored by the backend\n * entirely regardless (see CreateOrderParams' own doc comment) — so a\n * guest with items already in their guest cart had no way to check out at\n * all through this SDK, even though the backend was built for exactly\n * that. `guestSessionId` is a separate parameter (not a body field) since\n * the backend reads it as a header, not JSON.\n */\nexport async function createOrder(\n config: SdkConfig,\n accessToken: string | undefined,\n payload: CreateOrderParams,\n guestSessionId?: string\n): Promise<Order> {\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`\n } else if (guestSessionId) {\n headers['X-Guest-Session'] = guestSessionId\n }\n const data = await apiRequest<RawOrder>(`${config.backendUrls.store}/orders/storefront`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to create order',\n })\n return normaliseStorefrontOrder(data)\n}\n\n/** Atomic, cart-less bespoke commission checkout — POST /orders/storefront/bespoke. */\nexport async function createBespokeOrder(config: SdkConfig, accessToken: string | undefined, payload: CreateBespokeOrderParams): Promise<Order> {\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n if (accessToken) headers[\"Authorization\"] = `Bearer ${accessToken}`\n\n const data = await apiRequest<RawOrder>(`${config.backendUrls.store}/orders/storefront/bespoke`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to create bespoke order',\n })\n return normaliseStorefrontOrder(data)\n}\n\n/** Atomic, cart-less PAID service booking checkout — POST /orders/storefront/service. */\nexport async function createServiceBookingOrder(config: SdkConfig, accessToken: string | undefined, payload: CreateServiceBookingOrderParams): Promise<Order> {\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n if (accessToken) headers[\"Authorization\"] = `Bearer ${accessToken}`\n\n const data = await apiRequest<RawOrder>(`${config.backendUrls.store}/orders/storefront/service`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to create service booking order',\n })\n return normaliseStorefrontOrder(data)\n}\n\n/**\n * REAL BUG FIXED (2026-09-22): called `GET /orders/find/?email=...&order_id=\n * ...&guest_token=...` — this route does not exist anywhere on the real\n * backend (confirmed against every route in app/api/v1/endpoints/sales/\n * orders.py). Every real call 404'd — the entire \"track my order by email +\n * order ID\" flow (`/track-order`, the actual page kasuvia-storefront's own\n * checkout confirmation links to) has been broken. The real, working\n * mechanism is `POST /orders/track` with a `GuestTrackRequest` body\n * (`{order_id, email}` — both required, no `guest_token` field exists on\n * this or any other real request shape). Fixed to match.\n */\nexport async function findOrder(config: SdkConfig, params: FindOrderParams): Promise<Order> {\n if (!params.email || !params.order_id) {\n throw new Error('Both email and order_id are required to find an order.')\n }\n const data = await apiRequest<RawOrder>(`${config.backendUrls.store}/orders/track`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify({ order_id: params.order_id, email: params.email }),\n fallbackErrorMessage: 'Failed to find order',\n })\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 data = await apiRequest<RawOrder[] | { items: RawOrder[] }>(`${config.backendUrls.store}/orders/?${queryParams.toString()}`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to get orders',\n })\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 data = await apiRequest<RawOrder>(`${config.backendUrls.store}/orders/${orderId}/cancel/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify({ reason }),\n fallbackErrorMessage: 'Failed to cancel order',\n })\n return normaliseStorefrontOrder(data)\n}\n\n/**\n * REAL BUG FIXED (2026-09-22): called `GET /orders/track/{orderId}?token=\n * ...` — this route does not exist on the real backend at all (confirmed\n * against every route in orders.py). The `token` query param has no\n * corresponding capability anywhere: the real single-order lookup (`GET\n * /{order_id}`) requires a genuine authenticated JWT\n * (`Depends(get_current_user_claims)`) and grants access only to the\n * order's own customer (matching customer_id, or matching guest_email\n * against the JWT's email for a guest-checkout order that later registered)\n * — it has no anonymous/guest-token path at all. There is no real backend\n * capability today for \"look up one order by ID + a standalone token, no\n * login required\" — the only real guest lookup is findOrder (email +\n * order_id via POST /orders/track, a different, plural-sounding but\n * distinct endpoint). Fixed to call the real endpoint with its real,\n * mandatory-JWT contract; the fictional guest-token parameter is removed\n * rather than kept as a parameter that can never do anything.\n */\nexport async function trackOrder(config: SdkConfig, orderId: string, accessToken: string): Promise<Order> {\n const data = await apiRequest<RawOrder>(`${config.backendUrls.store}/orders/${orderId}`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to track order',\n })\n return normaliseStorefrontOrder(data)\n}\n\nexport interface PromoValidationResult {\n valid: boolean;\n discount_amount: number;\n discount_type: 'percentage' | 'fixed';\n message: string;\n}\n\n/**\n * Validate a promo / discount code against kasuvia-store-management.\n *\n * Routes directly to POST /sales/discounts/validate on the store backend\n * using X-Storefront-Key + X-Business-ID for tenant isolation.\n * The backend is the single source of truth for discount validity,\n * amount calculation, and usage tracking.\n */\nexport async function validatePromoCode(\n config: SdkConfig,\n code: string,\n cartTotal: number,\n): Promise<PromoValidationResult> {\n try {\n return await apiRequest<PromoValidationResult>(`${config.backendUrls.store}/sales/discounts/validate`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify({ code, cart_total: cartTotal }),\n fallbackErrorMessage: 'Invalid promo code',\n })\n } catch (err) {\n const message = err instanceof ApiError ? err.message : 'Invalid promo code'\n return { valid: false, discount_amount: 0, discount_type: 'fixed', message }\n }\n}\n\n// ── Digital download delivery ───────────────────────────────────────────────\n// REAL GAP FIXED (2026-09-22): GET /orders/{order_id}/download/{token} (the\n// exact link every \"your download is ready\" email sends) had ZERO kasuvia-sdk\n// coverage - the raw backend URL was embedded directly in the email instead,\n// and for a 2+-file product the route returns a raw JSON listing with no\n// page anywhere to render it (a customer clicking \"Download\" would see raw\n// JSON text in their browser). These are server-only functions (real,\n// un-proxied config.backendUrls.store, like legal.service.ts) meant to be\n// called from a storefront Server Component, never client-side - the real\n// backend route itself needs no business/storefront headers at all (the\n// token IS the capability, by design - see the route's own doc comment),\n// so no config beyond backendUrls.store is required either.\n//\n// Single file: the real route does an HTTP redirect straight to a freshly\n// presigned R2 URL - `redirect: 'manual'` lets a server-side fetch read\n// that Location header directly instead of the runtime silently following\n// it (which would otherwise download the whole file server-side for no\n// reason). 2+ files: the real route returns JSON instead, since a redirect\n// can only ever point at one destination.\n\nexport interface DigitalDownloadRedirect {\n type: 'redirect'\n url: string\n}\n\nexport interface DigitalDownloadFileEntry {\n id: string\n display_name: string\n sort_order: number\n /** Raw backend URL - never render this directly; resolve it via resolveDigitalDownloadFile instead. */\n download_url: string\n}\n\nexport interface DigitalDownloadListing {\n type: 'listing'\n order_id: string\n product_name: string\n download_count: number\n max_downloads: number\n expires_at: string | null\n files: DigitalDownloadFileEntry[]\n}\n\nexport type DigitalDownloadResult = DigitalDownloadRedirect | DigitalDownloadListing\n\nasync function resolveRedirectOrJson<T>(url: string, fallbackErrorMessage: string): Promise<{ type: 'redirect'; url: string } | { type: 'json'; data: T }> {\n const response = await fetch(url, { redirect: 'manual' })\n\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get('location')\n if (!location) {\n throw new Error(`${fallbackErrorMessage}: server redirected with no destination URL.`)\n }\n return { type: 'redirect', url: location }\n }\n\n const body = await response.json().catch(() => ({}))\n if (!response.ok) {\n throw new ApiError(extractDigitalDownloadError(body, fallbackErrorMessage), response.status, body)\n }\n return { type: 'json', data: body as T }\n}\n\nfunction extractDigitalDownloadError(body: unknown, fallback: string): string {\n if (typeof body === 'object' && body !== null && 'detail' in body && typeof (body as { detail?: unknown }).detail === 'string') {\n return (body as { detail: string }).detail\n }\n return fallback\n}\n\n/** GET /orders/{order_id}/download/{token} - server-only, no config beyond backendUrls.store needed. */\nexport async function resolveDigitalDownload(\n config: Pick<SdkConfig, 'backendUrls'>,\n orderId: string,\n token: string\n): Promise<DigitalDownloadResult> {\n const result = await resolveRedirectOrJson<Omit<DigitalDownloadListing, 'type'>>(\n `${config.backendUrls.store}/orders/${orderId}/download/${token}`,\n 'Failed to resolve digital download link'\n )\n if (result.type === 'redirect') return result\n return { type: 'listing', ...result.data }\n}\n\n/** GET /orders/{order_id}/download/{token}/{file_id} - resolves ONE file's real, freshly-presigned URL. */\nexport async function resolveDigitalDownloadFile(\n config: Pick<SdkConfig, 'backendUrls'>,\n orderId: string,\n token: string,\n fileId: string\n): Promise<string> {\n const result = await resolveRedirectOrJson<never>(\n `${config.backendUrls.store}/orders/${orderId}/download/${token}/${fileId}`,\n 'Failed to resolve this file\\'s download link'\n )\n if (result.type !== 'redirect') {\n throw new Error('Failed to resolve this file\\'s download link: server did not return a redirect.')\n }\n return result.url\n}\n\n\n","/**\n * Consultation Hooks\n *\n * Create-only, by design — see consultation.service.ts's header comment.\n */\nimport { useMutation } from '@tanstack/react-query'\nimport { createConsultation, type CreateConsultationParams } from '../services/consultation.service'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport function useCreateConsultation(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useMutation({\n mutationFn: (params: CreateConsultationParams) =>\n token ? createConsultation(cfg, token, params) : Promise.reject(new Error('Please sign in to submit a request.')),\n })\n}\n","/**\n * Consultation Service\n *\n * REAL BUG FIXED (2026-09-21): a \"consultation\" service existed earlier this\n * session pointed at a fictional `/social/consultations/...` route that\n * matched nothing in any backend — deleted along with its dead storefront\n * pages. That deletion was correct (the URL was wrong), but a later audit\n * of kasuvia-crm-go found the underlying feature is real:\n * `POST /api/v1/consultations/` (customer-JWT-gated, real bespoke-slot-\n * reservation side effect when product_id references a bespoke product).\n * There is deliberately no list/get function here — kasuvia-crm-go's own\n * code comment confirms \"there is no customer-facing GET/list consultation\n * endpoint at all\" (admin_consultations.go). Create-only, by design.\n */\nimport type { SdkConfig } from '../config'\nimport { apiRequest, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\nexport interface CreateConsultationParams {\n product_id?: string\n structured_details?: Record<string, unknown>\n}\n\nexport interface Consultation {\n id: string\n business_id: string\n customer_id: string | null\n product_id: string | null\n status: string\n quote_amount: number | null\n structured_details: Record<string, unknown>\n capacity_config_id: string | null\n slot_booking_id: string | null\n created_at: string\n updated_at: string\n}\n\nexport async function createConsultation(\n config: SdkConfig,\n accessToken: string,\n params: CreateConsultationParams\n): Promise<Consultation> {\n return apiRequest<Consultation>(`${config.backendUrls.crm}/consultations/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(params),\n fallbackErrorMessage: 'Failed to submit your request',\n })\n}\n","/**\n * Feedback Hooks\n */\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { createFeedback, getMyFeedback, type CreateFeedbackParams } from '../services/feedback.service'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport function useCreateFeedback(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (params: CreateFeedbackParams) =>\n token ? createFeedback(cfg, token, params) : Promise.reject(new Error('Please sign in to submit a message.')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['my-feedback'] })\n },\n })\n}\n\nexport function useMyFeedback(\n params?: { page?: number; page_size?: number },\n config?: SdkConfig,\n accessToken?: string | null\n) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: ['my-feedback', token, params],\n queryFn: () => token ? getMyFeedback(cfg, token, params) : Promise.reject(new Error('No access token available')),\n enabled: !!token,\n })\n}\n","/**\n * Feedback Service\n *\n * REAL FEATURE WIRED (2026-09-21): kasuvia-crm-go's feedback.go (`POST\n * /api/v1/feedback/`, `GET /api/v1/feedback/my`) is a complete, real,\n * customer-JWT-gated support-ticket system — private business<->customer\n * correspondence, distinct from a public, purchase-verified product Review —\n * with zero SDK coverage anywhere before this file.\n */\nimport type { SdkConfig } from '../config'\nimport { apiRequest, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\n/** Mirrors kasuvia-crm-go's models.ValidFeedbackCategories exactly. */\nexport type FeedbackCategory = 'general' | 'complaint' | 'suggestion'\n\n/** Mirrors kasuvia-crm-go's models.ValidFeedbackStatuses exactly. */\nexport type FeedbackStatus = 'open' | 'in_progress' | 'resolved'\n\nexport interface CreateFeedbackParams {\n subject: string\n body: string\n /** Defaults to 'general' server-side if omitted. */\n category?: FeedbackCategory\n order_id?: string\n}\n\nexport interface Feedback {\n id: string\n business_id: string\n customer_id: string\n order_id: string | null\n category: FeedbackCategory\n subject: string\n body: string\n status: FeedbackStatus\n merchant_reply: string | null\n merchant_reply_at: string | null\n replied_by: string | null\n created_at: string\n updated_at: string\n}\n\nexport interface FeedbackListResponse {\n results: Feedback[]\n count: number\n page: number\n page_size: number\n total_pages: number\n}\n\nexport async function createFeedback(\n config: SdkConfig,\n accessToken: string,\n params: CreateFeedbackParams\n): Promise<Feedback> {\n return apiRequest<Feedback>(`${config.backendUrls.crm}/feedback/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(params),\n fallbackErrorMessage: 'Failed to submit your message',\n })\n}\n\nexport async function getMyFeedback(\n config: SdkConfig,\n accessToken: string,\n params?: { page?: number; page_size?: number }\n): Promise<FeedbackListResponse> {\n const query = new URLSearchParams()\n if (params?.page) query.set('page', String(params.page))\n if (params?.page_size) query.set('page_size', String(params.page_size))\n return apiRequest<FeedbackListResponse>(`${config.backendUrls.crm}/feedback/my?${query.toString()}`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to load your requests',\n })\n}\n","/**\n * Customer Saved-Address Book Hooks\n */\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n getCustomerAddresses,\n createCustomerAddress,\n updateCustomerAddress,\n deleteCustomerAddress,\n} from '../services/auth.service'\nimport type { CreateCustomerAddressPayload, UpdateCustomerAddressPayload } from '../types/auth'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nconst ADDRESSES_QUERY_KEY = 'customer-addresses'\n\nexport function useCustomerAddresses(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: [ADDRESSES_QUERY_KEY, token],\n queryFn: () => token ? getCustomerAddresses(cfg, token) : Promise.reject(new Error('No access token available')),\n enabled: !!token,\n })\n}\n\nexport function useCreateCustomerAddress(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CreateCustomerAddressPayload) =>\n token ? createCustomerAddress(cfg, token, payload) : Promise.reject(new Error('Please sign in to save an address.')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [ADDRESSES_QUERY_KEY] })\n },\n })\n}\n\nexport function useUpdateCustomerAddress(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ addressId, payload }: { addressId: string; payload: UpdateCustomerAddressPayload }) =>\n token ? updateCustomerAddress(cfg, token, addressId, payload) : Promise.reject(new Error('Please sign in to update this address.')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [ADDRESSES_QUERY_KEY] })\n },\n })\n}\n\nexport function useDeleteCustomerAddress(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (addressId: string) =>\n token ? deleteCustomerAddress(cfg, token, addressId) : Promise.reject(new Error('Please sign in to remove this address.')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [ADDRESSES_QUERY_KEY] })\n },\n })\n}\n","import type { CustomerUser } from \"../types\";\n\nexport function buildFullName(firstname?: string, lastname?: string): string | undefined {\n const name = [firstname, lastname].filter(Boolean).join(' ').trim()\n return name || undefined\n}\n\nexport function splitFullName(fullName?: string): { firstname: string; lastname: string } {\n if (!fullName?.trim()) return { firstname: '', lastname: '' }\n const parts = fullName.trim().split(/\\s+/)\n return {\n firstname: parts[0] ?? '',\n lastname: parts.slice(1).join(' '),\n }\n}\n\nexport function getCustomerDisplayName(user: CustomerUser): string {\n const fromParts = buildFullName(user.firstname, user.lastname)\n return fromParts || user.full_name || user.email.split('@')[0]\n}\n\n/**\n * Constructs live storefront URL for a business.\n * If custom domain is not yet connected/verified, defaults to `https://<business_id>.kasuvia.com`.\n */\nexport function getStorefrontUrl(businessId: string, customDomain?: string | null): string {\n if (customDomain && customDomain.trim()) {\n const cleanDomain = customDomain.trim().replace(/^https?:\\/\\//, '');\n return `https://${cleanDomain}`;\n }\n const cleanBid = (businessId || 'store').toLowerCase().trim();\n return `https://${cleanBid}.kasuvia.com`;\n}\n\n","/**\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 { STORAGE_KEYS } from '../constants'\nimport { apiRequest, ApiError, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\nimport { buildFullName, splitFullName } from '../utils/customer'\nimport type {\n CustomerAuthResponse,\n CustomerLoginPayload,\n CustomerRegisterPayload,\n CustomerPasswordlessRequestPayload,\n CustomerPasswordlessVerifyPayload,\n CustomerForgotPasswordPayload,\n CustomerResetPasswordPayload,\n CustomerDeactivatePayload,\n DeactivateAccountResult,\n DeactivateConfirmationRequired,\n CustomerReactivatePayload,\n CustomerReactivateVerifyPayload,\n LogoutPayload,\n RefreshTokenResponse,\n CustomerUser,\n AuthUserResponse,\n UpdateProfilePayload,\n StorefrontBusinessInfo,\n ChangePasswordPayload,\n CustomerAddress,\n CreateCustomerAddressPayload,\n UpdateCustomerAddressPayload,\n} from '../types/auth'\n\nimport type { MediaAsset } from '../types/media'\n\n// ── Auth API Calls ────────────────────────────────────────────────────────────\n\n/**\n * POST /auth/login/customer/\n * Business is identified by the X-Storefront-Key + X-Business-ID headers\n * (config.storefrontApiKey / config.businessId) — never a body field (see\n * plan: Customer Storefront Identity Enforcement).\n */\nexport async function loginCustomer(\n config: SdkConfig,\n payload: CustomerLoginPayload,\n guestSessionId?: string | null\n): Promise<CustomerAuthResponse> {\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n // REAL FEATURE FOUND (2026-09-21): kasuvia-auth's login/register/OTP-verify\n // views already run a real server-side guest-cart merge the moment tokens\n // are minted (customer.py's _run_post_login_merge, reading this exact\n // header) — deliberately built to replace depending on a frontend\n // remembering to call kasuvia-cart-management's /cart/merge afterward (see\n // cart_merge_client.py's own doc comment). This was simply never wired:\n // nothing in the storefront ever sent this header on login.\n if (guestSessionId) {\n headers['X-Guest-Session'] = guestSessionId\n }\n return apiRequest<CustomerAuthResponse>(`${config.backendUrls.auth}/auth/login/customer/`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Login failed',\n })\n}\n\n/**\n * POST /auth/register/customer/\n * Business identified via headers, see loginCustomer.\n */\nexport async function registerCustomer(\n config: SdkConfig,\n payload: CustomerRegisterPayload,\n guestSessionId?: string | null\n): Promise<CustomerAuthResponse> {\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n // See loginCustomer's identical comment — same real, already-built\n // server-side merge, same header.\n if (guestSessionId) {\n headers['X-Guest-Session'] = guestSessionId\n }\n return apiRequest<CustomerAuthResponse>(`${config.backendUrls.auth}/auth/register/customer/`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Registration failed',\n })\n}\n\n/** POST /auth/token/refresh/\n */\nexport async function refreshToken(\n config: SdkConfig,\n refresh: string\n): Promise<RefreshTokenResponse> {\n return apiRequest<RefreshTokenResponse>(`${config.backendUrls.auth}/auth/token/refresh/`, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({ refresh }),\n fallbackErrorMessage: 'Token refresh failed',\n })\n}\n\n/**\n * POST /auth/logout/ — revokes the server-side session.\n *\n * Never throws: a customer's own logout must always clear their local\n * session client-side (caller does this regardless of this promise's\n * outcome) even if the backend is unreachable — an unrevoked server-side\n * session in that case is a availability tradeoff, not a security one (the\n * refresh token still expires on its own TTL). What CLAUDE.md forbids is\n * failing SILENTLY; the failure is now always logged with real context so\n * it's visible to whoever is debugging a report of \"sessions not clearing\n * server-side\", instead of vanishing into a bare `catch {}`.\n */\nexport async function logout(\n config: SdkConfig,\n refresh?: string\n): Promise<void> {\n const payload: LogoutPayload = refresh ? { refresh } : {}\n try {\n await apiRequest(`${config.backendUrls.auth}/auth/logout/`, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Server-side logout failed',\n })\n } catch (err) {\n if (err instanceof ApiError) {\n console.error(`[auth.service] Server-side logout failed with status ${err.status}; local session will still be cleared.`)\n } else {\n console.error('[auth.service] Server-side logout request failed; local session will still be cleared.', err)\n }\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 return apiRequest<CustomerAuthResponse>(`${config.backendUrls.auth}/auth/social/verify/${provider}/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify({ id_token: token }),\n fallbackErrorMessage: 'Social token verification failed',\n })\n}\n\n/**\n * POST /auth/login/customer/passwordless/request/\n * Sends a one-time login code to the customer's email. Always resolves\n * successfully (the backend never reveals whether the email is registered).\n * Business identified via headers, see loginCustomer.\n */\nexport async function requestCustomerOtp(\n config: SdkConfig,\n payload: CustomerPasswordlessRequestPayload\n): Promise<void> {\n await apiRequest(`${config.backendUrls.auth}/auth/login/customer/passwordless/request/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to send login code',\n })\n}\n\n/**\n * POST /auth/login/customer/passwordless/verify/\n * Verifies a one-time login code and returns tokens, auto-creating the\n * customer account on first use (same as social login).\n * Business identified via headers, see loginCustomer.\n */\nexport async function verifyCustomerOtp(\n config: SdkConfig,\n payload: CustomerPasswordlessVerifyPayload,\n guestSessionId?: string | null\n): Promise<CustomerAuthResponse> {\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n // See loginCustomer's identical comment — same real, already-built\n // server-side merge, same header.\n if (guestSessionId) {\n headers['X-Guest-Session'] = guestSessionId\n }\n return apiRequest<CustomerAuthResponse>(`${config.backendUrls.auth}/auth/login/customer/passwordless/verify/`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Invalid or expired code',\n })\n}\n\n/**\n * POST /auth/forgot-password/customer/\n * Request a customer password reset OTP (business-scoped via headers).\n */\nexport async function forgotPasswordCustomer(\n config: SdkConfig,\n payload: CustomerForgotPasswordPayload\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.auth}/auth/forgot-password/customer/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to request password reset',\n })\n}\n\n/**\n * POST /auth/reset-password/customer/\n * Verify OTP and reset customer password (business-scoped via headers).\n */\nexport async function resetPasswordCustomer(\n config: SdkConfig,\n payload: CustomerResetPasswordPayload\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.auth}/auth/reset-password/customer/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Invalid or expired reset code',\n })\n}\n\n/**\n * POST /auth/customer/deactivate/\n * Self-service account deactivation for customers.\n */\nexport async function deactivateCustomerAccount(\n config: SdkConfig,\n accessToken: string,\n payload?: CustomerDeactivatePayload\n): Promise<DeactivateAccountResult> {\n try {\n const data = await apiRequest<{ detail: string }>(`${config.backendUrls.auth}/auth/customer/deactivate/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload || {}),\n fallbackErrorMessage: 'Failed to deactivate account',\n })\n return { status: 'success', detail: data.detail }\n } catch (err) {\n // REAL BUG FIXED (2026-09-20): a 409 here is NOT a failure — it's step 1\n // of require_destructive_confirmation's real two-step contract (see\n // DeactivateConfirmationRequired's doc comment). The FIRST call with no\n // confirmation_code ALWAYS 409s by design, so this function as written\n // before could never actually succeed — it threw a generic Error on every\n // real call, discarding the impact list and confirmation_code the caller\n // needs to complete the flow.\n if (err instanceof ApiError && err.status === 409) {\n return { status: 'confirmation_required', data: err.body as DeactivateConfirmationRequired }\n }\n throw err\n }\n}\n\n/**\n * POST /auth/customer/reactivate/\n * Request reactivation code for a deactivated customer account.\n */\nexport async function requestCustomerReactivation(\n config: SdkConfig,\n payload: CustomerReactivatePayload\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.auth}/auth/customer/reactivate/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to request reactivation',\n })\n}\n\n/**\n * POST /auth/customer/reactivate/verify/\n * Verify reactivation OTP and restore customer account.\n */\nexport async function verifyCustomerReactivation(\n config: SdkConfig,\n payload: CustomerReactivateVerifyPayload\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.auth}/auth/customer/reactivate/verify/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Invalid or expired reactivation code',\n })\n}\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 // `/api/auth/me` proxies the raw AuthUserResponse shape (nested\n // `.profile.firstname` etc) under `data.user` — it must be mapped the\n // same way the config+accessToken branch below maps it, otherwise every\n // field on the returned \"CustomerUser\" is silently undefined.\n const data = await apiRequest<{ user: AuthUserResponse }>('/api/auth/me', {\n credentials: 'include',\n fallbackErrorMessage: 'Failed to fetch profile',\n })\n return mapAuthUserToCustomer(data.user)\n }\n\n const data = await apiRequest<AuthUserResponse>(`${config.backendUrls.auth}/auth/profile/`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to fetch profile',\n })\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 data = await apiRequest<{ user: AuthUserResponse }>('/api/auth/me', {\n credentials: 'include',\n fallbackErrorMessage: 'Failed to fetch auth user',\n })\n return data.user\n }\n\n return apiRequest<AuthUserResponse>(`${config.backendUrls.auth}/auth/profile/`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to fetch auth user',\n })\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 return apiRequest<CustomerUser>('/api/auth/profile', {\n method: 'PUT',\n headers: JSON_HEADERS,\n credentials: 'include',\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to update profile',\n })\n }\n\n const config = configOrPayload as SdkConfig\n const accessToken = accessTokenOrPayload as string\n const payload = payloadParam as UpdateProfilePayload\n\n // REAL BUG FIXED (2026-09-20): hardcoded generic message discarded real\n // CustomerProfileUpdateSerializer validation errors (e.g. invalid phone\n // format) — apiRequest's shared extractor handles this DRF dict shape.\n const data = await apiRequest<AuthUserResponse>(`${config.backendUrls.auth}/auth/profile/`, {\n method: 'PUT',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to update profile',\n })\n return mapAuthUserToCustomer(data)\n}\n\n/**\n * POST /auth/change-password/ — identity-mode-agnostic; the backend\n * branches on the JWT's identity_mode (kasuvia-auth/authentication/api/v1/\n * views/core.py:353, ChangePasswordView) to mutate the right underlying\n * profile (customer/staff/owner). Used here for a logged-in storefront\n * customer. `old_password` may be omitted only if the account genuinely has\n * no password yet (a social/passwordless-only customer setting one for the\n * first time) — the backend itself enforces this, not the frontend.\n */\nexport async function changePassword(\n config: SdkConfig,\n accessToken: string,\n payload: ChangePasswordPayload\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.auth}/auth/change-password/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to change password',\n })\n}\n\n/**\n * GET /auth/storefront/business-info/\n * Public, unauthenticated — only needs the storefront key (no access token,\n * no X-Business-ID; PublicBusinessInfoView resolves the business from the\n * key itself). Real gap fixed 2026-09-17: this endpoint existed on the\n * backend with zero SDK coverage.\n */\nexport async function getStorefrontBusinessInfo(config: SdkConfig): Promise<StorefrontBusinessInfo> {\n // PublicBusinessInfoView resolves the business from X-Storefront-Key alone\n // and never reads X-Business-ID — storefrontHeaders() sends both anyway\n // for consistency with every other call site; the extra header is inert\n // here (verified against the real view before making this change).\n return apiRequest<StorefrontBusinessInfo>(`${config.backendUrls.auth}/auth/storefront/business-info/`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to fetch business info',\n })\n}\n\nexport interface PresignedUploadUrlParams {\n filename: string\n content_type: string\n business_id: string\n context: string\n entity_id: string\n owner_id?: string\n affiliation?: string\n}\n\nexport interface PresignedUploadUrlResponse {\n presigned_url: string\n storage_path: string\n bucket: string\n expires_in: number\n asset_id?: string\n}\n\n/**\n * POST /auth/media/presigned-url/ — kasuvia-auth's thin proxy in front of\n * kasuvia-media-system. Params are sent as a query string (not a JSON\n * body) to match every other caller of this endpoint.\n */\nexport async function getPresignedUploadUrl(\n config: SdkConfig,\n accessToken: string,\n params: PresignedUploadUrlParams\n): Promise<PresignedUploadUrlResponse> {\n const query = new URLSearchParams(\n Object.entries(params).filter(([, v]) => v !== undefined) as [string, string][]\n )\n // Bearer-only, deliberately not storefrontHeaders() — this endpoint's real\n // header contract was never verified to also accept/require X-Storefront-\n // Key/X-Business-ID, unlike getStorefrontBusinessInfo above.\n return apiRequest<PresignedUploadUrlResponse>(\n `${config.backendUrls.auth}/auth/media/presigned-url/?${query.toString()}`,\n {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}` },\n fallbackErrorMessage: 'Failed to get presigned upload URL',\n }\n )\n}\n\nexport interface ConfirmMediaUploadParams {\n storage_path: string\n business_id: string\n entity_id: string\n original_filename: string\n content_type: string\n size: number\n context: string\n owner_id?: string\n affiliation?: string\n}\n\n/**\n * POST /auth/media/confirm-upload/ — confirms a completed direct-to-R2\n * upload and returns the resulting MediaAsset. Params are sent as a query\n * string (not a JSON body) to match every other caller of this endpoint.\n */\nexport async function confirmMediaUpload(\n config: SdkConfig,\n accessToken: string,\n params: ConfirmMediaUploadParams\n): Promise<MediaAsset> {\n const query = new URLSearchParams(\n Object.entries(params).filter(([, v]) => v !== undefined) as [string, string][]\n )\n return apiRequest<MediaAsset>(\n `${config.backendUrls.auth}/auth/media/confirm-upload/?${query.toString()}`,\n {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}` },\n fallbackErrorMessage: 'Failed to confirm upload',\n }\n )\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 (err) {\n // REAL BUG FIXED (2026-09-20): bare `catch {}` silently discarded the\n // real reason (network failure vs. an actually-revoked/expired refresh\n // token) — `null` here correctly means \"not currently logged in\" to the\n // caller (a legitimate outcome, not swallowed), but CLAUDE.md still\n // requires the failure itself be logged, not silently dropped.\n console.error('[auth.service] Silent token refresh failed:', err)\n return null\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// ── Customer saved-address book ─────────────────────────────────────────────\n// REAL FEATURE WIRED (2026-09-22): CustomerProfile.address_book existed as a\n// backend JSONField with no real write path anywhere (see\n// CustomerAddressListView's own doc comment in kasuvia-auth). This is the\n// SDK-side coverage for the real, now-validated endpoints.\n\n/** GET /auth/profile/addresses/ */\nexport async function getCustomerAddresses(config: SdkConfig, accessToken: string): Promise<CustomerAddress[]> {\n const data = await apiRequest<{ results: CustomerAddress[] }>(`${config.backendUrls.auth}/auth/profile/addresses/`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to fetch saved addresses',\n })\n return data.results\n}\n\n/** POST /auth/profile/addresses/ */\nexport async function createCustomerAddress(\n config: SdkConfig,\n accessToken: string,\n payload: CreateCustomerAddressPayload\n): Promise<CustomerAddress> {\n return apiRequest<CustomerAddress>(`${config.backendUrls.auth}/auth/profile/addresses/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to save address',\n })\n}\n\n/** PATCH /auth/profile/addresses/{id}/ */\nexport async function updateCustomerAddress(\n config: SdkConfig,\n accessToken: string,\n addressId: string,\n payload: UpdateCustomerAddressPayload\n): Promise<CustomerAddress> {\n return apiRequest<CustomerAddress>(`${config.backendUrls.auth}/auth/profile/addresses/${addressId}/`, {\n method: 'PATCH',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to update address',\n })\n}\n\n/** DELETE /auth/profile/addresses/{id}/ */\nexport async function deleteCustomerAddress(config: SdkConfig, accessToken: string, addressId: string): Promise<void> {\n await apiRequest(`${config.backendUrls.auth}/auth/profile/addresses/${addressId}/`, {\n method: 'DELETE',\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to delete address',\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 {\n getAuthUser,\n loginCustomer,\n registerCustomer,\n requestCustomerOtp,\n verifyCustomerOtp,\n updateProfile,\n logout as logoutService,\n forgotPasswordCustomer,\n resetPasswordCustomer,\n deactivateCustomerAccount,\n requestCustomerReactivation,\n verifyCustomerReactivation,\n getStorefrontBusinessInfo,\n changePassword,\n} from '../services/auth.service'\nimport type {\n CustomerLoginPayload,\n CustomerRegisterPayload,\n CustomerPasswordlessRequestPayload,\n CustomerPasswordlessVerifyPayload,\n CustomerForgotPasswordPayload,\n CustomerResetPasswordPayload,\n CustomerDeactivatePayload,\n CustomerReactivatePayload,\n CustomerReactivateVerifyPayload,\n UpdateProfilePayload,\n ChangePasswordPayload,\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 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}\n\n/**\n * Real gap fixed 2026-09-17: GET /auth/storefront/business-info/ had no SDK\n * hook — public/unauthenticated (only needs the storefront key), so unlike\n * useAuthUser this is always enabled, never gated on an access token.\n */\nexport function useStorefrontBusinessInfo(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['storefront-business-info', cfg.businessId],\n queryFn: () => getStorefrontBusinessInfo(cfg),\n staleTime: 5 * 60 * 1000, // business branding info changes rarely\n })\n}\n\nexport function useLogin(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CustomerLoginPayload) => loginCustomer(cfg, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n}\n\nexport function useRegister(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CustomerRegisterPayload) => registerCustomer(cfg, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n}\n\nexport function useRequestOtp(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (payload: CustomerPasswordlessRequestPayload) => requestCustomerOtp(cfg, payload),\n })\n}\n\nexport function useVerifyOtp(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: CustomerPasswordlessVerifyPayload) => verifyCustomerOtp(cfg, payload),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n queryClient.invalidateQueries({ queryKey: ['cart'] })\n },\n })\n}\n\nexport function useCustomerForgotPassword(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (payload: CustomerForgotPasswordPayload) => forgotPasswordCustomer(cfg, payload),\n })\n}\n\nexport function useCustomerResetPassword(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (payload: CustomerResetPasswordPayload) => resetPasswordCustomer(cfg, payload),\n })\n}\n\nexport function useCustomerDeactivateAccount(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload?: CustomerDeactivatePayload) =>\n token ? deactivateCustomerAccount(cfg, token, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.clear()\n },\n })\n}\n\nexport function useCustomerReactivateRequest(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (payload: CustomerReactivatePayload) => requestCustomerReactivation(cfg, payload),\n })\n}\n\nexport function useCustomerReactivateVerify(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (payload: CustomerReactivateVerifyPayload) => verifyCustomerReactivation(cfg, payload),\n })\n}\n\nexport function useUpdateProfile(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\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(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['auth-user'] })\n },\n })\n}\n\n/**\n * POST /auth/change-password/ — REAL GAP FIXED (2026-09-20): this endpoint\n * is fully customer-reachable on the real backend (ChangePasswordView\n * branches on identity_mode) but had zero SDK coverage at all until now —\n * no storefront customer had any way to change their password once logged\n * in (only the logged-out forgot/reset-password OTP flow existed).\n */\nexport function useChangePassword(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useMutation({\n mutationFn: (payload: ChangePasswordPayload) =>\n token ? changePassword(cfg, token, payload) : Promise.reject(new Error('No access token available')),\n })\n}\n\nexport function useLogout(config?: SdkConfig, refreshToken?: string) {\n const ctx = useSdkContext()\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}\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 { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport { apiRequest, storefrontHeaders } from '../utils/http-client'\n\n/**\n * REAL BUG FIXED (2026-09-22): raw fetch() with a generic `HTTP ${status}`\n * error — this file predates apiRequest and was missed when every other\n * REST call site in the SDK was migrated onto it (it lives in a hook file,\n * not services/*.ts, which is how the original migration pass missed it).\n */\nexport async function getCountries(config: SdkConfig): Promise<Country[]> {\n return apiRequest<Country[]>(`${config.backendUrls.auth}/auth/countries/`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to fetch countries',\n })\n}\n\nexport function useCountries(config?: SdkConfig) {\n const ctx = useSdkContext()\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}\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 { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport { apiRequest, storefrontHeaders } from '../utils/http-client'\n\n/** Raw fetch() -> apiRequest, same fix as use-countries.ts. */\nexport async function getStates(config: SdkConfig, countryIso: string): Promise<State[]> {\n if (!countryIso) throw new Error('Country ISO is required to fetch states')\n return apiRequest<State[]>(`${config.backendUrls.auth}/auth/countries/${encodeURIComponent(countryIso)}/states/`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to fetch states',\n })\n}\n\nexport function useStates(countryIso: string, config?: SdkConfig) {\n const ctx = useSdkContext()\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}\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 || [])\n .filter((language: BackendLanguage) => language.code !== 'auto')\n .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 // REAL BUG FIXED (2026-09-22): wrapping resolveHookArgs (and the useQuery\n // call itself) in try/catch swallowed the ONE thing that can actually\n // throw here — a missing SdkConfig/SdkProvider, resolveHookArgs' own\n // deliberate, explicit failure — into a fabricated `{ data: [], isSuccess:\n // true, status: 'success' }`. A caller would read that as \"this business\n // genuinely has zero supported languages,\" not \"the SDK isn't wired up,\"\n // hiding a real integration bug behind a fake successful empty state.\n // Also called useQuery conditionally inside a try block, which the Rules\n // of Hooks forbid. No other hook in this SDK catches resolveHookArgs;\n // this one shouldn't either.\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['supported-languages', cfg.businessId],\n queryFn: () => getSupportedLanguagesList(cfg),\n retry: 1,\n ...getCacheTier('high'),\n });\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 * 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'\nimport { apiRequest, storefrontHeaders } from '../utils/http-client'\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 return apiRequest<SupportedLanguagesResponse>(`${config.backendUrls.payment}/config/supported-languages`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to get supported languages',\n })\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 return apiRequest<SupportedCurrenciesResponse>(`${config.backendUrls.payment}/config/supported-currencies`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to get supported currencies',\n })\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 return apiRequest<BusinessConfig>(`${config.backendUrls.auth}/internal/businesses/${config.businessId}/`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to get business config',\n })\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 { 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 || []).filter((currency: Currency) => currency.code !== 'auto')\n}\n\nexport function useCurrencies(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['supported-currencies', cfg.businessId],\n queryFn: () => getSupportedCurrenciesList(cfg),\n retry: 1,\n ...getCacheTier('high'),\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, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { checkAvailability, approveBespokeDeliverable, requestBespokeRevision } from '../services/bespoke.service'\nimport type { SdkConfig } from '../config'\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 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}\n\n/** Buyer approves a bespoke order's submitted deliverable. */\nexport function useApproveBespokeDeliverable(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (orderId: string) =>\n token ? approveBespokeDeliverable(cfg, token, orderId) : Promise.reject(new Error('No access token available')),\n onSuccess: (_data, orderId) => {\n queryClient.invalidateQueries({ queryKey: ['order', orderId] })\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n\n/** Buyer requests a revision on a bespoke order's submitted deliverable. */\nexport function useRequestBespokeRevision(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ orderId, notes }: { orderId: string; notes: string }) =>\n token ? requestBespokeRevision(cfg, token, orderId, notes) : Promise.reject(new Error('No access token available')),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: ['order', variables.orderId] })\n queryClient.invalidateQueries({ queryKey: ['orders'] })\n },\n })\n}\n","/**\n * Bespoke Service\n *\n * Handles bespoke product availability checks and the buyer side of the\n * bespoke order deliverable proofing flow.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { BespokeAvailability, BespokeDeliverableStatus } from '../types/consultations'\nimport type { components } from '../generated/store-openapi'\nimport { apiRequest, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\n// ─── Codegen drift-proofs (openapi/README.md — regenerate via `pnpm run codegen:rest`) ─\n// Same approach as service-booking.service.ts's own comment: these prove\n// the hand-written types still match the real backend schema at compile\n// time, without a risky full rewrite of working code. Found and fixed one\n// real gap this way: BespokeDeliverableStatus was missing\n// bespoke_revision_notes entirely, a field the real backend has always\n// returned.\ntype _BespokeAvailabilityMatchesSchema = BespokeAvailability extends components['schemas']['BespokeAvailabilityResponse'] ? true : never\ntype _BespokeDeliverableStatusMatchesSchema = BespokeDeliverableStatus extends components['schemas']['BespokeStatusResponse'] ? true : never\nconst _bespokeAvailabilityCheck: _BespokeAvailabilityMatchesSchema = true\nconst _bespokeDeliverableStatusCheck: _BespokeDeliverableStatusMatchesSchema = true\nvoid _bespokeAvailabilityCheck\nvoid _bespokeDeliverableStatusCheck\n\n/**\n * REAL BUG FIXED (2026-09-20): was calling `/bespoke/availability/{id}` —\n * missing the `/capacity` segment. Confirmed against the real router\n * (kasuvia-store-management/app/api/v1/endpoints/bespoke/capacity.py:184,\n * registered under the `/bespoke/capacity` prefix): the real route is\n * `/bespoke/capacity/availability/{id}`. Every bespoke availability check\n * was 404ing.\n */\nexport async function checkAvailability(config: SdkConfig, product_id: string): Promise<BespokeAvailability> {\n return apiRequest<BespokeAvailability>(`${config.backendUrls.store}/bespoke/capacity/availability/${product_id}`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to check bespoke availability',\n })\n}\n\n/**\n * POST /orders/{order_id}/bespoke/approve — buyer approves the seller's\n * submitted deliverable, starting the escrow release clock.\n */\nexport async function approveBespokeDeliverable(\n config: SdkConfig,\n accessToken: string,\n orderId: string\n): Promise<BespokeDeliverableStatus> {\n return apiRequest<BespokeDeliverableStatus>(`${config.backendUrls.store}/orders/${orderId}/bespoke/approve`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify({}),\n fallbackErrorMessage: 'Failed to approve deliverable',\n })\n}\n\n/**\n * POST /orders/{order_id}/bespoke/request-revision — buyer asks the seller\n * to revise the submitted deliverable. Capped at 2 revisions server-side;\n * beyond that, the backend escalates to manual review rather than refusing\n * silently (see the real endpoint's own doc comment).\n */\nexport async function requestBespokeRevision(\n config: SdkConfig,\n accessToken: string,\n orderId: string,\n notes: string\n): Promise<BespokeDeliverableStatus> {\n return apiRequest<BespokeDeliverableStatus>(`${config.backendUrls.store}/orders/${orderId}/bespoke/request-revision`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify({ notes }),\n fallbackErrorMessage: 'Failed to request revision',\n })\n}\n\n// Service object export for backward compatibility\nexport const bespokeService = {\n checkAvailability,\n approveBespokeDeliverable,\n requestBespokeRevision,\n}\n","/**\n * Collections Hooks\n *\n * React Query hooks for fetching collections via the real GraphQL storefront API.\n *\n * REAL BUG FIXED (2026-09-22), live-confirmed: both hooks here fetched from\n * `/api/collections` / `/api/collections/{slug}` — Next.js API routes that\n * do not exist anywhere in kasuvia-storefront (`app/api/collections`\n * confirmed absent). This is the exact same class of bug already found and\n * fixed in use-products.ts (\"every hook here used to fetch from a deleted\n * Next.js API route\") — this file was simply missed in that same pass. Two\n * real, live consumers were affected: `app/collections/CollectionsClient.tsx`\n * (the entire \"browse all collections\" page) and `HomeClient.tsx`'s four\n * home-page collection rails — both have been silently 404ing on every\n * real page load. Fixed the same way: call the SDK's real GraphQL service\n * functions directly (collection.service.ts), resolving config from\n * SdkContext the same way every other SDK hook does.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { ListParams } from '../types/store'\nimport { getCacheTier } from '../utils/cache'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport type { SdkConfig } from '../config'\nimport { getStorefrontCollections, getStorefrontCollectionBySlug } from '../services/collection.service'\n\nexport const collectionKeys = {\n all: ['core', 'collections'] as const,\n list: (params?: ListParams) => ['core', 'collections', 'list', params ?? {}] as const,\n slug: (slug: string) => ['core', 'collections', 'slug', slug] as const,\n}\n\n/**\n * Hook to fetch paginated collections for the storefront.\n */\nexport function useStorefrontCollections(params?: ListParams, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: collectionKeys.list(params),\n queryFn: () => getStorefrontCollections(cfg, params),\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook to fetch a single collection by slug for the storefront.\n */\nexport function useStorefrontCollection(slug: string, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: collectionKeys.slug(slug),\n queryFn: () => getStorefrontCollectionBySlug(cfg, slug),\n ...getCacheTier('medium'),\n enabled: !!slug,\n })\n}\n","import { GraphQLClient } from 'graphql-request'\nimport type { SdkConfig } from '../config'\n\n/**\n * REAL BUG FIXED (2026-09-21), live-reproduced in the browser console:\n * `graphql-request`'s `GraphQLClient` constructs a `new URL(endpoint)`\n * internally when issuing a request. Client-side SDK config deliberately\n * uses a same-origin relative path (`/api/proxy/store`) so the real backend\n * host is never exposed to the browser — but the native `URL` constructor\n * throws `TypeError: Failed to construct 'URL': Invalid URL` for a relative\n * string with no base, which is exactly what broke every client-side\n * GraphQL call (products, collections, wishlist): `Failed to fetch\n * products`/`Failed to fetch collections` in ProductsListing.tsx.\n *\n * Server-side config already uses an absolute real-backend URL, so this is\n * a no-op there — only the browser case (a relative path, `window` defined)\n * needs the current origin prepended.\n */\nexport function resolveGraphQLEndpoint(url: string): string {\n if (typeof window === 'undefined') return url\n try {\n // Absolute already (real backend URL, e.g. in a server-rendered client bundle edge case) — leave as-is.\n new URL(url)\n return url\n } catch {\n return `${window.location.origin}${url}`\n }\n}\n\n/**\n * REAL DUPLICATION FIXED (2026-09-22): this exact function (same headers,\n * same endpoint resolution) was hand-copied identically into\n * product.service.ts, collection.service.ts, and wishlist.service.ts — the\n * SDK's three GraphQL-backed services. One shared implementation now.\n */\nexport function 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(resolveGraphQLEndpoint(`${config.backendUrls.store}/graphql`), { headers })\n}\n","/** Internal type. DO NOT USE DIRECTLY. */\ntype Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n/** Internal type. DO NOT USE DIRECTLY. */\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type CollectionStatus =\n | 'ACTIVE'\n | 'ARCHIVED'\n | 'HIDDEN';\n\nexport type CollectionType =\n | 'MANUAL'\n | 'SMART';\n\nexport type ProductType =\n | 'BESPOKE'\n | 'DIGITAL'\n | 'PHYSICAL'\n | 'SERVICE';\n\nexport type CollectionFieldsFragment = { id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown };\n\nexport type GetStorefrontCollectionsQueryVariables = Exact<{\n page: number;\n pageSize: number;\n}>;\n\n\nexport type GetStorefrontCollectionsQuery = { storefront_collections: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> } };\n\nexport type GetStorefrontCollectionBySlugQueryVariables = Exact<{\n slug: string;\n}>;\n\n\nexport type GetStorefrontCollectionBySlugQuery = { storefront_collection_by_slug: { id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown } | null };\n\nexport type ProductFieldsFragment = { id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> };\n\nexport type GetStorefrontProductsQueryVariables = Exact<{\n page: number;\n pageSize: number;\n collectionSlug?: string | null | undefined;\n search?: string | null | undefined;\n productType?: string | null | undefined;\n}>;\n\n\nexport type GetStorefrontProductsQuery = { storefront_products: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> }> } };\n\nexport type GetStorefrontProductBySlugQueryVariables = Exact<{\n slug: string;\n}>;\n\n\nexport type GetStorefrontProductBySlugQuery = { storefront_product_by_slug: { id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> } | null };\n\nexport type GetStorefrontPopularQueryVariables = Exact<{\n page: number;\n pageSize: number;\n}>;\n\n\nexport type GetStorefrontPopularQuery = { storefront_popular: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> }> } };\n\nexport type GetStorefrontFeaturedQueryVariables = Exact<{\n page: number;\n pageSize: number;\n}>;\n\n\nexport type GetStorefrontFeaturedQuery = { storefront_featured: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> }> } };\n\nexport type GetStorefrontNewQueryVariables = Exact<{\n page: number;\n pageSize: number;\n}>;\n\n\nexport type GetStorefrontNewQuery = { storefront_new: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> }> } };\n\nexport type GetStorefrontOnSaleQueryVariables = Exact<{\n page: number;\n pageSize: number;\n}>;\n\n\nexport type GetStorefrontOnSaleQuery = { storefront_on_sale: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> }> } };\n\nexport type GetStorefrontRecommendedQueryVariables = Exact<{\n page: number;\n pageSize: number;\n excludeProductId?: string | null | undefined;\n}>;\n\n\nexport type GetStorefrontRecommendedQuery = { storefront_recommended: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, business_id: string, name: string, slug: string, description: string | null, brand: string | null, product_type: ProductType, requires_shipping: boolean, is_consumable: boolean, is_bespoke: boolean, is_physical: boolean | null, is_non_returnable: boolean, deposit_percentage: number, base_price: number, currency: string, sale_price: number | null, sale_start: unknown, sale_end: unknown, images: Array<string>, tags: Array<string>, is_published: boolean, is_featured: boolean, is_popular: boolean, is_new: boolean, is_temporary: boolean, average_rating: number | null, rating_count: number, source_channel: string, source_channel_ref_id: string | null, service_type: string | null, service_duration_minutes: number | null, service_location_type: string | null, service_coverage_radius_km: number | null, service_requires_consultation: boolean, service_max_capacity_per_slot: number | null, service_buffer_minutes: number, service_is_recurring: boolean, service_recurring_interval: string | null, service_project_based: boolean, download_limit: number | null, download_expires_at: unknown, weight_kg: number, length_cm: number | null, width_cm: number | null, height_cm: number | null, created_at: unknown, updated_at: unknown, custom_fields: Array<{ label: string, unit: string | null, required: boolean, field_type: string, options: Array<string> }>, digital_files: Array<{ id: string, file_key: string, display_name: string, sort_order: number }>, variants: Array<{ id: string, product_id: string, sku: string | null, attributes: string | null, price: number | null, images: Array<string>, weight_kg: number | null, is_active: boolean, created_at: unknown, updated_at: unknown, inventory: { id: string, product_id: string, variant_id: string | null, quantity: number, reserved: number, reorder_point: number, reorder_quantity: number, track_quantity: boolean, allow_backorder: boolean, available: number, is_in_stock: boolean, is_low_stock: boolean, updated_at: unknown } | null }>, collections: Array<{ id: string, business_id: string | null, name: string, slug: string, description: string | null, image_url: string | null, collection_type: CollectionType, rules: string | null, status: CollectionStatus, sort_order: number, created_at: unknown, updated_at: unknown }> }> } };\n\nexport type GetStorefrontWishlistQueryVariables = Exact<{\n page: number;\n pageSize: number;\n}>;\n\n\nexport type GetStorefrontWishlistQuery = { storefront_wishlist: { total: number, page: number, page_size: number, total_pages: number, items: Array<{ id: string, product_id: string, notes: string | null, created_at: unknown, product_name: string | null, product_slug: string | null, product_price: number | null, currency: string | null, product_image: string | null }> } };\n\nexport type CheckInStorefrontWishlistQueryVariables = Exact<{\n productId: string;\n}>;\n\n\nexport type CheckInStorefrontWishlistQuery = { check_in_storefront_wishlist: { in_wishlist: boolean } };\n\nexport const CollectionFieldsFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CollectionFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Collection\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]} as unknown as DocumentNode<CollectionFieldsFragment, unknown>;\nexport const ProductFieldsFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<ProductFieldsFragment, unknown>;\nexport const GetStorefrontCollectionsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontCollections\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_collections\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CollectionFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CollectionFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Collection\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]} as unknown as DocumentNode<GetStorefrontCollectionsQuery, GetStorefrontCollectionsQueryVariables>;\nexport const GetStorefrontCollectionBySlugDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontCollectionBySlug\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_collection_by_slug\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CollectionFields\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CollectionFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Collection\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]} as unknown as DocumentNode<GetStorefrontCollectionBySlugQuery, GetStorefrontCollectionBySlugQueryVariables>;\nexport const GetStorefrontProductsDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontProducts\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"collectionSlug\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"search\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"productType\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_products\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"collectionSlug\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"collectionSlug\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"search\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"search\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"productType\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"productType\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontProductsQuery, GetStorefrontProductsQueryVariables>;\nexport const GetStorefrontProductBySlugDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontProductBySlug\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_product_by_slug\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontProductBySlugQuery, GetStorefrontProductBySlugQueryVariables>;\nexport const GetStorefrontPopularDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontPopular\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_popular\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontPopularQuery, GetStorefrontPopularQueryVariables>;\nexport const GetStorefrontFeaturedDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontFeatured\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_featured\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontFeaturedQuery, GetStorefrontFeaturedQueryVariables>;\nexport const GetStorefrontNewDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontNew\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_new\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontNewQuery, GetStorefrontNewQueryVariables>;\nexport const GetStorefrontOnSaleDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontOnSale\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_on_sale\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontOnSaleQuery, GetStorefrontOnSaleQueryVariables>;\nexport const GetStorefrontRecommendedDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontRecommended\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"excludeProductId\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_recommended\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"excludeProductId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"excludeProductId\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ProductFields\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Product\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"brand\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requires_shipping\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_consumable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_bespoke\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_physical\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_non_returnable\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deposit_percentage\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"base_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_start\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sale_end\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tags\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"custom_fields\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"required\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"field_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"options\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_published\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_featured\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_popular\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_new\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_temporary\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"average_rating\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rating_count\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source_channel_ref_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_duration_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_location_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_coverage_radius_km\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_requires_consultation\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_max_capacity_per_slot\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_buffer_minutes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_is_recurring\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_recurring_interval\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"service_project_based\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"digital_files\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"file_key\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"display_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_limit\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"download_expires_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"length_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height_cm\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variants\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sku\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"attributes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"images\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"weight_kg\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_active\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"inventory\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"variant_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reserved\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_point\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reorder_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"track_quantity\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allow_backorder\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"available\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_in_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"is_low_stock\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collections\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"business_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image_url\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"collection_type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rules\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sort_order\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updated_at\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontRecommendedQuery, GetStorefrontRecommendedQueryVariables>;\nexport const GetStorefrontWishlistDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"GetStorefrontWishlist\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"storefront_wishlist\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"notes\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"created_at\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_slug\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_price\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"product_image\"}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page_size\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total_pages\"}}]}}]}}]} as unknown as DocumentNode<GetStorefrontWishlistQuery, GetStorefrontWishlistQueryVariables>;\nexport const CheckInStorefrontWishlistDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"CheckInStorefrontWishlist\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"productId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"check_in_storefront_wishlist\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"productId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"productId\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"in_wishlist\"}}]}}]}}]} as unknown as DocumentNode<CheckInStorefrontWishlistQuery, CheckInStorefrontWishlistQueryVariables>;","/**\n * Collection Service\n *\n * Handles collection operations using GraphQL.\n * Stateless - all configuration passed as parameters.\n */\nimport type { Collection, PaginatedResponse, ListParams } from '../types/store'\nimport type { SdkConfig } from '../config'\nimport { createGraphQLClient } from '../utils/graphql-url'\nimport {\n GetStorefrontCollectionsDocument,\n GetStorefrontCollectionBySlugDocument,\n type CollectionFieldsFragment,\n} from '../generated/graphql'\n\nfunction mapCollection(raw: CollectionFieldsFragment): Collection {\n return {\n ...raw,\n business_id: raw.business_id ?? undefined,\n description: raw.description ?? undefined,\n image_url: raw.image_url ?? undefined,\n rules: raw.rules ?? undefined,\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n } satisfies Collection\n}\n\n/**\n * Fetch paginated active collections for the storefront.\n */\nexport async function getStorefrontCollections(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Collection>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontCollectionsDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n })\n return { ...data.storefront_collections, items: data.storefront_collections.items.map(mapCollection) }\n}\n\n/**\n * Fetch a single collection by its slug.\n */\nexport async function getStorefrontCollectionBySlug(\n config: SdkConfig,\n slug: string\n): Promise<Collection> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontCollectionBySlugDocument, { slug })\n if (!data.storefront_collection_by_slug) {\n throw new Error(`Collection not found: ${slug}`)\n }\n return mapCollection(data.storefront_collection_by_slug)\n}\n","/**\n * Products Hooks\n *\n * React Query hooks for fetching products via the real GraphQL storefront API.\n *\n * REAL BUG FIXED (2026-09-21), live-reproduced: every hook here used to fetch\n * from a Next.js API route (`/api/products/popular`, `/api/products/featured`,\n * etc.) — but those routes were deleted earlier this session as confirmed\n * orphaned (an incomplete grep missed this file as a real consumer, the same\n * mistake class already caught once for `/api/products/[slug]`). This broke\n * every home-page rail (Featured/New/Popular/On Sale) and the \"You may also\n * crave\" recommended section — all 404s. Fixed by calling the SDK's real\n * GraphQL service functions directly (product.service.ts), resolving config\n * from SdkContext the same way every other SDK hook does (see use-orders.ts).\n * `useLatestProducts`/`useLowStockProducts`/`useStorefrontProducts`/\n * `useProduct` are NOT restored — confirmed zero real UI consumers anywhere\n * in kasuvia-storefront (ProductsListing.tsx and the product detail page\n * both already call the SDK service functions directly, not through a hook).\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { ListParams } from '../types/store'\nimport { getCacheTier } from '../utils/cache'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport type { SdkConfig } from '../config'\nimport {\n getPopularProducts,\n getFeaturedProducts,\n getNewProducts,\n getOnSaleProducts,\n getRecommendedProducts,\n} from '../services/product.service'\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 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}\n\n/**\n * Hook for fetching popular products.\n */\nexport function usePopularProducts(params?: ListParams, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: productKeys.popular(params),\n queryFn: () => getPopularProducts(cfg, params),\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching featured products.\n */\nexport function useFeaturedProducts(params?: ListParams, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: productKeys.featured(params),\n queryFn: () => getFeaturedProducts(cfg, params),\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching new products.\n */\nexport function useNewProducts(params?: ListParams, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: productKeys.new(params),\n queryFn: () => getNewProducts(cfg, params),\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching products currently on sale.\n */\nexport function useOnSaleProducts(params?: ListParams, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: productKeys.onSale(params),\n queryFn: () => getOnSaleProducts(cfg, params),\n ...getCacheTier('medium'),\n })\n}\n\n/**\n * Hook for fetching recommended products.\n */\nexport function useRecommendedProducts(params?: ListParams & { excludeProductId?: string }, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: productKeys.recommended(params),\n queryFn: () => getRecommendedProducts(cfg, params),\n ...getCacheTier('medium'),\n })\n}\n","/**\n * Product Service\n *\n * Handles product operations using GraphQL.\n * Stateless - all configuration passed as parameters.\n */\nimport type { Product, PaginatedResponse, ListParams } from '../types/store'\nimport { ProductTypeEnum } from '../types/store'\nimport type { SdkConfig } from '../config'\nimport { createGraphQLClient } from '../utils/graphql-url'\nimport {\n GetStorefrontProductsDocument,\n GetStorefrontProductBySlugDocument,\n GetStorefrontPopularDocument,\n GetStorefrontFeaturedDocument,\n GetStorefrontNewDocument,\n GetStorefrontOnSaleDocument,\n GetStorefrontRecommendedDocument,\n type ProductFieldsFragment,\n type ProductType as GeneratedProductType,\n} from '../generated/graphql'\n\n/**\n * REAL BUG FIXED (2026-09-21), live-reproduced — the root cause of \"nothing\n * e-commerce-related works\": kasuvia-store-management's ProductType is a\n * Python Enum (`PHYSICAL = \"physical\"`, schema.py:16-20). Strawberry\n * GraphQL serializes an enum field using the member NAME over the wire —\n * standard, spec-correct GraphQL behavior (GraphQL enum values are\n * conventionally ALL_CAPS) — so `storefront_products { items { product_type\n * } } }` has always actually returned `\"PHYSICAL\"`/`\"DIGITAL\"`/`\"SERVICE\"`/\n * `\"BESPOKE\"`, never the lowercase value every frontend `product_type ===\n * \"physical\"` check (ProductCTA, ProductInfo, ProductTypeDetails,\n * ProductCard, CheckoutClient, getGuestCartProductType — every one of them)\n * was written assuming. Every type-aware branch silently fell through to\n * whatever its default/fallback case was, for every single product,\n * platform-wide — confirmed live: a real SERVICE product rendered a plain\n * \"Add to Cart\" button instead of any service-specific flow.\n *\n * Originally fixed with a blind `.toLowerCase()` at the single point every\n * product enters the SDK from GraphQL. Now that `product_type` is a real\n * generated union (`GeneratedProductType`, from graphql-codegen against the\n * live schema — see graphql/schema.graphql), this is an exhaustive switch\n * instead: if kasuvia-store-management ever adds a 5th ProductType member,\n * this function fails to COMPILE until it's handled here, rather than\n * silently lowercasing an unrecognised string at runtime.\n */\nfunction mapProductType(raw: GeneratedProductType): ProductTypeEnum {\n switch (raw) {\n case 'PHYSICAL':\n return ProductTypeEnum.PHYSICAL\n case 'DIGITAL':\n return ProductTypeEnum.DIGITAL\n case 'SERVICE':\n return ProductTypeEnum.SERVICE\n case 'BESPOKE':\n return ProductTypeEnum.BESPOKE\n default: {\n const _exhaustive: never = raw\n throw new Error(`Unhandled GraphQL ProductType member: ${_exhaustive}`)\n }\n }\n}\n\n/**\n * `field_type` is a plain GraphQL String (CustomField isn't a GraphQL enum),\n * but the real backend (CustomFieldSchema's `Literal[\"text\", \"choice\"]`)\n * only ever writes one of these two values — validated at save time, not\n * guessed here. An unrecognised value means the backend and this mapping\n * have drifted, which should fail loud rather than silently coerce to a\n * default that would misrender the field.\n */\nfunction mapCustomFieldType(raw: string): \"text\" | \"choice\" {\n if (raw === \"text\" || raw === \"choice\") return raw\n throw new Error(`Unrecognised custom field field_type from backend: \"${raw}\"`)\n}\n\n/**\n * Maps the raw, generated GraphQL fragment shape to the SDK's public\n * `Product` type. `satisfies Product` (not `as Product`) is deliberate: it\n * keeps this a real compile-time check against the public type rather than\n * an unchecked assertion — if `ProductFieldsFragment` and `Product` ever\n * drift (a field renamed on one side, a nullability change), this function\n * fails to compile instead of quietly shipping a mismatched shape.\n */\nfunction mapProduct(raw: ProductFieldsFragment): Product {\n return {\n ...raw,\n product_type: mapProductType(raw.product_type),\n custom_fields: raw.custom_fields.map((f) => ({\n ...f,\n unit: f.unit ?? undefined,\n field_type: mapCustomFieldType(f.field_type),\n })),\n description: raw.description ?? undefined,\n brand: raw.brand ?? undefined,\n is_physical: raw.is_physical ?? undefined,\n sale_price: raw.sale_price ?? undefined,\n sale_start: (raw.sale_start as string | null) ?? undefined,\n sale_end: (raw.sale_end as string | null) ?? undefined,\n source_channel_ref_id: raw.source_channel_ref_id ?? undefined,\n download_limit: raw.download_limit ?? undefined,\n download_expires_at: (raw.download_expires_at as string | null) ?? undefined,\n service_type: (raw.service_type as Product['service_type']) ?? undefined,\n service_duration_minutes: raw.service_duration_minutes ?? undefined,\n service_location_type: (raw.service_location_type as Product['service_location_type']) ?? undefined,\n service_coverage_radius_km: raw.service_coverage_radius_km ?? undefined,\n service_max_capacity_per_slot: raw.service_max_capacity_per_slot ?? undefined,\n service_recurring_interval: (raw.service_recurring_interval as Product['service_recurring_interval']) ?? undefined,\n length_cm: raw.length_cm ?? undefined,\n width_cm: raw.width_cm ?? undefined,\n height_cm: raw.height_cm ?? undefined,\n average_rating: raw.average_rating ?? undefined,\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n variants: raw.variants.map((v) => ({\n ...v,\n sku: v.sku ?? undefined,\n attributes: v.attributes ? JSON.parse(v.attributes) : {},\n price: v.price ?? undefined,\n weight_kg: v.weight_kg ?? undefined,\n inventory: v.inventory\n ? {\n ...v.inventory,\n variant_id: v.inventory.variant_id ?? undefined,\n updated_at: v.inventory.updated_at as string,\n }\n : undefined,\n created_at: v.created_at as string,\n updated_at: v.updated_at as string,\n })),\n collections: raw.collections.map((c) => ({\n ...c,\n business_id: c.business_id ?? undefined,\n description: c.description ?? undefined,\n image_url: c.image_url ?? undefined,\n rules: c.rules ?? undefined,\n created_at: c.created_at as string,\n updated_at: c.updated_at as string,\n })),\n } satisfies Product\n}\n\nfunction mapProductConnection<T extends { items: ProductFieldsFragment[]; total: number; page: number; page_size: number; total_pages: number }>(\n connection: T\n): PaginatedResponse<Product> {\n return { ...connection, items: connection.items.map(mapProduct) }\n}\n\n/**\n * Create GraphQL client with provided config\n */\n/**\n * Fetch all active products for the storefront.\n */\nexport async function getStorefrontProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontProductsDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n collectionSlug: params?.collectionSlug,\n search: params?.search,\n productType: params?.productType,\n })\n return mapProductConnection(data.storefront_products)\n}\n\n/**\n * Fetch a single product by slug for the storefront.\n */\nexport async function getStorefrontProductBySlug(\n config: SdkConfig,\n slug: string\n): Promise<Product> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontProductBySlugDocument, { slug })\n if (!data.storefront_product_by_slug) {\n throw new Error(`Product not found: ${slug}`)\n }\n return mapProduct(data.storefront_product_by_slug)\n}\n\n/**\n * Fetch popular products for the storefront.\n */\nexport async function getPopularProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontPopularDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n })\n return mapProductConnection(data.storefront_popular)\n}\n\n/**\n * Fetch featured products for the storefront.\n */\nexport async function getFeaturedProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontFeaturedDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n })\n return mapProductConnection(data.storefront_featured)\n}\n\n/**\n * Fetch new products for the storefront.\n */\nexport async function getNewProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontNewDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n })\n return mapProductConnection(data.storefront_new)\n}\n\n/**\n * Fetch products currently on sale for the storefront.\n */\nexport async function getOnSaleProducts(\n config: SdkConfig,\n params?: ListParams\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontOnSaleDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n })\n return mapProductConnection(data.storefront_on_sale)\n}\n\n/**\n * Fetch recommended products for the storefront.\n * Returns featured, popular, and new products.\n * Optionally excludes a specific product ID.\n */\nexport async function getRecommendedProducts(\n config: SdkConfig,\n params?: ListParams & { excludeProductId?: string }\n): Promise<PaginatedResponse<Product>> {\n const client = createGraphQLClient(config)\n const data = await client.request(GetStorefrontRecommendedDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 4,\n excludeProductId: params?.excludeProductId,\n })\n return mapProductConnection(data.storefront_recommended)\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 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.reject(new Error('No access token available')),\n enabled: !!token,\n ...getCacheTier('medium'),\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 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}\n\nexport function useAddToWishlist(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\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(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n}\n\nexport function useRemoveFromWishlist(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\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(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n}\n\nexport function useRemoveProductFromWishlist(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\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(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: wishlistKeys.all })\n queryClient.invalidateQueries({ queryKey: ['wishlist', 'check'] })\n },\n })\n}\n","/**\n * Wishlist Service\n * \n * Handles wishlist operations.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { WishlistItem, WishlistListResponse, WishlistCheckResponse } from '../types/store'\nimport { createGraphQLClient } from '../utils/graphql-url'\nimport { GetStorefrontWishlistDocument, CheckInStorefrontWishlistDocument } from '../generated/graphql'\nimport { apiRequest, authHeaders, JSON_HEADERS } from '../utils/http-client'\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 data = await client.request(GetStorefrontWishlistDocument, {\n page: params?.page || 1,\n pageSize: params?.pageSize || 20,\n })\n return {\n ...data.storefront_wishlist,\n items: data.storefront_wishlist.items.map((item) => ({\n ...item,\n created_at: item.created_at as string,\n notes: item.notes ?? undefined,\n product_name: item.product_name ?? undefined,\n product_slug: item.product_slug ?? undefined,\n product_price: item.product_price ?? undefined,\n currency: item.currency ?? undefined,\n product_image: item.product_image ?? undefined,\n })) satisfies WishlistItem[],\n }\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(CheckInStorefrontWishlistDocument, { 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 return apiRequest<WishlistItem>(`${config.backendUrls.store}/wishlist/`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify({\n product_id: productId,\n notes: notes || undefined,\n }),\n fallbackErrorMessage: 'Failed to add to wishlist',\n })\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 await apiRequest(`${config.backendUrls.store}/wishlist/${itemId}`, {\n method: 'DELETE',\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to remove from wishlist',\n })\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 await apiRequest(`${config.backendUrls.store}/wishlist/product/${productId}`, {\n method: 'DELETE',\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to remove product from wishlist',\n })\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 rescheduleAppointment,\n disputeAppointment,\n confirmAppointmentCompletion,\n getMilestones,\n approveMilestone,\n} from '../services/service-booking.service'\nimport type { SdkConfig } from '../config'\nimport type {\n ServiceAppointment,\n ServiceAppointmentCreatePayload,\n CancelAppointmentPayload,\n RescheduleAppointmentPayload,\n DisputeAppointmentPayload,\n ConfirmAppointmentPayload,\n ApproveMilestonePayload,\n} from '../types/services'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\nexport function useAvailableSlots(\n config: SdkConfig | undefined,\n productId: string | undefined,\n date: string | undefined,\n params?: { staffId?: string; locationId?: string; customerLatitude?: number; customerLongitude?: number }\n) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: [\"available-slots\", productId, date, params?.staffId, params?.locationId],\n queryFn: () => getAvailableSlots(cfg, productId!, date!, params),\n enabled: !!productId && !!date,\n })\n}\n\nexport function useBookAppointment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\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(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\nexport function useAppointments(\n config?: SdkConfig,\n accessToken?: string | null,\n params?: { status?: ServiceAppointment['status']; page?: number; page_size?: number }\n) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: [\"appointments\", params?.status, params?.page, params?.page_size],\n queryFn: () => token ? getAppointments(cfg, token, params) : Promise.reject(new Error('No access token available')),\n enabled: !!token,\n })\n}\n\nexport function useAppointment(config: SdkConfig | undefined, accessToken: string | null | undefined, id: string | undefined) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: [\"appointment\", id],\n queryFn: () => token && id ? getAppointment(cfg, token, id) : Promise.reject(new Error('Missing appointment ID or access token')),\n enabled: !!id && !!token,\n })\n}\n\nexport function useCancelAppointment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ id, payload }: { id: string; payload?: CancelAppointmentPayload }) =>\n token ? cancelAppointment(cfg, token, id, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\nexport function useRescheduleAppointment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ id, payload }: { id: string; payload: RescheduleAppointmentPayload }) =>\n token ? rescheduleAppointment(cfg, token, id, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\nexport function useDisputeAppointment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ id, payload }: { id: string; payload: DisputeAppointmentPayload }) =>\n token ? disputeAppointment(cfg, token, id, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\nexport function useConfirmAppointmentCompletion(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ id, payload }: { id: string; payload?: ConfirmAppointmentPayload }) =>\n token ? confirmAppointmentCompletion(cfg, token, id, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"appointments\"] })\n },\n })\n}\n\nexport function useMilestones(config: SdkConfig | undefined, accessToken: string | null | undefined, bookingId: string | undefined) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: [\"milestones\", bookingId],\n queryFn: () => token && bookingId ? getMilestones(cfg, token, bookingId) : Promise.reject(new Error('Missing booking ID or access token')),\n enabled: !!bookingId && !!token,\n })\n}\n\nexport function useApproveMilestone(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ bookingId, milestoneId, payload }: { bookingId: string; milestoneId: string; payload?: ApproveMilestonePayload }) =>\n token ? approveMilestone(cfg, token, bookingId, milestoneId, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"milestones\", variables.bookingId] })\n },\n })\n}\n","/**\n * Service Booking Service\n *\n * Handles service appointments (bookings) and their milestone/escrow\n * sub-resource. Stateless - all configuration passed as parameters.\n *\n * REAL BUGS FIXED (2026-09-20) — every function in this file was rewritten\n * against the real backend (kasuvia-store-management/app/api/v1/endpoints/\n * service/bookings.py, app/schemas/service.py). Before this fix:\n * - getAvailableSlots called a nonexistent route (/service/available-slots/\n * {id}) with the wrong params (date_from/date_to) — the real route is\n * GET /catalog/products/{id}/available-slots?date=..., a single date.\n * - bookAppointment POSTed to a nonexistent route (/service/appointments/)\n * — the real route is POST /service/bookings/schedule.\n * - getAppointments typed its result as a plain array, but the real\n * response is the standard Kasuvia paginated envelope\n * ({results,count,page,page_size,total_pages}) — this was a CONFIRMED\n * LIVE CRASH: DashboardClient.tsx/DashboardAppointments.tsx called\n * .length/.filter() directly on the envelope object.\n * - cancelAppointment sent DELETE /service/bookings/{id} — that route is\n * owner/staff-only (require_permission(\"services:manage\")), so a\n * customer got a 403; the real customer route is POST .../{id}/cancel.\n * It also never checked response.ok at all, silently swallowing failures.\n * - getDeliverables/approveDeliverable/requestRevision referenced a\n * \"/service/projects/{order_id}/deliverables/...\" resource that does not\n * exist anywhere in the codebase — replaced with the real milestone\n * endpoints (a different resource: escrow-style payment milestones on\n * a booking, not free-form deliverable files).\n * - No coverage existed for reschedule, dispute, or buyer-confirm — all\n * real, customer-facing routes.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n ServiceAppointment,\n ServiceAppointmentCreatePayload,\n CancelAppointmentPayload,\n RescheduleAppointmentPayload,\n DisputeAppointmentPayload,\n ConfirmAppointmentPayload,\n AvailableSlotsResponse,\n ServiceMilestone,\n ApproveMilestonePayload,\n} from '../types/services'\nimport type { components } from '../generated/store-openapi'\nimport { apiRequest, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\n// ─── Codegen drift-proofs (openapi/README.md — regenerate via `pnpm run codegen:rest`) ─\n// Unlike order.service.ts, this file's hand-written types (types/services/\n// index.ts) were already verified field-for-field correct against the real\n// backend Pydantic schemas (see that file's own header comment) - full\n// replacement would only add risk for zero gain. These type-level\n// assignments instead prove the match at compile time: if the real backend\n// schema ever adds/renames/retypes a field these three interfaces declare,\n// the corresponding line below fails to compile immediately (at `pnpm run\n// codegen:rest` + `tsc` time), the same drift-detection value Workstream 1\n// already proved for the GraphQL side, without touching working code.\n// (One real drift WAS found and fixed this way: ServiceMilestone.amount\n// was typed `number` but the real field is a Decimal-as-string.)\ntype _ServiceAppointmentMatchesSchema = ServiceAppointment extends components['schemas']['ServiceBookingResponse'] ? true : never\ntype _AvailableSlotsResponseMatchesSchema = AvailableSlotsResponse extends components['schemas']['AvailableSlotsResponse'] ? true : never\ntype _ServiceMilestoneMatchesSchema = ServiceMilestone extends components['schemas']['ServiceMilestoneResponse'] ? true : never\nconst _serviceAppointmentCheck: _ServiceAppointmentMatchesSchema = true\nconst _availableSlotsCheck: _AvailableSlotsResponseMatchesSchema = true\nconst _serviceMilestoneCheck: _ServiceMilestoneMatchesSchema = true\nvoid _serviceAppointmentCheck\nvoid _availableSlotsCheck\nvoid _serviceMilestoneCheck\n\n/** Standard Kasuvia pagination envelope — matches app/core/pagination.py's PaginatedResponse exactly. */\nexport interface ServiceBookingsPage {\n results: ServiceAppointment[]\n count: number\n page: number\n page_size: number\n total_pages: number\n}\n\n/**\n * GET /catalog/products/{product_id}/available-slots — real \"what times are\n * open\" for a SERVICE product on one date. `serviceable: false` means the\n * business has no/ambiguous location config for this product (check\n * `reason`); `available_slots` is always empty in that case, not an error.\n */\nexport async function getAvailableSlots(\n config: SdkConfig,\n productId: string,\n date: string,\n params?: { staffId?: string; locationId?: string; customerLatitude?: number; customerLongitude?: number }\n): Promise<AvailableSlotsResponse> {\n const query = new URLSearchParams({ date })\n if (params?.staffId) query.set('staff_id', params.staffId)\n if (params?.locationId) query.set('location_id', params.locationId)\n if (params?.customerLatitude !== undefined) query.set('customer_latitude', String(params.customerLatitude))\n if (params?.customerLongitude !== undefined) query.set('customer_longitude', String(params.customerLongitude))\n\n return apiRequest<AvailableSlotsResponse>(\n `${config.backendUrls.store}/catalog/products/${productId}/available-slots?${query.toString()}`,\n {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to get available slots',\n }\n )\n}\n\n/** POST /service/bookings/schedule */\nexport async function bookAppointment(\n config: SdkConfig,\n accessToken: string,\n payload: ServiceAppointmentCreatePayload\n): Promise<ServiceAppointment> {\n return apiRequest<ServiceAppointment>(`${config.backendUrls.store}/service/bookings/schedule`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to book appointment',\n })\n}\n\n/** GET /service/bookings/my — paginated. */\nexport async function getAppointments(\n config: SdkConfig,\n accessToken: string,\n params?: { status?: ServiceAppointment['status']; page?: number; page_size?: number }\n): Promise<ServiceBookingsPage> {\n const query = new URLSearchParams()\n if (params?.status) query.set('status', params.status)\n if (params?.page) query.set('page', String(params.page))\n if (params?.page_size) query.set('page_size', String(params.page_size))\n\n return apiRequest<ServiceBookingsPage>(`${config.backendUrls.store}/service/bookings/my?${query.toString()}`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to get appointments',\n })\n}\n\n/**\n * GET /service/bookings/{id} — customer-reachable single-booking lookup,\n * used by the paginated list's detail view (PATCH .../{id} is a separate,\n * owner/staff-only route).\n *\n * REAL BUG FIXED (2026-09-22): this call shape was already correct, but the\n * backend route it targeted didn't exist at all — `ServiceBookingRepository\n * .get_by_id_and_business` was used internally by every merchant action\n * (cancel/reschedule/dispute/assign/etc.) but never exposed as a customer\n * GET route. Every real call to `AppointmentDetail.tsx` (via `useAppointment`)\n * 404'd. Fixed by adding `GET /{booking_id}` to kasuvia-store-management's\n * `service/bookings.py` (customer_id-scoped, same pattern as\n * `customer_cancel_booking` — service bookings have no guest-checkout path,\n * so no guest_email fallback is needed here unlike orders).\n */\nexport async function getAppointment(config: SdkConfig, accessToken: string, id: string): Promise<ServiceAppointment> {\n return apiRequest<ServiceAppointment>(`${config.backendUrls.store}/service/bookings/${id}`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to get appointment',\n })\n}\n\n/** POST /service/bookings/{id}/cancel — the real customer-cancel route (DELETE .../{id} is owner/staff-only). */\nexport async function cancelAppointment(\n config: SdkConfig,\n accessToken: string,\n id: string,\n payload?: CancelAppointmentPayload\n): Promise<ServiceAppointment> {\n return apiRequest<ServiceAppointment>(`${config.backendUrls.store}/service/bookings/${id}/cancel`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload ?? {}),\n fallbackErrorMessage: 'Failed to cancel appointment',\n })\n}\n\n/** POST /service/bookings/{id}/reschedule — subject to the same cancellation_window_hours as a cancel. */\nexport async function rescheduleAppointment(\n config: SdkConfig,\n accessToken: string,\n id: string,\n payload: RescheduleAppointmentPayload\n): Promise<ServiceAppointment> {\n return apiRequest<ServiceAppointment>(`${config.backendUrls.store}/service/bookings/${id}/reschedule`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to reschedule appointment',\n })\n}\n\n/** POST /service/bookings/{id}/dispute — freezes the escrow auto-release timer; requires a real reason. */\nexport async function disputeAppointment(\n config: SdkConfig,\n accessToken: string,\n id: string,\n payload: DisputeAppointmentPayload\n): Promise<ServiceAppointment> {\n return apiRequest<ServiceAppointment>(`${config.backendUrls.store}/service/bookings/${id}/dispute`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to open dispute',\n })\n}\n\n/** POST /service/bookings/{id}/confirm — buyer confirms the service was completed. */\nexport async function confirmAppointmentCompletion(\n config: SdkConfig,\n accessToken: string,\n id: string,\n payload?: ConfirmAppointmentPayload\n): Promise<ServiceAppointment> {\n return apiRequest<ServiceAppointment>(`${config.backendUrls.store}/service/bookings/${id}/confirm`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload ?? {}),\n fallbackErrorMessage: 'Failed to confirm completion',\n })\n}\n\n/** GET /service/bookings/{id}/milestones — escrow-style payment milestones for a milestone-based booking. */\nexport async function getMilestones(config: SdkConfig, accessToken: string, bookingId: string): Promise<ServiceMilestone[]> {\n return apiRequest<ServiceMilestone[]>(`${config.backendUrls.store}/service/bookings/${bookingId}/milestones`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to get milestones',\n })\n}\n\n/** POST /service/bookings/{id}/milestones/{milestone_id}/approve — buyer approves a submitted milestone, triggering escrow release. */\nexport async function approveMilestone(\n config: SdkConfig,\n accessToken: string,\n bookingId: string,\n milestoneId: string,\n payload?: ApproveMilestonePayload\n): Promise<ServiceMilestone> {\n return apiRequest<ServiceMilestone>(\n `${config.backendUrls.store}/service/bookings/${bookingId}/milestones/${milestoneId}/approve`,\n {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(payload ?? {}),\n fallbackErrorMessage: 'Failed to approve milestone',\n }\n )\n}\n\n// Service object export for backward compatibility\nexport const serviceBookingService = {\n getAvailableSlots,\n bookAppointment,\n getAppointments,\n getAppointment,\n cancelAppointment,\n rescheduleAppointment,\n disputeAppointment,\n confirmAppointmentCompletion,\n getMilestones,\n approveMilestone,\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 PaymentFailedData {\n event: string;\n data: {\n transaction_id: string;\n order_id: string;\n status: string;\n gateway: 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 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 /** Fires on a real \"payment.failed\" event from the order-scoped stream (kasuvia-payment-system-go's webhook services now publish this — see monnify_webhook_service.go/flutterwave_webhook_service.go). */\n onPaymentFailed?: (data: PaymentFailedData) => void;\n onDigitalReady?: (data: DigitalReadyData) => void;\n onBespokeUpdate?: (data: BespokeUpdateData) => void;\n onServiceBookingUpdate?: (data: ServiceBookingUpdateData) => void;\n onError?: (error: Error) => void;\n}\n\nexport function useOrderStream({\n config: explicitConfig,\n orderId,\n onPaymentComplete,\n onPaymentFailed,\n onDigitalReady,\n onBespokeUpdate,\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 === 'payment.failed') {\n logger.log('[OrderStream] Payment failed detected, calling onPaymentFailed');\n if (onPaymentFailed) {\n onPaymentFailed(data as PaymentFailedData);\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 === '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, onPaymentFailed, onDigitalReady, onBespokeUpdate, onServiceBookingUpdate, onError]);\n\n return null;\n}\n","/**\n * format.ts\n * Comprehensive number formatting utility with multiple format styles.\n * Migrated from kasuvia-storefront to kasuvia-sdk for shared use.\n */\n\nexport type FormatStyle =\n | \"compact\" // 1000000 → \"1M\"\n | \"compact-lower\" // 1000000 → \"1m\"\n | \"compact-full\" // 1000000 → \"1 Million\"\n | \"compact-full-lower\" // 1000000 → \"1 million\"\n | \"currency\" // 1000000 → \"$1,000,000.00\"\n | \"currency-compact\" // 1000000 → \"$1M\"\n | \"decimal\" // 1000000 → \"1,000,000\"\n | \"decimal-dot\" // 1000000 → \"1.000.000\" (European style)\n | \"decimal-space\" // 1000000 → \"1 000 000\" (French/SI style)\n | \"plain\" // 1000000 → \"1000000\"\n | \"scientific\" // 1000000 → \"1.00e+6\"\n | \"ordinal\" // 1 → \"1st\", 2 → \"2nd\", etc.\n | \"percent\" // 0.75 → \"75%\"\n | \"bytes\" // 1048576 → \"1.00 MB\"\n | \"roman\"; // 14 → \"XIV\"\n\nexport interface FormatOptions {\n style?: FormatStyle;\n /** Number of decimal places (where applicable). Default: auto */\n decimals?: number;\n /** Currency symbol for \"currency\" styles. Default: \"$\" */\n currencySymbol?: string;\n /** Locale for Intl-based formatting. Default: \"en-US\" */\n locale?: string;\n /** If true, always show + sign for positive numbers */\n showSign?: boolean;\n}\n\n// ─── Thresholds ───────────────────────────────────────────────────────────────\n\nconst COMPACT_THRESHOLDS = [\n { value: 1e12, suffixUpper: \"T\", suffixLower: \"t\", full: \"Trillion\" },\n { value: 1e9, suffixUpper: \"B\", suffixLower: \"b\", full: \"Billion\" },\n { value: 1e6, suffixUpper: \"M\", suffixLower: \"m\", full: \"Million\" },\n { value: 1e3, suffixUpper: \"K\", suffixLower: \"k\", full: \"Thousand\" },\n] as const;\n\nconst BYTE_THRESHOLDS = [\n { value: 1024 ** 5, label: \"PB\" },\n { value: 1024 ** 4, label: \"TB\" },\n { value: 1024 ** 3, label: \"GB\" },\n { value: 1024 ** 2, label: \"MB\" },\n { value: 1024 ** 1, label: \"KB\" },\n] as const;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction trimDecimals(value: number, decimals?: number): string {\n if (decimals !== undefined) return value.toFixed(decimals);\n // Auto: trim unnecessary trailing zeros\n const fixed = value.toFixed(10);\n return parseFloat(fixed).toString();\n}\n\nfunction autoDecimals(value: number, defaultDecimals: number, decimals?: number): string {\n return (decimals !== undefined ? value.toFixed(decimals) : value.toFixed(defaultDecimals))\n .replace(/\\.?0+$/, \"\");\n}\n\nfunction applySign(str: string, num: number, showSign?: boolean): string {\n if (showSign && num > 0) return `+${str}`;\n return str;\n}\n\n// ─── Ordinal ──────────────────────────────────────────────────────────────────\n\nfunction toOrdinal(n: number): string {\n const abs = Math.abs(Math.round(n));\n const mod100 = abs % 100;\n const mod10 = abs % 10;\n if (mod100 >= 11 && mod100 <= 13) return `${abs}th`;\n if (mod10 === 1) return `${abs}st`;\n if (mod10 === 2) return `${abs}nd`;\n if (mod10 === 3) return `${abs}rd`;\n return `${abs}th`;\n}\n\n// ─── Roman Numerals ───────────────────────────────────────────────────────────\n\nfunction toRoman(n: number): string {\n if (n <= 0 || n > 3999 || !Number.isInteger(n)) {\n throw new RangeError(\"Roman numerals only support integers between 1 and 3999.\");\n }\n const vals = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];\n const syms = [\"M\", \"CM\", \"D\", \"CD\", \"C\", \"XC\", \"L\", \"XL\", \"X\", \"IX\", \"V\", \"IV\", \"I\"];\n let result = \"\";\n let remaining = n;\n for (let i = 0; i < vals.length; i++) {\n while (remaining >= vals[i]) {\n result += syms[i];\n remaining -= vals[i];\n }\n }\n return result;\n}\n\n// ─── Compact ─────────────────────────────────────────────────────────────────\n\nfunction formatCompact(\n n: number,\n suffixKey: \"suffixUpper\" | \"suffixLower\" | \"full\",\n lowerFull: boolean,\n decimals?: number,\n): string {\n const abs = Math.abs(n);\n for (const tier of COMPACT_THRESHOLDS) {\n if (abs >= tier.value) {\n const divided = n / tier.value;\n const suffix = suffixKey === \"full\"\n ? (lowerFull ? tier.full.toLowerCase() : tier.full)\n : tier[suffixKey];\n const spacer = suffixKey === \"full\" ? \" \" : \"\";\n return `${autoDecimals(divided, 2, decimals)}${spacer}${suffix}`;\n }\n }\n return trimDecimals(n, decimals ?? 0);\n}\n\n// ─── Decimal ─────────────────────────────────────────────────────────────────\n\nfunction formatDecimal(n: number, separator: string, decimalChar = \".\", decimals?: number): string {\n const fixed = decimals !== undefined ? Math.abs(n).toFixed(decimals) : Math.abs(n).toFixed(0);\n const [intPart, decPart] = fixed.split(\".\");\n const grouped = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator);\n const sign = n < 0 ? \"-\" : \"\";\n return decPart !== undefined ? `${sign}${grouped}${decimalChar}${decPart}` : `${sign}${grouped}`;\n}\n\n// ─── Bytes ────────────────────────────────────────────────────────────────────\n\nfunction formatBytes(n: number, decimals = 2): string {\n if (n === 0) return \"0 B\";\n const abs = Math.abs(n);\n for (const tier of BYTE_THRESHOLDS) {\n if (abs >= tier.value) {\n return `${(n / tier.value).toFixed(decimals)} ${tier.label}`;\n }\n }\n return `${n.toFixed(0)} B`;\n}\n\n// ─── Main Export ──────────────────────────────────────────────────────────────\n\n/**\n * Format a number in a variety of styles.\n *\n * @example\n * formatNumber(1_000_000) // \"1M\"\n * formatNumber(1_000_000, { style: \"compact-lower\" }) // \"1m\"\n * formatNumber(1_000_000, { style: \"compact-full\" }) // \"1 Million\"\n * formatNumber(1_000_000, { style: \"currency\" }) // \"$1,000,000.00\"\n * formatNumber(1_000_000, { style: \"decimal\" }) // \"1,000,000\"\n * formatNumber(1_234_567.89, { style: \"decimal-dot\" }) // \"1.234.567\"\n * formatNumber(0.754, { style: \"percent\" }) // \"75.4%\"\n * formatNumber(1_048_576, { style: \"bytes\" }) // \"1.00 MB\"\n * formatNumber(14, { style: \"roman\" }) // \"XIV\"\n */\nexport function formatNumber(value: number, options: FormatOptions = {}): string {\n const {\n style = \"compact\",\n decimals,\n currencySymbol = \"$\",\n locale = \"en-US\",\n showSign,\n } = options;\n\n if (!isFinite(value)) return String(value); // Handle Infinity / NaN\n\n let result: string;\n\n switch (style) {\n case \"compact\":\n result = formatCompact(value, \"suffixUpper\", false, decimals);\n break;\n\n case \"compact-lower\":\n result = formatCompact(value, \"suffixLower\", false, decimals);\n break;\n\n case \"compact-full\":\n result = formatCompact(value, \"full\", false, decimals);\n break;\n\n case \"compact-full-lower\":\n result = formatCompact(value, \"full\", true, decimals);\n break;\n\n case \"currency\": {\n const d = decimals ?? 2;\n const formatted = formatDecimal(value, \",\", \".\", d);\n result = `${currencySymbol}${formatted}`;\n break;\n }\n\n case \"currency-compact\": {\n const compact = formatCompact(Math.abs(value), \"suffixUpper\", false, decimals);\n const sign = value < 0 ? \"-\" : \"\";\n result = `${sign}${currencySymbol}${compact}`;\n break;\n }\n\n case \"decimal\":\n result = formatDecimal(value, \",\", \".\", decimals);\n break;\n\n case \"decimal-dot\":\n result = formatDecimal(value, \".\", \",\", decimals);\n break;\n\n case \"decimal-space\":\n result = formatDecimal(value, \"\\u00A0\", \".\", decimals); // non-breaking space\n break;\n\n case \"plain\":\n result = decimals !== undefined ? value.toFixed(decimals) : String(value);\n break;\n\n case \"scientific\": {\n const d = decimals ?? 2;\n result = value.toExponential(d);\n break;\n }\n\n case \"ordinal\":\n return toOrdinal(value); // sign not applicable\n\n case \"percent\": {\n const d = decimals ?? 1;\n result = `${(value * 100).toFixed(d).replace(/\\.?0+$/, \"\")}%`;\n break;\n }\n\n case \"bytes\":\n result = formatBytes(value, decimals);\n break;\n\n case \"roman\":\n return toRoman(Math.round(value)); // sign not applicable\n\n default:\n result = String(value);\n }\n\n return applySign(result, value, showSign);\n}\n\n// ─── Convenience wrappers ─────────────────────────────────────────────────────\n\n/** 1000000 → \"1M\" */\nexport const compact = (n: number, decimals?: number) =>\n formatNumber(n, { style: \"compact\", decimals });\n\n/** 1000000 → \"1m\" */\nexport const compactLower = (n: number, decimals?: number) =>\n formatNumber(n, { style: \"compact-lower\", decimals });\n\n/** 1000000 → \"1 Million\" */\nexport const compactFull = (n: number, decimals?: number) =>\n formatNumber(n, { style: \"compact-full\", decimals });\n\n/** 1000000 → \"$1,000,000.00\" */\nexport const currencyFormat = (n: number, symbol = \"$\", decimals = 2) =>\n formatNumber(n, { style: \"currency\", currencySymbol: symbol, decimals });\n\n/** 1000000 → \"$1M\" */\nexport const currencyCompact = (n: number, symbol = \"$\") =>\n formatNumber(n, { style: \"currency-compact\", currencySymbol: symbol });\n\n/** 1000000 → \"1,000,000\" */\nexport const decimal = (n: number, decimals?: number) =>\n formatNumber(n, { style: \"decimal\", decimals });\n\n/** 0.75 → \"75%\" */\nexport const percent = (n: number, decimals?: number) =>\n formatNumber(n, { style: \"percent\", decimals });\n\n/** 1048576 → \"1.00 MB\" */\nexport const bytes = (n: number, decimals?: number) =>\n formatNumber(n, { style: \"bytes\", decimals });\n\n/** 14 → \"XIV\" */\nexport const roman = (n: number) => formatNumber(n, { style: \"roman\" });\n\n/** 1 → \"1st\", 2 → \"2nd\" */\nexport const ordinal = (n: number) => formatNumber(n, { style: \"ordinal\" });\n\n// ─── Currency Formatting (Multi-Currency Support) ─────────────────────────────\n\n/**\n * NOTE: Currency and language data should be fetched from KASUVIA_PAYMENT backend API\n * using the useSupportedLanguages hook. Do not hardcode currency values here.\n * Use the formatPrice, getCurrencySymbol, and formatCompactPrice functions with\n * currency/locale parameters from the API response.\n */\n\n/**\n * Format a bare \"HH:mm\" / \"HH:mm:ss\" time string (no date component) as a\n * human-readable 12-hour time, e.g. \"14:30:00\" -> \"2:30 PM\".\n *\n * Owner-flagged cleanup (2026-09-20): call sites needing this used to build\n * a `new Date(\\`1970-01-01T${time}\\`)` just to borrow Date's own formatting\n * — a hardcoded, arbitrary epoch date standing in for a value that was\n * never actually a date. Pure string/number parsing instead — no Date\n * object, no dependency on the JS engine's date-string parsing behavior for\n * a value with no real date component at all.\n */\nexport function formatTimeString(time: string): string {\n const [hoursStr, minutesStr] = time.split(\":\");\n const hours = parseInt(hoursStr, 10);\n if (isNaN(hours) || minutesStr === undefined) return time;\n const period = hours >= 12 ? \"PM\" : \"AM\";\n const displayHours = hours % 12 || 12;\n return `${displayHours}:${minutesStr} ${period}`;\n}\n\n/**\n * Format a price amount with currency symbol and proper decimal places.\n * Uses Intl.NumberFormat for accurate currency formatting.\n *\n * REAL BUG FIXED (2026-09-20): a missing/omitted `currency` used to\n * silently default to \"USD\" — displaying a real price with a fabricated,\n * likely WRONG currency (most Kasuvia businesses price in NGN or another\n * non-USD currency) instead of flagging that the caller never passed the\n * real one. Confirmed this is the actual reachable `formatPrice` (exported\n * via utils/index.ts + src/index.ts) that ~26 call sites across\n * kasuvia-storefront call — most of them WITHOUT a currency argument at\n * all, meaning every one of those was silently mislabeling real prices as\n * USD. Prefer `useAppContext().formatPrice` in storefront components — it\n * reads the actual business currency from real config; this stateless\n * function should only be used where a real currency is already in hand.\n *\n * @param amount - The amount to format (null/undefined returns '')\n * @param currency - ISO 4217 currency code (e.g., USD, NGN, EUR). Required —\n * there is no default; a missing value returns an explicit \"N/A\" marker\n * rather than guessing.\n * @param locale - Locale string for formatting (default: en-US)\n * @returns Formatted currency string\n */\nexport function formatPrice(\n amount: number | null | undefined,\n currency: string | null | undefined,\n locale: string = \"en-US\",\n): string {\n if (amount == null || isNaN(amount)) return \"\";\n if (!currency) return `N/A ${amount.toLocaleString()}`;\n const code = currency.toUpperCase();\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: code,\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(amount);\n } catch {\n return `${code} ${amount.toLocaleString()}`;\n }\n}\n\n/**\n * Get the currency symbol for a given currency code.\n *\n * REAL BUG FIXED (2026-09-20): a missing `currency` used to silently\n * default to \"USD\" (same class of bug as formatPrice above) — required now,\n * no default.\n *\n * @param currency - ISO 4217 currency code\n * @param locale - Locale string (default: en-US)\n * @returns Currency symbol (e.g., $, ₦, €)\n */\nexport function getCurrencySymbol(currency: string, locale: string = \"en-US\"): string {\n const formatter = new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: currency,\n });\n const parts = formatter.formatToParts(0);\n const symbolPart = parts.find(part => part.type === \"currency\");\n return symbolPart?.value || currency;\n}\n\n/**\n * Format a price in compact notation (e.g., $1M, ₦250K).\n *\n * REAL BUG FIXED (2026-09-20): a missing `currency` used to silently\n * default to \"USD\" (same class of bug as formatPrice above) — required now,\n * no default; a missing value returns an explicit \"N/A\" marker.\n *\n * @param amount - The amount to format\n * @param currency - ISO 4217 currency code (e.g., USD, NGN, EUR)\n * @param locale - Locale string for formatting (default: en-US)\n * @returns Formatted compact currency string\n */\nexport function formatCompactPrice(\n amount: number,\n currency: string | null | undefined,\n locale: string = \"en-US\",\n): string {\n if (!currency) return `N/A ${formatNumber(amount, { style: \"compact\", decimals: 0 })}`;\n const symbol = getCurrencySymbol(currency, locale);\n const compactStr = formatNumber(amount, { style: \"compact\", decimals: 0 });\n return `${symbol}${compactStr}`;\n}\n","/**\n * React Query hooks for Reviews and Comments\n */\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport * as ReviewService from '../services/review.service'\nimport type { SdkConfig } from '../config'\nimport type {\n ReviewCreate, ReviewUpdate, CommentCreate, CommentUpdate,\n MerchantReplyCreate, ReviewModerationAction, CommentModerationAction\n} from '../types/reviews'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\n\n/**\n * Hook to create a new review\n */\nexport function useCreateReview(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (reviewData: ReviewCreate) => ReviewService.createReview(reviewData, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['product-reviews'] })\n },\n })\n}\n\n/**\n * Hook to update an existing review\n */\nexport function useUpdateReview(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: ({ reviewId, reviewData }: { reviewId: string; reviewData: ReviewUpdate }) =>\n ReviewService.updateReview(reviewId, reviewData, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['product-reviews'] })\n },\n })\n}\n\n/**\n * Hook to get product reviews\n */\nexport function useProductReviews(productId: string, params?: { page?: number; page_size?: number }, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['product-reviews', productId, params],\n queryFn: () => ReviewService.getProductReviews(productId, params, cfg),\n enabled: !!productId,\n })\n}\n\n/**\n * Hook to create a new comment\n */\nexport function useCreateComment(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: (commentData: CommentCreate) => ReviewService.createComment(commentData, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['product-comments'] })\n },\n })\n}\n\n/**\n * Hook to update an existing comment\n */\nexport function useUpdateComment(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: ({ commentId, commentData }: { commentId: string; commentData: CommentUpdate }) =>\n ReviewService.updateComment(commentId, commentData, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['product-comments'] })\n },\n })\n}\n\n/**\n * Hook to get product comments\n */\nexport function useProductComments(productId: string, params?: { page?: number; page_size?: number }, config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['product-comments', productId, params],\n queryFn: () => ReviewService.getProductComments(productId, params, cfg),\n enabled: !!productId,\n })\n}\n\n/**\n * Hook to get pending reviews (merchant/staff only)\n */\nexport function usePendingReviews(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['pending-reviews'],\n queryFn: () => ReviewService.getPendingReviews(cfg),\n refetchInterval: 30000,\n })\n}\n\n/**\n * Hook to get pending comments (merchant/staff only)\n */\nexport function usePendingComments(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['pending-comments'],\n queryFn: () => ReviewService.getPendingComments(cfg),\n refetchInterval: 30000,\n })\n}\n\n/**\n * Hook to moderate a review (merchant/staff only)\n */\nexport function useModerateReview(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: ({ reviewId, action }: { reviewId: string; action: ReviewModerationAction }) =>\n ReviewService.moderateReview(reviewId, action, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['pending-reviews'] })\n queryClient.invalidateQueries({ queryKey: ['product-reviews'] })\n },\n })\n}\n\n/**\n * Hook to moderate a comment (merchant/staff only)\n */\nexport function useModerateComment(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: ({ commentId, action }: { commentId: string; action: CommentModerationAction }) =>\n ReviewService.moderateComment(commentId, action, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['pending-comments'] })\n queryClient.invalidateQueries({ queryKey: ['product-comments'] })\n },\n })\n}\n\n/**\n * Hook to post a merchant reply to a review (merchant/staff only)\n */\nexport function useMerchantReplyToReview(config?: SdkConfig) {\n const ctx = useSdkContext()\n const queryClient = useQueryClient()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useMutation({\n mutationFn: ({ reviewId, replyData }: { reviewId: string; replyData: MerchantReplyCreate }) =>\n ReviewService.merchantReplyToReview(reviewId, replyData, cfg),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['product-reviews'] })\n },\n })\n}","/**\n * Review and Comment Service\n *\n * Handles review and comment operations using REST API.\n * Stateless - all configuration passed as parameters.\n *\n * REAL BUG FIXED (2026-09-21): every URL here hardcoded a literal `/api/v1`\n * prefix AND used a completely different path shape than the real\n * kasuvia-crm-go backend (`kasuvia-crm-go/internal/api/v1/endpoints/\n * reviews.go` + `admin_reviews.go`) — e.g. `POST /api/v1/reviews/comments`\n * vs the real `POST /api/v1/comments`, `GET /api/v1/reviews/products/{id}`\n * vs the real `GET /api/v1/products/{id}/reviews`. Every function 404'd.\n * `config.backendUrls.crm` already includes `/api/v1` (same convention as\n * every other backendUrls.* entry — see payment.service.ts/order.service.ts)\n * so the hardcoded prefix also risked doubling to `/api/v1/api/v1/...` once\n * KASUVIA_CRM_URL was actually set.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n Review, Comment, ReviewCreate, ReviewUpdate, CommentCreate, CommentUpdate,\n MerchantReplyCreate, ReviewModerationAction, CommentModerationAction,\n ProductReviewsResponse, ProductCommentsResponse\n} from '../types/reviews'\nimport { apiRequest, JSON_HEADERS, type ApiRequestOptions } from '../utils/http-client'\n\nexport type {\n Review, Comment, ReviewCreate, ReviewUpdate, CommentCreate, CommentUpdate,\n MerchantReplyCreate, ReviewModerationAction, CommentModerationAction,\n ProductReviewsResponse, ProductCommentsResponse\n}\n\n/**\n * This service takes its identity from `config.authToken`/`config.\n * storefrontApiKey`/`config.businessId` directly (unlike every other SDK\n * service, which takes an explicit `accessToken` parameter) - preserved as-\n * is here since callers (use-reviews.ts) already depend on this exact\n * calling convention; only the underlying transport moved onto the shared\n * client.\n */\nfunction fetchWithConfig<T>(url: string, config: SdkConfig, options: ApiRequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {\n ...JSON_HEADERS,\n Accept: 'application/json',\n ...(options.headers as Record<string, string> | undefined),\n }\n if (config.storefrontApiKey) headers['X-Storefront-Key'] = config.storefrontApiKey\n if (config.businessId) headers['X-Business-ID'] = config.businessId\n if (config.authToken) headers['Authorization'] = `Bearer ${config.authToken}`\n\n return apiRequest<T>(url, { ...options, headers, fallbackErrorMessage: options.fallbackErrorMessage ?? 'Request failed' })\n}\n\n/**\n * Create a new review\n */\nexport async function createReview(\n reviewData: ReviewCreate,\n config: SdkConfig\n): Promise<Review> {\n const url = `${config.backendUrls.crm}/reviews`\n return fetchWithConfig<Review>(url, config, {\n method: 'POST',\n body: JSON.stringify(reviewData),\n fallbackErrorMessage: 'Failed to create review',\n })\n}\n\n/**\n * Update an existing review\n */\nexport async function updateReview(\n reviewId: string,\n reviewData: ReviewUpdate,\n config: SdkConfig\n): Promise<Review> {\n const url = `${config.backendUrls.crm}/reviews/${reviewId}`\n return fetchWithConfig<Review>(url, config, {\n method: 'PUT',\n body: JSON.stringify(reviewData),\n fallbackErrorMessage: 'Failed to update review',\n })\n}\n\n/**\n * Get paginated reviews for a product\n */\nexport async function getProductReviews(\n productId: string,\n params: { page?: number; page_size?: number; moderation_status?: string } = {},\n config: SdkConfig\n): Promise<ProductReviewsResponse> {\n const queryParams = new URLSearchParams()\n if (params.page) queryParams.append('page', params.page.toString())\n if (params.page_size) queryParams.append('page_size', params.page_size.toString())\n if (params.moderation_status) queryParams.append('moderation_status', params.moderation_status)\n\n const url = `${config.backendUrls.crm}/products/${productId}/reviews?${queryParams.toString()}`\n return fetchWithConfig<ProductReviewsResponse>(url, config, { fallbackErrorMessage: 'Failed to fetch product reviews' })\n}\n\n/**\n * Create a new comment\n */\nexport async function createComment(\n commentData: CommentCreate,\n config: SdkConfig\n): Promise<Comment> {\n const url = `${config.backendUrls.crm}/comments`\n return fetchWithConfig<Comment>(url, config, {\n method: 'POST',\n body: JSON.stringify(commentData),\n fallbackErrorMessage: 'Failed to create comment',\n })\n}\n\n/**\n * Update an existing comment\n */\nexport async function updateComment(\n commentId: string,\n commentData: CommentUpdate,\n config: SdkConfig\n): Promise<Comment> {\n const url = `${config.backendUrls.crm}/comments/${commentId}`\n return fetchWithConfig<Comment>(url, config, {\n method: 'PUT',\n body: JSON.stringify(commentData),\n fallbackErrorMessage: 'Failed to update comment',\n })\n}\n\n/**\n * Get paginated comments for a product\n */\nexport async function getProductComments(\n productId: string,\n params: { page?: number; page_size?: number; moderation_status?: string } = {},\n config: SdkConfig\n): Promise<ProductCommentsResponse> {\n const queryParams = new URLSearchParams()\n if (params.page) queryParams.append('page', params.page.toString())\n if (params.page_size) queryParams.append('page_size', params.page_size.toString())\n if (params.moderation_status) queryParams.append('moderation_status', params.moderation_status)\n\n const url = `${config.backendUrls.crm}/products/${productId}/comments?${queryParams.toString()}`\n return fetchWithConfig<ProductCommentsResponse>(url, config, { fallbackErrorMessage: 'Failed to fetch product comments' })\n}\n\n/**\n * Get pending reviews for moderation (merchant/staff only)\n */\nexport async function getPendingReviews(config: SdkConfig): Promise<Review[]> {\n const url = `${config.backendUrls.crm}/admin/reviews/pending`\n return fetchWithConfig<Review[]>(url, config, { fallbackErrorMessage: 'Failed to fetch pending reviews' })\n}\n\n/**\n * Get pending comments for moderation (merchant/staff only)\n */\nexport async function getPendingComments(config: SdkConfig): Promise<Comment[]> {\n const url = `${config.backendUrls.crm}/admin/comments/pending`\n return fetchWithConfig<Comment[]>(url, config, { fallbackErrorMessage: 'Failed to fetch pending comments' })\n}\n\n/**\n * Moderate a review (approve/reject) - merchant/staff only\n */\nexport async function moderateReview(\n reviewId: string,\n action: ReviewModerationAction,\n config: SdkConfig\n): Promise<Review> {\n const url = `${config.backendUrls.crm}/admin/reviews/${reviewId}/moderate`\n return fetchWithConfig<Review>(url, config, {\n method: 'POST',\n body: JSON.stringify(action),\n fallbackErrorMessage: 'Failed to moderate review',\n })\n}\n\n/**\n * Moderate a comment (approve/reject) - merchant/staff only\n */\nexport async function moderateComment(\n commentId: string,\n action: CommentModerationAction,\n config: SdkConfig\n): Promise<Comment> {\n const url = `${config.backendUrls.crm}/admin/comments/${commentId}/moderate`\n return fetchWithConfig<Comment>(url, config, {\n method: 'POST',\n body: JSON.stringify(action),\n fallbackErrorMessage: 'Failed to moderate comment',\n })\n}\n\n/**\n * Post a merchant reply to a review - merchant/staff only\n */\nexport async function merchantReplyToReview(\n reviewId: string,\n replyData: MerchantReplyCreate,\n config: SdkConfig\n): Promise<Review> {\n const url = `${config.backendUrls.crm}/admin/reviews/${reviewId}/reply`\n return fetchWithConfig<Review>(url, config, {\n method: 'POST',\n body: JSON.stringify(replyData),\n fallbackErrorMessage: 'Failed to post merchant reply',\n })\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 {\n createDedicatedAccount,\n initiatePayment,\n verifyTransaction,\n getTransactionStatus,\n getAvailablePaymentMethods,\n getWalletBalance,\n getWalletLedger,\n claimWalletCredit,\n} from \"../services/payment.service\";\nimport type { SdkConfig } from \"../config\";\nimport type { DVACreateRequest, PaymentInitiateRequest } from \"../types/payments\";\nimport { useSdkContext, resolveHookArgs } from \"../context/sdk-context\";\n\n/**\n * Hook for fetching available payment methods for a region.\n *\n * `currency`/`countryCode` are optional with no SDK-level default — see\n * getAvailablePaymentMethods' doc comment: the real backend already\n * declares its own default for this route, so leaving them unset here\n * lets that be the single source of truth instead of risking a second,\n * independently-hardcoded copy drifting out of sync with it.\n */\nexport function useAvailablePaymentMethods(\n config?: SdkConfig,\n currency?: string,\n countryCode?: string\n) {\n const ctx = useSdkContext();\n const { config: cfg } = resolveHookArgs(config, undefined, ctx);\n return useQuery({\n queryKey: ['payment', 'available-methods', currency, countryCode],\n queryFn: () => getAvailablePaymentMethods(cfg, currency, countryCode),\n });\n}\n\n/**\n * Hook for fetching authenticated customer's wallet balance.\n */\nexport function useWalletBalance(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext();\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n return useQuery({\n queryKey: ['wallet', 'balance', token],\n queryFn: () => token ? getWalletBalance(cfg, token) : Promise.reject(new Error('No access token available')),\n enabled: !!token,\n });\n}\n\n/**\n * Hook for fetching authenticated customer's wallet ledger history.\n */\nexport function useWalletLedger(\n config?: SdkConfig,\n accessToken?: string | null,\n params?: { page?: number; page_size?: number }\n) {\n const ctx = useSdkContext();\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n const page = params?.page ?? 1;\n const pageSize = params?.page_size ?? 20;\n\n return useQuery({\n queryKey: ['wallet', 'ledger', token, page, pageSize],\n queryFn: () => token ? getWalletLedger(cfg, token, { page, page_size: pageSize }) : Promise.reject(new Error('No access token available')),\n enabled: !!token,\n });\n}\n\n/**\n * Hook for claiming pending guest wallet credit into customer's wallet.\n */\nexport function useClaimWalletCredit(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext();\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (claimToken: string) =>\n token ? claimWalletCredit(cfg, token, claimToken) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['wallet'] });\n },\n });\n}\n\n/**\n * Hook for creating a Dedicated Virtual Account (DVA)\n * Supports both authenticated users and guest checkout.\n */\nexport function useCreateDVA(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext();\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (request: DVACreateRequest) => createDedicatedAccount(cfg, token, request),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['payment'] });\n },\n });\n}\n\n/**\n * Hook for initiating payment (card, transfer, etc.)\n * Supports both authenticated users and guest checkout.\n */\nexport function useInitiatePayment(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext();\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx);\n return useMutation({\n mutationFn: (request: PaymentInitiateRequest) => initiatePayment(cfg, token, request),\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 const { config: cfg } = resolveHookArgs(config, undefined, ctx);\n return useMutation({\n mutationFn: (reference: string) => verifyTransaction(cfg, reference),\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 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}\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 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}\n","/**\n * Payment Service\n *\n * Customer-facing payment API for payment initiation and verification via\n * kasuvia-payment-system-go.\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n DVACreateRequest,\n DVADetails,\n GatewayMethods,\n PaymentInitiateRequest,\n PaymentInitiateResponse,\n TransactionVerifyResponse,\n WalletBalanceResponse,\n WalletLedgerResponse,\n} from '../types/payments/index'\nimport { apiRequest, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\n\nfunction isValidUUID(str: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str)\n}\n\n/**\n * Fetch available payment methods and gateways for a storefront region.\n *\n * REAL BUG FIXED (2026-09-22): `currency`/`countryCode` used to default to\n * 'NGN'/'NG' as SDK-level JS defaults — an independent copy of a value the\n * real backend already declares itself (`query:\"currency\" default:\"NGN\"` /\n * `query:\"country_code\" default:\"NG\"`, kasuvia-payment-system-go's own real,\n * documented default for this route). Duplicating it client-side risks the\n * two silently drifting apart if the backend's real default is ever\n * changed. Now optional with no client-side default at all — when omitted,\n * the query param is left out entirely and the backend's own declared\n * default applies, the single source of truth for what \"unspecified\"\n * means here.\n */\nexport async function getAvailablePaymentMethods(\n config: SdkConfig,\n currency?: string,\n countryCode?: string\n): Promise<GatewayMethods[]> {\n const params: Record<string, string> = {}\n if (currency) params.currency = currency\n if (countryCode) params.country_code = countryCode\n const query = new URLSearchParams(params).toString()\n return apiRequest<GatewayMethods[]>(`${config.backendUrls.payment}/payments/storefront/methods${query ? `?${query}` : ''}`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to fetch available payment methods',\n })\n}\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 | null | undefined,\n request: DVACreateRequest\n): Promise<DVADetails> {\n const origin = request.storefront_origin || (typeof window !== 'undefined' ? window.location.origin : '');\n\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`\n }\n if (origin) {\n headers[\"Origin\"] = origin\n }\n\n return apiRequest<DVADetails>(`${config.backendUrls.payment}/payments/storefront/dedicated-account`, {\n method: 'POST',\n headers,\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 gateway: request.gateway,\n idempotency_key: request.idempotency_key,\n }),\n fallbackErrorMessage: 'Failed to create dedicated account',\n })\n}\n\n/**\n * Initiate a payment (customer → business owner).\n * Routes to Monnify, Flutterwave, or Paystack on the backend based on region/selection.\n * Returns a checkout_url to redirect the customer to the gateway.\n */\nexport async function initiatePayment(\n config: SdkConfig,\n accessToken: string | null | undefined,\n request: PaymentInitiateRequest\n): Promise<PaymentInitiateResponse> {\n const validOrderId = request.order_id && isValidUUID(request.order_id) ? request.order_id : undefined;\n const origin = request.storefront_origin || (typeof window !== 'undefined' ? window.location.origin : '');\n\n const headers: Record<string, string> = { ...JSON_HEADERS, ...storefrontHeaders(config) }\n if (accessToken) {\n headers[\"Authorization\"] = `Bearer ${accessToken}`\n }\n if (origin) {\n headers[\"Origin\"] = origin\n }\n\n const data = await apiRequest<PaymentInitiateResponse & { metadata_json?: { checkout_url?: string } }>(\n `${config.backendUrls.payment}/payments/storefront/initiate`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify({\n amount: request.amount,\n currency: request.currency,\n // Same real backend default as getAvailablePaymentMethods above\n // (huma's own `default:\"NG\"` on this field) — omit rather than\n // hardcode a client-side copy of it.\n country_code: request.country_code,\n gateway: request.gateway,\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 fallbackErrorMessage: 'Failed to initiate payment',\n }\n )\n\n return {\n id: data.id,\n gateway_ref: data.gateway_ref,\n gateway: data.gateway,\n status: data.status,\n checkout_url: data.metadata_json?.checkout_url ?? '',\n }\n}\n\n/**\n * Verify a payment after the gateway redirects back to /checkout/verify.\n */\nexport async function verifyTransaction(\n config: SdkConfig,\n reference: string\n): Promise<TransactionVerifyResponse> {\n return apiRequest<TransactionVerifyResponse>(`${config.backendUrls.payment}/payments/verify/${reference}`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n fallbackErrorMessage: 'Failed to verify transaction',\n })\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 return apiRequest<TransactionVerifyResponse>(`${config.backendUrls.payment}/payments/transactions/${transactionId}`, {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to get transaction status',\n })\n}\n\n/**\n * Fetch authenticated customer's wallet balance.\n */\nexport async function getWalletBalance(\n config: SdkConfig,\n accessToken: string\n): Promise<WalletBalanceResponse> {\n return apiRequest<WalletBalanceResponse>(`${config.backendUrls.payment}/wallet/balance`, {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to fetch wallet balance',\n })\n}\n\n/**\n * Fetch authenticated customer's wallet ledger (transaction history).\n */\nexport async function getWalletLedger(\n config: SdkConfig,\n accessToken: string,\n params?: { page?: number; page_size?: number }\n): Promise<WalletLedgerResponse> {\n const page = params?.page ?? 1\n const pageSize = params?.page_size ?? 20\n return apiRequest<WalletLedgerResponse>(\n `${config.backendUrls.payment}/wallet/ledger?page=${page}&page_size=${pageSize}`,\n {\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to fetch wallet ledger',\n }\n )\n}\n\n/**\n * Claim a pending guest wallet credit into the authenticated customer's wallet.\n */\nexport async function claimWalletCredit(\n config: SdkConfig,\n accessToken: string,\n claimToken: string\n): Promise<WalletBalanceResponse> {\n return apiRequest<WalletBalanceResponse>(`${config.backendUrls.payment}/wallet/claim`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify({ claim_token: claimToken }),\n fallbackErrorMessage: 'Failed to claim wallet credit',\n })\n}\n\nexport const paymentService = {\n getAvailablePaymentMethods,\n createDedicatedAccount,\n initiatePayment,\n verifyTransaction,\n getTransactionStatus,\n getWalletBalance,\n getWalletLedger,\n claimWalletCredit,\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 *\n * REAL BUG FIXED (2026-09-21): every hook here called the service functions\n * with only a BID, but kasuvia-cms's SDK routes require the business's\n * internal UUID (see cms.service.ts's header comment) — resolved here via\n * `useBusinessConfig()`. Also fixed `.entries`/`.total` → the real\n * `.results`/`.count`/`.total_pages` response shape.\n *\n * REAL BUG FIXED (2026-09-22): every one of these five hooks wrapped\n * useQuery/useMutation/useBusinessConfig in a try/catch that caught real\n * setup failures (no SdkProvider/QueryClientProvider) and returned a\n * fabricated \"successful, empty\" result instead (`entries: [], error:\n * null`) — indistinguishable from \"this CMS model genuinely has zero\n * entries.\" Conditionally calling hooks inside a try block also risks\n * breaking React's Rules of Hooks if the block throws partway through (the\n * hook call count would differ between renders). No other hook in this SDK\n * does this; removed to match.\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 { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport { useBusinessConfig } from './use-business-config'\n\nexport interface UseCmsEntriesReturn {\n entries: CmsEntry[]\n total: number\n page: number\n page_size: number\n total_pages: 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 const businessConfig = useBusinessConfig(cfg)\n const businessUuid = businessConfig.data?.business_id\n\n const query = useQuery({\n queryKey: ['cms-entries', slug, params],\n queryFn: () => listCmsEntries(cfg, businessUuid as string, slug, params),\n enabled: !!slug && !!businessUuid,\n })\n\n return {\n entries: query.data?.results || [],\n total: query.data?.count || 0,\n page: query.data?.page || 1,\n page_size: query.data?.page_size || 50,\n total_pages: query.data?.total_pages || 0,\n isLoading: query.isLoading || businessConfig.isLoading,\n error: (query.error || businessConfig.error) as Error | null,\n refetch: query.refetch,\n }\n}\n\nexport interface UseCmsEntryReturn {\n entry: CmsEntry | undefined\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\n/**\n * Hook to get a single CMS entry by ID.\n * 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 const businessConfig = useBusinessConfig(cfg)\n const businessUuid = businessConfig.data?.business_id\n\n const query = useQuery({\n queryKey: ['cms-entry', slug, entryId],\n queryFn: () => getCmsEntry(cfg, businessUuid as string, slug, entryId),\n enabled: !!slug && !!entryId && !!businessUuid,\n })\n\n return {\n entry: query.data,\n isLoading: query.isLoading || businessConfig.isLoading,\n error: (query.error || businessConfig.error) as Error | null,\n refetch: query.refetch,\n }\n}\n\nexport interface UseCreateCmsEntryReturn {\n createEntry: (params: CreateCmsEntryParams) => void\n isLoading: boolean\n error: Error | null\n}\n\nexport function useCreateCmsEntry(config?: SdkConfig, accessToken?: string | null, modelSlug?: string): UseCreateCmsEntryReturn {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const businessConfig = useBusinessConfig(cfg)\n const businessUuid = businessConfig.data?.business_id\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: (params: CreateCmsEntryParams) =>\n token && modelSlug && businessUuid ? createCmsEntry(cfg, businessUuid, token, modelSlug, params) : Promise.reject('No access token, modelSlug, or resolved business'),\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}\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 const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const businessConfig = useBusinessConfig(cfg)\n const businessUuid = businessConfig.data?.business_id\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: ({ entryId, params }: { entryId: string; params: UpdateCmsEntryParams }) =>\n token && modelSlug && businessUuid ? updateCmsEntry(cfg, businessUuid, token, modelSlug, entryId, params) : Promise.reject('No access token, modelSlug, or resolved business'),\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}\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 const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const businessConfig = useBusinessConfig(cfg)\n const businessUuid = businessConfig.data?.business_id\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: (entryId: string) =>\n token && modelSlug && businessUuid ? deleteCmsEntry(cfg, businessUuid, token, modelSlug, entryId) : Promise.reject('No access token, modelSlug, or resolved business'),\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}\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 *\n * REAL BUG FIXED (2026-09-21), live-reproduced: every URL here used\n * `config.businessId` (the public BID, e.g. \"B-2W9EC07\") as the\n * `{business_id}` path segment. kasuvia-cms's SDK routes\n * (`app/core/security/base.py`'s `get_storefront_business_uuid`, used by\n * every route in `cms_sdk.py`) explicitly require the INTERNAL UUID there —\n * \"CmsModel/CmsEntry documents are keyed by the UUID business_id... SDK\n * routes need this, not the BID\" (its own docstring) — and 403s with\n * \"Business ID mismatch\" on anything else. Every CMS entry call from the\n * storefront has been failing since the feature was built. Fixed by\n * requiring an explicit `businessUuid` parameter (resolved via\n * `getBusinessConfig`'s real `business_id` field, cached by\n * `useBusinessConfig()` at the hook layer) instead of silently reusing the\n * wrong config field.\n */\nimport type { SdkConfig } from '../config'\nimport type {\n CmsEntry,\n CmsEntryListResponse,\n CreateCmsEntryParams,\n UpdateCmsEntryParams,\n ListCmsEntriesParams,\n} from '../types/cms'\nimport { apiRequest, storefrontHeaders, authHeaders, JSON_HEADERS } from '../utils/http-client'\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 businessUuid: string,\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 return apiRequest<CmsEntryListResponse>(\n `${config.backendUrls.cms}/sdk/${businessUuid}/${modelSlug}/entries?${queryParams.toString()}`,\n {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to list CMS entries',\n }\n )\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 businessUuid: string,\n modelSlug: string,\n entryId: string\n): Promise<CmsEntry> {\n return apiRequest<CmsEntry>(\n `${config.backendUrls.cms}/sdk/${businessUuid}/${modelSlug}/entries/${entryId}`,\n {\n headers: storefrontHeaders(config),\n fallbackErrorMessage: 'Failed to get CMS entry',\n }\n )\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 businessUuid: string,\n accessToken: string,\n modelSlug: string,\n params: CreateCmsEntryParams\n): Promise<CmsEntry> {\n return apiRequest<CmsEntry>(\n `${config.backendUrls.cms}/sdk/${businessUuid}/${modelSlug}/entries`,\n {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(params),\n fallbackErrorMessage: 'Failed to create CMS entry',\n }\n )\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 businessUuid: string,\n accessToken: string,\n modelSlug: string,\n entryId: string,\n params: UpdateCmsEntryParams\n): Promise<CmsEntry> {\n return apiRequest<CmsEntry>(\n `${config.backendUrls.cms}/sdk/${businessUuid}/${modelSlug}/entries/${entryId}`,\n {\n method: 'PUT',\n headers: { ...JSON_HEADERS, ...authHeaders(config, accessToken) },\n body: JSON.stringify(params),\n fallbackErrorMessage: 'Failed to update CMS entry',\n }\n )\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 businessUuid: string,\n accessToken: string,\n modelSlug: string,\n entryId: string\n): Promise<void> {\n await apiRequest(\n `${config.backendUrls.cms}/sdk/${businessUuid}/${modelSlug}/entries/${entryId}`,\n {\n method: 'DELETE',\n headers: authHeaders(config, accessToken),\n fallbackErrorMessage: 'Failed to delete CMS entry',\n }\n )\n}\n","/**\n * Business Config Hook\n *\n * Resolves the business's internal UUID (and currency/branding fields) via\n * kasuvia-auth's internal business-detail endpoint. Several other backends\n * (kasuvia-cms's SDK routes, notably) key their data by this UUID rather\n * than the public BID a storefront's own config carries — this hook is the\n * shared, cached way to resolve it instead of every caller re-fetching.\n * Cached aggressively: a business's UUID never changes.\n */\nimport { useCallback } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { getBusinessConfig } from '../services/config.service'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport { formatPrice as formatPriceFn } from '../utils/format'\n\nexport function useBusinessConfig(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, undefined, ctx)\n return useQuery({\n queryKey: ['business-config', cfg.businessId],\n queryFn: () => getBusinessConfig(cfg),\n staleTime: Infinity,\n gcTime: Infinity,\n })\n}\n\n/**\n * REAL GAP FIXED (2026-09-22): `formatPrice(amount, currency)` is stateless\n * and requires the caller to already have the real business currency in\n * hand — every consuming app was left to resolve that currency itself, and\n * kasuvia-storefront's `AppProvider` ended up hand-rolling its own,\n * slightly different copy of the same `Intl.NumberFormat` currency logic\n * (silently falling back to a bare number instead of formatPrice's\n * explicit \"N/A\" marker when currency is unresolved). This hook is the one\n * real, complete answer: resolves the business's currency via\n * `useBusinessConfig` and returns a ready-to-call formatter, so no\n * consuming app ever needs to reimplement currency formatting again.\n */\nexport function useFormatPrice(config?: SdkConfig) {\n const { data: businessConfig } = useBusinessConfig(config)\n const currency = businessConfig?.currency ?? null\n\n const formatPrice = useCallback(\n (amount: number | null | undefined) => formatPriceFn(amount, currency),\n [currency]\n )\n\n return { formatPrice, currency }\n}\n","/**\n * Notification Preference Hooks\n *\n * React Query hooks for notification channel preferences — both the\n * caller's own self-service preferences (customer or business owner) and\n * the merchant-level channel policy (owner-only).\n * Stateless - requires config + accessToken.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n getNotificationPreferences,\n updateNotificationPreferences,\n sendContactEmail,\n sendContactConfirmation,\n getVapidPublicKey,\n subscribeToPush,\n unsubscribeFromPush,\n getNotificationInbox,\n markNotificationRead,\n markAllNotificationsRead,\n trackNotificationClick,\n type ContactFormData,\n type SubscribeToPushParams,\n} from '../services/notifications.service'\nimport type { NotificationPreferences } from '../types/auth'\nimport type { SdkConfig } from '../config'\nimport { useSdkContext, resolveHookArgs } from '../context/sdk-context'\nimport { logger } from '../utils/logger'\n\nexport function useNotificationPreferences(config?: SdkConfig, accessToken?: string) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken ?? null, ctx)\n return useQuery({\n queryKey: ['notification-preferences'],\n queryFn: () => getNotificationPreferences(cfg, token ?? ''),\n enabled: !!token,\n })\n}\n\nexport function useUpdateNotificationPreferences(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (payload: Partial<NotificationPreferences>) =>\n token ? updateNotificationPreferences(cfg, token, payload) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['notification-preferences'] })\n },\n })\n}\n\n// ── Push subscriptions ───────────────────────────────────────────────────\n\nexport function useVapidPublicKey(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, null, ctx)\n return useQuery({\n queryKey: ['vapid-public-key'],\n queryFn: () => getVapidPublicKey(cfg),\n staleTime: Infinity,\n })\n}\n\nexport function useSubscribeToPush(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useMutation({\n mutationFn: (params: SubscribeToPushParams) =>\n token ? subscribeToPush(cfg, token, params) : Promise.reject(new Error('Please sign in to enable push notifications.')),\n })\n}\n\nexport function useUnsubscribeFromPush(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useMutation({\n mutationFn: (endpoint: string) =>\n token ? unsubscribeFromPush(cfg, token, endpoint) : Promise.reject(new Error('No access token available')),\n })\n}\n\n// ── Notification inbox ──────────────────────────────────────────────────\n\nexport function useNotificationInbox(\n params?: { page?: number; limit?: number; unread_only?: boolean },\n config?: SdkConfig,\n accessToken?: string | null\n) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useQuery({\n queryKey: ['notification-inbox', token, params],\n queryFn: () => token ? getNotificationInbox(cfg, token, params) : Promise.reject(new Error('No access token available')),\n enabled: !!token,\n })\n}\n\nexport function useMarkNotificationRead(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (notificationId: string) =>\n token ? markNotificationRead(cfg, token, notificationId) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['notification-inbox'] })\n },\n })\n}\n\nexport function useMarkAllNotificationsRead(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: () =>\n token ? markAllNotificationsRead(cfg, token) : Promise.reject(new Error('No access token available')),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['notification-inbox'] })\n },\n })\n}\n\nexport function useTrackNotificationClick(config?: SdkConfig, accessToken?: string | null) {\n const ctx = useSdkContext()\n const { config: cfg, accessToken: token } = resolveHookArgs(config, accessToken, ctx)\n return useMutation({\n mutationFn: (notificationId: string) =>\n token ? trackNotificationClick(cfg, token, notificationId) : Promise.reject(new Error('No access token available')),\n })\n}\n\n/**\n * Submit contact form hook — sends contact email to merchant and confirmation to sender.\n */\nexport function useSubmitContactForm(config?: SdkConfig) {\n const ctx = useSdkContext()\n const { config: cfg } = resolveHookArgs(config, null, ctx)\n return useMutation({\n mutationFn: async (payload: ContactFormData) => {\n // REAL BUG FIXED (2026-09-22): defaulted a missing `source` to the\n // literal string 'kasuvia-storefront' — a specific app name hardcoded\n // into a package meant to be reused by other storefronts too. A\n // different consuming app that forgot to pass `source` would have its\n // contact-form submissions silently mislabeled as coming from an app\n // it isn't. The caller decides what `source` means; not passing one\n // is left as-is rather than guessed.\n const emailPayload = {\n ...payload,\n current_year: new Date().getFullYear(),\n }\n const res = await sendContactEmail(cfg, emailPayload)\n try {\n await sendContactConfirmation(cfg, emailPayload)\n } catch (confirmError) {\n logger.error('[useSubmitContactForm] Failed to send confirmation email:', confirmError)\n }\n return res\n },\n })\n}\n\n","/**\n * Notification Service\n *\n * Handles contact form submissions, email notifications, and notification\n * channel preferences (customer self-service + merchant-level policy).\n * Stateless - all configuration passed as parameters.\n */\nimport type { SdkConfig } from '../config'\nimport type { NotificationPreferences } from '../types/auth'\nimport { apiRequest, storefrontHeaders, JSON_HEADERS } from '../utils/http-client'\n\nexport interface ContactFormData {\n name: string\n email: string\n subject: string\n message: string\n source?: string\n company_name?: string\n current_year?: number\n}\n\nfunction bearerHeaders(accessToken: string): Record<string, string> {\n return { Authorization: `Bearer ${accessToken}` }\n}\n\n/**\n * Send contact email to Kasuvia team.\n * POST /contact/send-contact-email\n */\nexport async function sendContactEmail(\n config: SdkConfig,\n payload: ContactFormData\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.notifications}/contact/send-contact-email`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to send contact email',\n })\n}\n\n/**\n * Send confirmation email to user.\n * POST /contact/send-contact-confirmation\n */\nexport async function sendContactConfirmation(\n config: SdkConfig,\n payload: ContactFormData\n): Promise<{ detail: string }> {\n return apiRequest<{ detail: string }>(`${config.backendUrls.notifications}/contact/send-contact-confirmation`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...storefrontHeaders(config) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to send contact confirmation',\n })\n}\n\n/**\n * Get the caller's own notification preferences (customer or business\n * owner self-service — whoever's access token is passed).\n * GET /notifications/preferences/\n */\nexport async function getNotificationPreferences(\n config: SdkConfig,\n accessToken: string\n): Promise<NotificationPreferences> {\n return apiRequest<NotificationPreferences>(`${config.backendUrls.notifications}/notifications/preferences/`, {\n headers: bearerHeaders(accessToken),\n fallbackErrorMessage: 'Failed to fetch notification preferences',\n })\n}\n\n/**\n * Update the caller's own notification preferences.\n * PATCH /notifications/preferences/\n */\nexport async function updateNotificationPreferences(\n config: SdkConfig,\n accessToken: string,\n payload: Partial<NotificationPreferences>\n): Promise<NotificationPreferences> {\n return apiRequest<NotificationPreferences>(`${config.backendUrls.notifications}/notifications/preferences/`, {\n method: 'PATCH',\n headers: { ...JSON_HEADERS, ...bearerHeaders(accessToken) },\n body: JSON.stringify(payload),\n fallbackErrorMessage: 'Failed to update notification preferences',\n })\n}\n\n// ── Push subscriptions ───────────────────────────────────────────────────\n// REAL FEATURE WIRED (2026-09-21): kasuvia-notification-system-go's push.go\n// (VAPID key, subscribe/unsubscribe, device list) already works correctly\n// for both owner/staff and customer callers (role-branched server-side) but\n// had zero SDK coverage. Auth here is JWT-bearer-only (AuthMiddleware —\n// no X-Storefront-Key/X-Business-ID requirement), matching\n// getNotificationPreferences above.\n\nexport interface VapidPublicKeyResponse {\n public_key: string\n subject: string\n}\n\nexport interface PushSubscriptionKeys {\n p256dh: string\n auth: string\n}\n\nexport interface SubscribeToPushParams {\n subscription: {\n endpoint: string\n keys: PushSubscriptionKeys\n }\n user_agent: string\n}\n\nexport async function getVapidPublicKey(config: SdkConfig): Promise<VapidPublicKeyResponse> {\n return apiRequest<VapidPublicKeyResponse>(`${config.backendUrls.notifications}/push/vapid-public-key`, {\n fallbackErrorMessage: 'Failed to fetch VAPID public key',\n })\n}\n\nexport async function subscribeToPush(\n config: SdkConfig,\n accessToken: string,\n params: SubscribeToPushParams\n): Promise<{ status: string; subscription_id: string; vapid_key_version: number }> {\n return apiRequest(`${config.backendUrls.notifications}/push/subscribe`, {\n method: 'POST',\n headers: { ...JSON_HEADERS, ...bearerHeaders(accessToken) },\n body: JSON.stringify(params),\n fallbackErrorMessage: 'Failed to subscribe to push notifications',\n })\n}\n\nexport async function unsubscribeFromPush(\n config: SdkConfig,\n accessToken: string,\n endpoint: string\n): Promise<{ status: string }> {\n return apiRequest(`${config.backendUrls.notifications}/push/subscribe`, {\n method: 'DELETE',\n headers: { ...JSON_HEADERS, ...bearerHeaders(accessToken) },\n body: JSON.stringify({ endpoint }),\n fallbackErrorMessage: 'Failed to unsubscribe from push notifications',\n })\n}\n\n// ── Notification inbox ──────────────────────────────────────────────────\n// REAL FEATURE WIRED (2026-09-21): kasuvia-notification-system-go's\n// notification_inbox.go (list/mark-read/mark-all-read/click) — fixed\n// alongside this to actually work for a customer caller (see that file's\n// own doc comments: it used to always query/check by user_id, which a\n// customer-facing notification never has set).\n\nexport type NotificationPriority = 'urgent' | 'normal' | 'low'\n\nexport interface NotificationInboxItem {\n id: string\n title: string\n body: string\n icon_url?: string | null\n image_url?: string | null\n priority: NotificationPriority\n action_type?: string | null\n action_url?: string | null\n entity_id?: string | null\n entity_type?: string | null\n category: string\n source_event_type: string\n read: boolean\n read_at?: string | null\n clicked: boolean\n clicked_at?: string | null\n action_performed: boolean\n created_at: string\n expires_at?: string | null\n}\n\nexport interface NotificationInboxResponse {\n results: NotificationInboxItem[]\n count: number\n page: number\n page_size: number\n total_pages: number\n}\n\nexport async function getNotificationInbox(\n config: SdkConfig,\n accessToken: string,\n params?: { page?: number; limit?: number; unread_only?: boolean }\n): Promise<NotificationInboxResponse> {\n const query = new URLSearchParams()\n if (params?.page) query.set('page', String(params.page))\n if (params?.limit) query.set('limit', String(params.limit))\n if (params?.unread_only) query.set('unread_only', 'true')\n return apiRequest<NotificationInboxResponse>(`${config.backendUrls.notifications}/notifications?${query.toString()}`, {\n headers: bearerHeaders(accessToken),\n fallbackErrorMessage: 'Failed to fetch notifications',\n })\n}\n\nexport async function markNotificationRead(\n config: SdkConfig,\n accessToken: string,\n notificationId: string\n): Promise<{ status: string }> {\n return apiRequest(`${config.backendUrls.notifications}/notifications/${notificationId}/read`, {\n method: 'POST',\n headers: bearerHeaders(accessToken),\n fallbackErrorMessage: 'Failed to mark notification as read',\n })\n}\n\nexport async function markAllNotificationsRead(\n config: SdkConfig,\n accessToken: string\n): Promise<{ status: string }> {\n return apiRequest(`${config.backendUrls.notifications}/notifications/mark-all-read`, {\n method: 'POST',\n headers: bearerHeaders(accessToken),\n fallbackErrorMessage: 'Failed to mark all notifications as read',\n })\n}\n\nexport async function trackNotificationClick(\n config: SdkConfig,\n accessToken: string,\n notificationId: string\n): Promise<{ status: string }> {\n return apiRequest(`${config.backendUrls.notifications}/notifications/${notificationId}/click`, {\n method: 'POST',\n headers: bearerHeaders(accessToken),\n fallbackErrorMessage: 'Failed to track notification click',\n })\n}\n\nexport const notificationsService = {\n sendContactEmail,\n sendContactConfirmation,\n getNotificationPreferences,\n updateNotificationPreferences,\n getVapidPublicKey,\n subscribeToPush,\n unsubscribeFromPush,\n getNotificationInbox,\n markNotificationRead,\n markAllNotificationsRead,\n trackNotificationClick,\n} as const\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 NotificationStreamMessage {\n type: string;\n title?: string;\n body?: string;\n data?: Record<string, unknown>;\n timestamp?: string;\n}\n\nexport interface UseNotificationStreamOptions {\n config?: SdkConfig;\n accessToken?: string | null;\n onNotification?: (message: NotificationStreamMessage) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Live connection to the authenticated customer's real-time notification\n * stream (kasuvia-notification-system-go's /notifications/sse — now\n * Authorization-header-gated, see realtime.go's 2026-09-21 fix). Mirrors\n * use-order-stream.ts's proven fetch-event-source pattern exactly.\n */\nexport function useNotificationStream({\n config: explicitConfig,\n accessToken: explicitToken,\n onNotification,\n onError,\n}: UseNotificationStreamOptions) {\n const ctx = useSdkContext();\n const config = explicitConfig ?? ctx?.config;\n const accessToken = explicitToken !== undefined ? explicitToken : (ctx?.accessToken ?? null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!accessToken || !config) {\n return;\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n const streamUrl = `${config.backendUrls.notifications}/notifications/sse`;\n\n fetchEventSource(streamUrl, {\n method: 'GET',\n headers: { Authorization: `Bearer ${accessToken}` },\n signal: abortController.signal,\n openWhenHidden: true,\n onopen: async (response) => {\n if (response.ok) {\n logger.log('[NotificationStream] Connection established');\n return;\n }\n throw new Error(`Unexpected response: ${response.status}`);\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n if (!event.data || event.data.trim() === '') return;\n const data = JSON.parse(event.data) as NotificationStreamMessage;\n if (data.type === 'connected') return; // handshake frame, not a real notification\n logger.log('[NotificationStream] Received:', data);\n onNotification?.(data);\n } catch (error) {\n logger.error('[NotificationStream] Error parsing event:', error);\n }\n },\n onerror: (error: Error) => {\n if (abortController.signal.aborted) return;\n logger.error('[NotificationStream] Connection error:', error);\n onError?.(error);\n },\n }).catch((error) => {\n if (abortController.signal.aborted || error.name === 'AbortError') return;\n logger.error('[NotificationStream] fetchEventSource failed:', error);\n });\n\n return () => {\n abortController.abort();\n };\n }, [accessToken, config, onNotification, onError]);\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { useVapidPublicKey, useSubscribeToPush, useUnsubscribeFromPush } from './use-notifications';\nimport type { SdkConfig } from '../config';\nimport { logger } from '../utils/logger';\n\n/**\n * Converts a base64url VAPID public key (as the backend returns it) into\n * the raw Uint8Array PushManager.subscribe's applicationServerKey expects —\n * the standard, well-known conversion every Web Push integration needs.\n */\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; i++) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nexport type PushPermissionState = 'unsupported' | 'default' | 'granted' | 'denied';\n\n/**\n * Orchestrates the full Web Push subscribe/unsubscribe flow: registers\n * /sw.js (the storefront app's own service worker — see its doc comment),\n * requests Notification permission, subscribes via PushManager with the\n * real VAPID key from the backend, and POSTs the subscription to\n * kasuvia-notification-system-go. Returns current state + trigger functions\n * — no UI of its own, so any storefront can build its own \"enable\n * notifications\" affordance around it.\n */\nexport function usePushNotifications(config?: SdkConfig, accessToken?: string | null) {\n const [permission, setPermission] = useState<PushPermissionState>('default');\n const [isSubscribed, setIsSubscribed] = useState(false);\n const [isBusy, setIsBusy] = useState(false);\n\n const { data: vapid } = useVapidPublicKey(config);\n const subscribeMutation = useSubscribeToPush(config, accessToken);\n const unsubscribeMutation = useUnsubscribeFromPush(config, accessToken);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !('Notification' in window) || !('serviceWorker' in navigator) || !('PushManager' in window)) {\n setPermission('unsupported');\n return;\n }\n setPermission(Notification.permission as PushPermissionState);\n\n navigator.serviceWorker.getRegistration('/sw.js').then(async (reg) => {\n if (!reg) return;\n const sub = await reg.pushManager.getSubscription();\n setIsSubscribed(!!sub);\n }).catch(() => {\n // No registration yet — not subscribed.\n });\n }, []);\n\n const subscribe = useCallback(async () => {\n if (permission === 'unsupported') {\n throw new Error('Push notifications are not supported in this browser.');\n }\n if (!vapid?.public_key) {\n throw new Error('Notification service is not ready yet. Please try again in a moment.');\n }\n setIsBusy(true);\n try {\n const perm = await Notification.requestPermission();\n setPermission(perm as PushPermissionState);\n if (perm !== 'granted') {\n throw new Error('Notification permission was not granted.');\n }\n\n const registration = await navigator.serviceWorker.register('/sw.js');\n await navigator.serviceWorker.ready;\n\n const existing = await registration.pushManager.getSubscription();\n const pushSubscription = existing ?? await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapid.public_key),\n });\n\n const json = pushSubscription.toJSON();\n if (!json.endpoint || !json.keys?.p256dh || !json.keys?.auth) {\n throw new Error('Browser returned an incomplete push subscription.');\n }\n\n await subscribeMutation.mutateAsync({\n subscription: {\n endpoint: json.endpoint,\n keys: { p256dh: json.keys.p256dh, auth: json.keys.auth },\n },\n user_agent: navigator.userAgent,\n });\n\n setIsSubscribed(true);\n } finally {\n setIsBusy(false);\n }\n }, [permission, vapid, subscribeMutation]);\n\n const unsubscribe = useCallback(async () => {\n setIsBusy(true);\n try {\n const registration = await navigator.serviceWorker.getRegistration('/sw.js');\n const sub = await registration?.pushManager.getSubscription();\n if (sub) {\n await unsubscribeMutation.mutateAsync(sub.endpoint);\n await sub.unsubscribe();\n }\n setIsSubscribed(false);\n } catch (error) {\n logger.error('[usePushNotifications] Failed to unsubscribe:', error);\n throw error;\n } finally {\n setIsBusy(false);\n }\n }, [unsubscribeMutation]);\n\n return { permission, isSubscribed, isBusy, subscribe, unsubscribe };\n}\n","/**\n * Media Upload Hook\n *\n * Wraps media.service.ts's uploadMediaFile/uploadMediaFiles (the real\n * presign → PUT → confirm sequence) as a React Query mutation. No SdkConfig\n * or access token is needed here — the two proxy routes it calls read the\n * customer's session cookie server-side.\n */\nimport { useMutation } from '@tanstack/react-query'\nimport { uploadMediaFile, uploadMediaFiles, type UploadMediaFileParams } from '../services/media.service'\n\nexport function useUploadMediaFile() {\n return useMutation({\n mutationFn: (params: UploadMediaFileParams) => uploadMediaFile(params),\n })\n}\n\nexport function useUploadMediaFiles() {\n return useMutation({\n mutationFn: ({ files, ...params }: Omit<UploadMediaFileParams, 'file'> & { files: File[] }) =>\n uploadMediaFiles(files, params),\n })\n}\n","/**\n * Media Upload Service\n *\n * The real 3-step direct-to-R2 upload orchestration (presigned URL → PUT →\n * confirm) that a browser client actually needs to run. Distinct from\n * `auth.service.ts`'s `getPresignedUploadUrl`/`confirmMediaUpload`, which\n * take an explicit bearer `accessToken` and are meant for server-side use\n * (Next.js Route Handlers reading a customer's httpOnly cookie) — a \"use\n * client\" component has no access token value in JS at all in that model,\n * only the cookie, so it calls two thin same-origin proxy routes instead\n * (`credentials: 'include'`) that wrap those same two SDK functions\n * server-side.\n *\n * REAL DUPLICATION FIXED (2026-09-22): this exact 3-step sequence had been\n * hand-written independently in two different kasuvia-storefront components\n * (BespokeStep.tsx, ProductReviews.tsx) — identical logic, copy-pasted, with\n * no shared SDK function to reuse. A second storefront project would have\n * had to write it a third time. The two endpoint paths are parameterized\n * (defaulting to the same `/api/auth/media/*` convention this storefront\n * already uses) precisely so a *different* storefront that names its proxy\n * routes differently can still use this function without a fork.\n */\nimport { apiRequest, JSON_HEADERS } from '../utils/http-client'\nimport type { MediaAsset } from '../types/media'\nimport type { PresignedUploadUrlResponse } from './auth.service'\n\nexport interface UploadMediaFileParams {\n file: File\n /** e.g. \"review\", \"digital_product\" — matches kasuvia-media-system's context_validation.py. */\n context: string\n entityId: string\n affiliation?: string\n ownerId?: string\n presignedUrlEndpoint?: string\n confirmUploadEndpoint?: string\n}\n\n/**\n * Upload one file end-to-end: request a presigned URL, PUT the file\n * directly to R2, then confirm the upload to get back a real MediaAsset.\n */\nexport async function uploadMediaFile(params: UploadMediaFileParams): Promise<MediaAsset> {\n const presignedUrlEndpoint = params.presignedUrlEndpoint ?? '/api/auth/media/presigned-url'\n const confirmUploadEndpoint = params.confirmUploadEndpoint ?? '/api/auth/media/confirm-upload'\n\n const { presigned_url, storage_path } = await apiRequest<PresignedUploadUrlResponse>(presignedUrlEndpoint, {\n method: 'POST',\n headers: JSON_HEADERS,\n credentials: 'include',\n body: JSON.stringify({\n filename: params.file.name,\n content_type: params.file.type,\n context: params.context,\n entity_id: params.entityId,\n affiliation: params.affiliation,\n owner_id: params.ownerId,\n }),\n fallbackErrorMessage: 'Could not start upload',\n })\n\n const putResponse = await fetch(presigned_url, {\n method: 'PUT',\n headers: { 'Content-Type': params.file.type },\n body: params.file,\n })\n if (!putResponse.ok) {\n throw new Error(`Failed to upload ${params.file.name}`)\n }\n\n return apiRequest<MediaAsset>(confirmUploadEndpoint, {\n method: 'POST',\n headers: JSON_HEADERS,\n credentials: 'include',\n body: JSON.stringify({\n storage_path,\n entity_id: params.entityId,\n original_filename: params.file.name,\n content_type: params.file.type,\n size: params.file.size,\n context: params.context,\n affiliation: params.affiliation,\n owner_id: params.ownerId,\n }),\n fallbackErrorMessage: `Could not confirm upload of ${params.file.name}`,\n })\n}\n\nexport interface UploadMediaFilesResult {\n assets: MediaAsset[]\n errors: { file: string; message: string }[]\n}\n\n/**\n * Upload several files, one at a time (sequential — real progress feedback\n * per file rather than an opaque Promise.all batch). A single file's\n * failure does not abort the rest: matches the original BespokeStep/\n * ProductReviews behaviour of keeping whatever succeeded before a later\n * file failed, rather than discarding it. The caller decides how to present\n * `errors` (e.g. one toast per failed filename).\n */\nexport async function uploadMediaFiles(\n files: File[],\n params: Omit<UploadMediaFileParams, 'file'>\n): Promise<UploadMediaFilesResult> {\n const assets: MediaAsset[] = []\n const errors: { file: string; message: string }[] = []\n for (const file of files) {\n try {\n assets.push(await uploadMediaFile({ ...params, file }))\n } catch (err) {\n errors.push({ file: file.name, message: err instanceof Error ? err.message : 'Upload failed' })\n }\n }\n return { assets, errors }\n}\n"],"mappings":"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","names":["React","useContext","React","useContext","items","subtotal","context","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useMutation","useMutation","useMutation","useQuery","useQueryClient","useQueryClient","useMutation","useQuery","useMutation","useQuery","useQueryClient","payload","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useQuery","useQuery","isDevelopment","isDevelopment","useQuery","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useMutation","useQuery","useQueryClient","useQueryClient","useMutation","useQuery","useEffect","useState","useEffect","useState","useEffect","useState","useRef","useState","useRef","useEffect","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useCallback","useQuery","useQuery","formatPrice","useCallback","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useEffect","useRef","fetchEventSource","useRef","useEffect","fetchEventSource","useCallback","useEffect","useState","useState","useEffect","useCallback","useMutation","useMutation"]}