@simpleapps-com/augur-hooks 0.2.14 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +35 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +35 -22
- package/dist/index.js.map +1 -1
- package/dist/{joomla-content-list-DGPtwJ99.d.cts → joomla-content-list-D-DV69o0.d.cts} +11 -8
- package/dist/{joomla-content-list-DGPtwJ99.d.ts → joomla-content-list-D-DV69o0.d.ts} +11 -8
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-hooks/dist/index.cjs","../src/provider.tsx","../src/stores/cart-store.ts","../src/stores/items-filters-store.ts","../src/hooks/use-debounce.ts","../src/hooks/use-format-price.ts","../src/hooks/use-item-price.ts","../src/hooks/use-inv-mast-doc.ts","../src/hooks/use-item-category.ts","../src/hooks/use-inv-mast.ts","../src/hooks/use-inv-mast-stock.ts","../src/hooks/use-product-category.ts","../src/hooks/use-item-details.ts","../src/hooks/use-item-attributes.ts","../src/hooks/use-product-search.ts","../src/hooks/use-search-suggestions.ts","../src/hooks/use-cart-actions.ts","../src/hooks/use-cart-initialization.ts","../src/hooks/use-cart-pricing.ts","../src/hooks/use-pagination-prefetch.ts","../src/hooks/use-category-items-infinite.ts","../src/hooks/use-item-search-infinite.ts","../src/hooks/use-joomla-content.ts","../src/hooks/use-joomla-content-list.ts","../src/create-site-hooks.ts","../src/persistence/use-persistence.ts","../src/persistence/serializer.ts","../src/persistence/apply-limits.ts","../src/persistence/create-persister.ts","../src/persistence/use-storage-monitor.ts"],"names":["create","devtools","useQuery","useEffect","useQueryClient","useMemo","useCallback","useInfiniteQuery","useState"],"mappings":"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H,MAAA;AACK,MAAA;AACf,IAAA;AACF,EAAA;AACF;A3Bs6BuB;AACA;A4Bj9BU;AAChB,EAAA;AAAa,EAAA;AACb,EAAA;AACD,EAAA;AAAa,EAAA;AAC7B;AAQgB;AACH,EAAA;AAEQ,EAAA;AACJ,EAAA;AACX,EAAA;AACA,EAAA;AAEa,EAAA;AAED,IAAA;AACV,IAAA;AACc,MAAA;AACT,MAAA;AACD,IAAA;AAER,IAAA;AACU,IAAA;AACZ,EAAA;AAEO,EAAA;AACS,IAAA;AACF,MAAA;AACE,MAAA;AACF,QAAA;AACE,UAAA;AACF,UAAA;AACK,QAAA;AACf,MAAA;AACF,IAAA;AAEgB,IAAA;AACV,MAAA;AACU,QAAA;AACF,QAAA;AACH,QAAA;AACD,MAAA;AACC,QAAA;AACT,MAAA;AACF,IAAA;AAEe,IAAA;AACN,MAAA;AACT,IAAA;AACF,EAAA;AACF;A5Bu8BuB;AACA;A6B1gCdL;AAGH;AAUU;AACD,EAAA;AACK,EAAA;AAEF,EAAA;AACH,IAAA;AAEM,IAAA;AACC,MAAA;AACA,MAAA;AAEA,MAAA;AACJ,QAAA;AACH,QAAA;AACT,MAAA;AAGgB,MAAA;AACF,MAAA;AAEV,MAAA;AACU,QAAA;AACF,QAAA;AACK,QAAA;AACH,QAAA;AAGL,QAAA;AAC4B,UAAA;AACpB,YAAA;AACL,YAAA;AACC,YAAA;AACT,UAAA;AACF,QAAA;AAEQ,QAAA;AACF,MAAA;AAEE,QAAA;AACV,MAAA;AACF,IAAA;AAEM,IAAA;AACK,IAAA;AACE,IAAA;AACN,EAAA;AACX;A7Bs/BuB;AACA;AyBxgCP;AACMK,EAAAA;AACF,EAAA;AAEF,EAAA;AACG,IAAA;AACd,EAAA;AAEa,EAAA;AAEG,EAAA;AAGb,EAAA;AAEF,EAAA;AACJ,IAAA;AACc,MAAA;AACD,MAAA;AACK,MAAA;AACT,MAAA;AACT,IAAA;AACmB,EAAA;AAEd,EAAA;AACL,IAAA;AACQ,IAAA;AACQ,IAAA;AAChB,IAAA;AACF,EAAA;AACF;AzBmgCuB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-hooks/dist/index.cjs","sourcesContent":[null,"import { createContext, useContext, type ReactNode } from \"react\";\nimport type { AugurCallbacks, AugurAuthContext } from \"./callbacks\";\nimport type { CacheConfig } from \"./types\";\n\n/**\n * Minimal type for the augur-api SDK instance.\n * Consumers provide their concrete AugurAPI instance; we keep the type\n * loose so augur-hooks doesn't need to depend directly on the SDK package.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AugurApiClient = any;\n\ninterface AugurHooksProviderProps {\n api: AugurApiClient;\n /** Optional callback registry for routing SDK calls through server actions. */\n callbacks?: AugurCallbacks;\n /** Optional auth context — hooks fall back to these values when not passed directly. */\n auth?: AugurAuthContext;\n /** Optional cache configuration — controls edge and Redis caching per tier. */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\nconst AugurApiContext = createContext<AugurApiClient | null>(null);\nconst AugurCallbacksContext = createContext<AugurCallbacks | undefined>(\n undefined,\n);\nconst AugurAuthReactContext = createContext<AugurAuthContext | undefined>(\n undefined,\n);\nconst AugurCacheContext = createContext<CacheConfig | undefined>(undefined);\n\n/**\n * Provides the augur-api SDK instance and optional callbacks to all hooks.\n *\n * ```tsx\n * import { AugurAPI } from \"@simpleapps-com/augur-api\";\n * const api = new AugurAPI({ baseUrl: \"...\", token: \"...\" });\n *\n * <AugurHooksProvider api={api}>\n * <App />\n * </AugurHooksProvider>\n *\n * // With callbacks and auth (eliminates per-hook wrappers):\n * <AugurHooksProvider\n * api={api}\n * callbacks={{\n * getItemPrice: (id, cust, qty) => getItemPriceAction(id, cust, qty),\n * }}\n * auth={{ status, customerId, userId, cartHdrUid }}\n * >\n * <App />\n * </AugurHooksProvider>\n * ```\n */\nexport function AugurHooksProvider({\n api,\n callbacks,\n auth,\n cache,\n children,\n}: AugurHooksProviderProps) {\n return (\n <AugurApiContext.Provider value={api}>\n <AugurCallbacksContext.Provider value={callbacks}>\n <AugurAuthReactContext.Provider value={auth}>\n <AugurCacheContext.Provider value={cache}>\n {children}\n </AugurCacheContext.Provider>\n </AugurAuthReactContext.Provider>\n </AugurCallbacksContext.Provider>\n </AugurApiContext.Provider>\n );\n}\n\n/**\n * Returns the augur-api SDK instance from context.\n * Throws if called outside of `<AugurHooksProvider>`.\n */\nexport function useAugurApi(): AugurApiClient {\n const api = useContext(AugurApiContext);\n if (!api) {\n throw new Error(\n \"useAugurApi must be used within an <AugurHooksProvider>. \" +\n \"Wrap your app with <AugurHooksProvider api={apiInstance}>.\",\n );\n }\n return api;\n}\n\n/**\n * Returns the provider-level callback registry, if any.\n * Used internally by hooks to check for server action overrides.\n */\nexport function useAugurCallbacks(): AugurCallbacks | undefined {\n return useContext(AugurCallbacksContext);\n}\n\n/**\n * Returns the provider-level auth context, if any.\n * Used internally by hooks to fall back to provider auth when\n * auth fields are not passed directly as hook parameters.\n */\nexport function useAugurAuth(): AugurAuthContext | undefined {\n return useContext(AugurAuthReactContext);\n}\n\n/**\n * Returns the provider-level cache configuration, if any.\n * Used internally by hooks to enable edge/Redis caching.\n */\nexport function useAugurCache(): CacheConfig | undefined {\n return useContext(AugurCacheContext);\n}\n","import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport type { TCartLine } from \"@simpleapps-com/augur-utils\";\n\ninterface CartState {\n cartHdrUid: number | string | undefined;\n cartLines: TCartLine[];\n cartItemCount: number;\n setCartHdrUid: (cartHdrUid: number | string | undefined) => void;\n setCartLines: (cartLines: TCartLine[]) => void;\n clearCart: () => void;\n}\n\nexport const useCartStore = create<CartState>()(\n devtools(\n (set) => ({\n cartHdrUid: undefined,\n cartLines: [],\n cartItemCount: 0,\n\n setCartHdrUid: (cartHdrUid) =>\n set({ cartHdrUid }, false, \"setCartHdrUid\"),\n\n setCartLines: (cartLines) => {\n const cartItemCount = cartLines.reduce(\n (sum, line) => sum + (line.quantity || 0),\n 0,\n );\n set({ cartLines, cartItemCount }, false, \"setCartLines\");\n },\n\n clearCart: () =>\n set(\n { cartHdrUid: undefined, cartLines: [], cartItemCount: 0 },\n false,\n \"clearCart\",\n ),\n }),\n { name: \"CartStore\", enabled: process.env.NODE_ENV === \"development\" },\n ),\n);\n\n// Selector hooks -- only re-render when specific state changes\nexport const useCartHdrUid = () => useCartStore((s) => s.cartHdrUid);\nexport const useCartLines = () => useCartStore((s) => s.cartLines);\nexport const useCartItemCount = () => useCartStore((s) => s.cartItemCount);\nexport const useSetCartHdrUid = () => useCartStore((s) => s.setCartHdrUid);\nexport const useSetCartLines = () => useCartStore((s) => s.setCartLines);\nexport const useClearCart = () => useCartStore((s) => s.clearCart);\n","import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport type { TItemsFilters } from \"@simpleapps-com/augur-utils\";\n\nconst DEFAULT_FILTER_STATE: TItemsFilters = {\n filters: [],\n limit: 12,\n offset: 0,\n sortBy: \"asc\",\n q: \"\",\n page: 1,\n};\n\ninterface ItemsFiltersState {\n initialFiltersState: TItemsFilters;\n itemsFilters: TItemsFilters;\n setItemsFilters: (itemFilters: TItemsFilters) => void;\n}\n\nexport const useItemFiltersStore = create<ItemsFiltersState>()(\n devtools(\n (set) => ({\n initialFiltersState: DEFAULT_FILTER_STATE,\n itemsFilters: DEFAULT_FILTER_STATE,\n setItemsFilters: (state) =>\n set({ itemsFilters: state }, false, \"setItemsFilters\"),\n }),\n {\n name: \"ItemsFiltersStore\",\n enabled: process.env.NODE_ENV === \"development\",\n },\n ),\n);\n","import { useEffect, useState } from \"react\";\n\n/**\n * Debounces a rapidly-changing value.\n * Returns the latest value only after `delay` ms of inactivity.\n */\nexport function useDebounce<T>(value: T, delay: number = 500): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","/**\n * Hook that returns a price formatter.\n * Wraps Intl.NumberFormat with configurable locale/currency.\n */\nexport function useFormatPrice(\n locale: string = \"en-US\",\n currency: string = \"USD\",\n) {\n const formatPrice = (price: number): string => {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(price);\n };\n\n return { formatPrice };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurAuth, useAugurCache } from \"../provider\";\nimport {\n getItemPriceKey,\n getItemPriceOptions,\n} from \"../queries/item-price\";\n\nexport { getItemPriceKey, getItemPriceOptions };\n\ninterface UseItemPriceOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TPriceData>;\n}\n\n/**\n * Fetches and caches item pricing via the augur-api SDK.\n *\n * Pass `options.queryFn` to override with a cached server action:\n * ```ts\n * useItemPrice(itemId, customerId, 1, {\n * queryFn: () => getItemPriceCached(itemId, customerId, 1),\n * });\n * ```\n */\nexport function useItemPrice(\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n options: UseItemPriceOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const auth = useAugurAuth();\n const cache = useAugurCache();\n const effectiveCustomerId = customerId ?? auth?.customerId;\n const defaultOptions = getItemPriceOptions(api, itemId, effectiveCustomerId, quantity, cache);\n\n const resolvedQueryFn = options.queryFn\n ?? (callbacks?.getItemPrice\n ? () => callbacks.getItemPrice!(itemId!, effectiveCustomerId!, quantity)\n : undefined);\n\n return useQuery({\n ...defaultOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: options.enabled ?? (Boolean(itemId) && Boolean(effectiveCustomerId)),\n retry: 3,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TInvMastDoc } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getInvMastDocKey,\n getInvMastDocOptions,\n} from \"../queries/inv-mast-doc\";\n\nexport { getInvMastDocKey, getInvMastDocOptions };\n\ninterface UseInvMastDocOptions {\n enabled?: boolean;\n includePricing?: \"Y\" | \"N\";\n /** Initial data from server -- enables instant render without loading state. */\n initialData?: TInvMastDoc;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TInvMastDoc>;\n}\n\n/**\n * Fetches and caches an inventory master document via the augur-api SDK.\n */\nexport function useInvMastDoc(\n invMastUid: number,\n itemId: string,\n options: UseInvMastDocOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getInvMastDocOptions(\n api,\n invMastUid,\n itemId,\n options.includePricing ?? \"N\",\n cache,\n );\n\n const { data, isLoading, error } = useQuery<TInvMastDoc, Error>({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getInvMastDoc\n ? { queryFn: options.queryFn ?? (() => callbacks!.getInvMastDoc!(invMastUid, itemId, options.includePricing ?? \"N\")) }\n : {}),\n enabled: options.enabled ?? true,\n initialData: options.initialData,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { GetItemCategoryApiOptions } from \"../types\";\nimport {\n getItemCategoryKey,\n getItemCategoryOptions,\n} from \"../queries/item-category\";\n\nexport { getItemCategoryKey, getItemCategoryOptions };\n\ntype ItemCategoryQueryKey = readonly [\n \"itemCategory\",\n number,\n GetItemCategoryApiOptions | undefined,\n];\n\ninterface UseItemCategoryOptions {\n enabled?: boolean;\n apiOptions?: GetItemCategoryApiOptions;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TCategory>;\n}\n\n/**\n * Fetches and caches item category data via the augur-api SDK.\n */\nexport function useItemCategory(\n itemCategoryUid: number,\n options: UseItemCategoryOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getItemCategoryOptions(\n api,\n itemCategoryUid,\n options.apiOptions,\n cache,\n );\n\n const { data, isLoading, error } = useQuery<\n TCategory,\n Error,\n TCategory,\n ItemCategoryQueryKey\n >({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getItemCategory\n ? { queryFn: options.queryFn ?? (() => callbacks!.getItemCategory!(itemCategoryUid, options.apiOptions)) }\n : {}),\n enabled: options.enabled ?? true,\n });\n\n return { category: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getInvMastKey,\n getInvMastOptions,\n} from \"../queries/inv-mast\";\n\nexport { getInvMastKey, getInvMastOptions };\n\ninterface UseInvMastOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport function useInvMast(\n invMastUid: number,\n itemId: string,\n options: UseInvMastOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getInvMastOptions(api, invMastUid, itemId, cache);\n\n const { data, isLoading, error } = useQuery<TItemDetails, Error>({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getInvMast\n ? { queryFn: options.queryFn ?? (() => callbacks!.getInvMast!(invMastUid, itemId)) }\n : {}),\n enabled: options.enabled ?? true,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getInvMastStockKey,\n getInvMastStockOptions,\n} from \"../queries/inv-mast-stock\";\n\nexport { getInvMastStockKey, getInvMastStockOptions };\n\ninterface UseInvMastStockOptions {\n enabled?: boolean;\n queryFn?: () => Promise<number>;\n}\n\nexport function useInvMastStock(\n invMastUid: number | string,\n options: UseInvMastStockOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getInvMastStockOptions(api, invMastUid, cache);\n\n const { data, isLoading, error } = useQuery({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getInvMastStock\n ? { queryFn: options.queryFn ?? (() => callbacks!.getInvMastStock!(invMastUid)) }\n : {}),\n enabled: (options.enabled ?? true) && !!invMastUid,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n qtyOnHand: data ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getProductCategoryKey,\n getProductCategoryOptions,\n} from \"../queries/product-category\";\n\nexport { getProductCategoryKey, getProductCategoryOptions };\n\ntype ProductCategoryResponse = {\n itemCategoryDesc: string;\n childrenTotal: number;\n children: unknown[];\n categoryImage: string | null;\n};\n\ninterface UseProductCategoryOptions {\n enabled?: boolean;\n queryFn?: () => Promise<ProductCategoryResponse>;\n}\n\nfunction resolveData(data: ProductCategoryResponse | undefined) {\n return {\n childrenTotal: data?.childrenTotal ?? 0,\n itemCategoryDesc: data?.itemCategoryDesc ?? \"\",\n productCategories: data?.children ?? null,\n productCategoryImage: data?.categoryImage ?? null,\n };\n}\n\nexport function useProductCategory(\n itemCategoryUid: number | string | null,\n options: UseProductCategoryOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const baseOptions = itemCategoryUid\n ? getProductCategoryOptions(api, itemCategoryUid, cache)\n : {\n queryKey: getProductCategoryKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n };\n\n const resolvedQueryFn = options.queryFn\n ?? (callbacks?.getProductCategory\n ? () => callbacks.getProductCategory!(itemCategoryUid!)\n : undefined);\n\n const { data, isLoading, error } = useQuery({\n ...baseOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: (options.enabled ?? true) && !!itemCategoryUid,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n ...resolveData(data),\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport {\n getItemDetailsKey,\n getItemDetailsOptions,\n} from \"../queries/item-details\";\n\nexport { getItemDetailsKey, getItemDetailsOptions };\n\ninterface UseItemDetailsOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport function useItemDetails(\n itemId: number | string | undefined,\n options: UseItemDetailsOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(itemId\n ? getItemDetailsOptions(api, itemId, cache)\n : { queryKey: getItemDetailsKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ?? callbacks?.getItemDetails\n ? { queryFn: options.queryFn ?? (() => callbacks!.getItemDetails!(itemId!)) }\n : {}),\n enabled: (options.enabled ?? true) && !!itemId,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n const categoryList = data?.categoryList ?? [];\n\n return {\n itemCategoryUid:\n categoryList.length > 0 ? categoryList[categoryList.length - 1] : null,\n itemDetails: data ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TAttribute } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getItemAttributesKey,\n getItemAttributesOptions,\n} from \"../queries/item-attributes\";\n\nexport { getItemAttributesKey, getItemAttributesOptions };\n\ninterface UseItemAttributesOptions {\n enabled?: boolean;\n queryFn?: () => Promise<{ attributes: TAttribute[] }>;\n}\n\nexport function useItemAttributes(\n itemCategoryUid: number | string | null,\n options: UseItemAttributesOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getItemAttributesOptions(api, itemCategoryUid, cache)\n : {\n queryKey: getItemAttributesKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n }),\n ...(options.queryFn ?? callbacks?.getItemAttributes\n ? { queryFn: options.queryFn ?? (() => callbacks!.getItemAttributes!(itemCategoryUid!)) }\n : {}),\n enabled: (options.enabled ?? true) && !!itemCategoryUid,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n attributes: data?.attributes ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { PageData } from \"../types\";\nimport {\n getProductSearchKey,\n getProductSearchOptions,\n} from \"../queries/product-search\";\n\nexport { getProductSearchKey, getProductSearchOptions };\n\ntype ProductSearchResponse = {\n items: unknown[];\n totalResults: number;\n};\n\ninterface UseProductSearchOptions {\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<ProductSearchResponse>;\n}\n\n/**\n * Searches products via the augur-api OpenSearch endpoint.\n * Replaces the ampro-online pattern of fetching from a Next.js API route.\n */\nexport function useProductSearch(\n pageData: PageData,\n options: UseProductSearchOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const defaultOptions = getProductSearchOptions(api, pageData, cache);\n\n const { data, isLoading, error } = useQuery({\n ...defaultOptions,\n ...(options.queryFn ?? callbacks?.getProductSearch\n ? { queryFn: options.queryFn ?? (() => callbacks!.getProductSearch!(pageData)) }\n : {}),\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n productItems: data?.items ?? null,\n total: data?.totalResults ?? 0,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { SearchSuggestionsResponse } from \"../types\";\nimport {\n getSearchSuggestionsKey,\n getSearchSuggestionsOptions,\n} from \"../queries/search-suggestions\";\n\nexport { getSearchSuggestionsKey, getSearchSuggestionsOptions };\n\ninterface UseSearchSuggestionsOptions {\n enabled?: boolean;\n limit?: number;\n offset?: number;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<SearchSuggestionsResponse>;\n}\n\n/**\n * Fetches search suggestions via the augur-api OpenSearch endpoint.\n * Replaces the ampro-online pattern of fetching from a Next.js API route.\n */\nexport function useSearchSuggestions(\n query: string,\n options: UseSearchSuggestionsOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const limit = options.limit ?? 10;\n const offset = options.offset ?? 0;\n const enabled = (options.enabled ?? true) && query.trim().length > 0;\n\n const defaultOptions = getSearchSuggestionsOptions(api, query, limit, offset, cache);\n\n const { data, isLoading, error } = useQuery<\n SearchSuggestionsResponse,\n Error\n >({\n ...defaultOptions,\n ...(options.queryFn ?? callbacks?.getSearchSuggestions\n ? { queryFn: options.queryFn ?? (() => callbacks!.getSearchSuggestions!(query, limit, offset)) }\n : {}),\n enabled,\n });\n\n return {\n suggestions: data?.data ?? [],\n total: data?.total ?? 0,\n isLoading,\n error,\n };\n}\n","import { useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useCartLines,\n useSetCartLines,\n} from \"../stores/cart-store\";\n\ntype CartLineInput = Pick<\n TCartLine,\n \"invMastUid\" | \"quantity\" | \"unitOfMeasure\"\n> & {\n cartHdrUid?: number | string | undefined;\n};\n\n/** Site-specific callbacks injected into useCartActions. */\nexport interface CartActionCallbacks {\n /** Add items to cart via API. Truthy = success, falsy = failure. */\n addToCart: (\n cartHdrUid: number,\n items: Array<{\n cartHdrUid: number;\n invMastUid: number;\n quantity: number;\n unitOfMeasure: string;\n }>,\n ) => Promise<boolean | undefined | void>;\n /** Update cart lines via API. Truthy = success, falsy = failure. */\n updateCartLines: (\n cartHdrUid: number,\n lines: TCartLine[],\n ) => Promise<boolean | undefined | void>;\n /** Delete all items from cart via API. Truthy = success, falsy = failure. */\n deleteItemsFromCart: (cartHdrUid: number) => Promise<boolean | undefined | void>;\n /** Optional toast notification callback. */\n toast?: {\n info?: (message: string) => void;\n error?: (message: string) => void;\n success?: (message: string) => void;\n };\n}\n\ninterface CartActionOptions {\n showToast?: boolean;\n itemId?: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction requireCartUid(\n cartHdrUid: string | number | undefined,\n): number {\n const num = typeof cartHdrUid === \"string\" ? Number(cartHdrUid) : cartHdrUid;\n if (!num) throw new Error(\"Cart UID is not set\");\n return num;\n}\n\nfunction buildOptimisticAdd(\n cartLines: TCartLine[],\n item: CartLineInput,\n cartHdrUid: number,\n itemId: string,\n): TCartLine[] {\n const existingIndex = cartLines.findIndex(\n (line) => line.invMastUid === item.invMastUid,\n );\n\n if (existingIndex >= 0) {\n return cartLines.map((line, index) =>\n index === existingIndex\n ? { ...line, quantity: line.quantity + item.quantity }\n : line,\n );\n }\n\n return [\n ...cartLines,\n {\n cartHdrUid,\n invMastUid: item.invMastUid,\n invMastUidCount: 1,\n isAssembly: \"N\",\n itemId,\n lineNo: cartLines.length + 1,\n lineNote: null,\n quantity: item.quantity,\n unitOfMeasure: item.unitOfMeasure,\n },\n ];\n}\n\n/**\n * Optimistic cart actions hook with automatic rollback on failure.\n *\n * Accepts site-specific server action callbacks so the hook itself\n * has no dependency on any particular server action implementation.\n *\n * @example\n * ```tsx\n * import { useCartActions } from \"@simpleapps-com/augur-hooks\";\n * import { addToCart, updateCartLines, deleteItemsFromCart } from \"@/lib/actions/commerce\";\n * import { toast } from \"react-toastify\";\n *\n * const cart = useCartActions({\n * addToCart, updateCartLines, deleteItemsFromCart,\n * toast: { info: toast.info, error: toast.error },\n * });\n *\n * await cart.addToCart({ invMastUid: 123, quantity: 1, unitOfMeasure: \"EA\" });\n * ```\n */\nexport function useCartActions(callbacks: CartActionCallbacks) {\n const queryClient = useQueryClient();\n const cartHdrUid = useCartHdrUid();\n const cartLines = useCartLines();\n const setCartLines = useSetCartLines();\n const notify = callbacks.toast;\n\n const invalidateCartCache = useCallback(() => {\n queryClient.invalidateQueries({ queryKey: [\"cartLines\", cartHdrUid] });\n queryClient.invalidateQueries({\n queryKey: [\"cart-also-bought\", cartHdrUid],\n });\n }, [queryClient, cartHdrUid]);\n\n const addToCart = useCallback(\n async (\n item: CartLineInput,\n options: CartActionOptions = {},\n ): Promise<boolean> => {\n const { showToast = true, itemId = \"\", onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n\n setCartLines(buildOptimisticAdd(cartLines, item, uid, itemId));\n\n try {\n const success = await callbacks.addToCart(uid, [\n {\n cartHdrUid: uid,\n invMastUid: item.invMastUid,\n quantity: item.quantity,\n unitOfMeasure: item.unitOfMeasure,\n },\n ]);\n if (!success) throw new Error(\"Failed to add item to cart\");\n\n invalidateCartCache();\n if (showToast && notify?.info) {\n notify.info(`${item.quantity} x ${itemId || \"Item\"} added to cart`);\n }\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to add item to cart. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const updateQuantity = useCallback(\n async (\n invMastUid: number,\n newQuantity: number,\n options: CartActionOptions = {},\n ): Promise<boolean> => {\n const { showToast = false, onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n\n const updatedLines = cartLines.map((line) =>\n line.invMastUid === invMastUid\n ? { ...line, quantity: newQuantity }\n : line,\n );\n setCartLines(updatedLines);\n\n try {\n const success = await callbacks.updateCartLines(uid, updatedLines);\n if (!success) throw new Error(\"Failed to update quantity\");\n\n invalidateCartCache();\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to update quantity. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const removeFromCart = useCallback(\n async (\n invMastUid: number,\n options: CartActionOptions = {},\n ): Promise<boolean> => {\n const { showToast = true, itemId = \"\", onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n\n setCartLines(cartLines.filter((line) => line.invMastUid !== invMastUid));\n\n try {\n const zeroedLines = cartLines.map((line) =>\n line.invMastUid === invMastUid ? { ...line, quantity: 0 } : line,\n );\n const success = await callbacks.updateCartLines(uid, zeroedLines);\n if (!success) throw new Error(\"Failed to remove item\");\n\n invalidateCartCache();\n if (showToast && notify?.info) {\n notify.info(`${itemId || \"Item\"} removed from cart`);\n }\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to remove item. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const clearCart = useCallback(\n async (options: Omit<CartActionOptions, \"itemId\"> = {}): Promise<boolean> => {\n const { showToast = true, onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n setCartLines([]);\n\n try {\n const success = await callbacks.deleteItemsFromCart(uid);\n if (!success) throw new Error(\"Failed to clear cart\");\n\n invalidateCartCache();\n if (showToast && notify?.info) {\n notify.info(\"Cart cleared\");\n }\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to clear cart. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const isInCart = useCallback(\n (invMastUid: number): boolean => {\n return cartLines.some((line) => line.invMastUid === invMastUid);\n },\n [cartLines],\n );\n\n const getItemQuantity = useCallback(\n (invMastUid: number): number => {\n return cartLines.find((line) => line.invMastUid === invMastUid)?.quantity ?? 0;\n },\n [cartLines],\n );\n\n return {\n addToCart,\n updateQuantity,\n removeFromCart,\n clearCart,\n isInCart,\n getItemQuantity,\n cartHdrUid,\n cartLines,\n invalidateCartCache,\n };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type { TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useSetCartHdrUid,\n useSetCartLines,\n useClearCart,\n} from \"../stores/cart-store\";\nimport { useAugurAuth } from \"../provider\";\n\nconst MAX_RETRY_ATTEMPTS = 7;\nconst RETRY_DELAY_MS = 1000;\n\n/** Session info passed from the consumer's auth system. */\nexport interface CartSessionInfo {\n /** Auth status: \"loading\" | \"authenticated\" | \"unauthenticated\" */\n status: \"loading\" | \"authenticated\" | \"unauthenticated\";\n /** User's ID (e.g., Joomla user ID). Undefined if not authenticated. */\n userId?: string | number;\n /** Cart header UID from the auth session, if available. */\n cartHdrUid?: number | string;\n}\n\n/** Site-specific callbacks injected into useCartInitialization. */\nexport interface CartInitCallbacks {\n /** Look up or create a cart header. Returns { cartHdrUid, cartToken? }. */\n cartHdrLookup: (\n userId: string | number,\n cartToken: string,\n ) => Promise<{ cartHdrUid: number; cartToken?: string | null } | null | undefined>;\n /** Fetch cart line items for a given cart header UID. */\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[] | undefined>;\n /** Get the current cart token from cookies. */\n getCartToken: () => string | null;\n /** Save cart token to cookies. */\n saveCartToken: (token: string) => void;\n /** Generate a new unique cart token (e.g., uuidv4). */\n generateCartToken: () => string;\n}\n\n/**\n * Initialize cart state from session (authenticated) or cookie (guest).\n * Call once in the root layout.\n *\n * @example\n * ```tsx\n * import { useCartInitialization } from \"@simpleapps-com/augur-hooks\";\n * import { useSession } from \"next-auth/react\";\n * import { cartHdrLookup, getCartLines } from \"@/lib/actions/commerce\";\n * import { getCookie, setCookie } from \"cookies-next/client\";\n * import { v4 as uuidv4 } from \"uuid\";\n *\n * function CartInitializer() {\n * const { data: session, status } = useSession();\n *\n * useCartInitialization(\n * {\n * status,\n * userId: session?.user?.id,\n * cartHdrUid: session?.user?.cartHdrUid,\n * },\n * {\n * cartHdrLookup,\n * getCartLines,\n * getCartToken: () => getCookie(\"cartToken\") as string | null,\n * saveCartToken: (token) => setCookie(\"cartToken\", token, { maxAge: 604800, path: \"/\" }),\n * generateCartToken: uuidv4,\n * },\n * );\n *\n * return null;\n * }\n * ```\n */\nexport function useCartInitialization(\n session: CartSessionInfo,\n callbacks: CartInitCallbacks,\n) {\n const auth = useAugurAuth();\n const cartHdrUid = useCartHdrUid();\n const setCartHdrUid = useSetCartHdrUid();\n const setCartLines = useSetCartLines();\n const clearCart = useClearCart();\n const queryClient = useQueryClient();\n\n // Merge session with provider auth — session fields take priority\n const effectiveStatus = session.status;\n const effectiveUserId = session.userId ?? auth?.userId;\n const effectiveCartHdrUid = session.cartHdrUid ?? auth?.cartHdrUid;\n const effectiveSession = useMemo<CartSessionInfo>(\n () => ({ status: effectiveStatus, userId: effectiveUserId, cartHdrUid: effectiveCartHdrUid }),\n [effectiveStatus, effectiveUserId, effectiveCartHdrUid],\n );\n\n const retryCountRef = useRef(0);\n const isInitializingRef = useRef(false);\n const prevStatusRef = useRef(effectiveSession.status);\n\n // Auto-clear cart on logout (authenticated → unauthenticated)\n useEffect(() => {\n const prevStatus = prevStatusRef.current;\n prevStatusRef.current = effectiveSession.status;\n\n if (\n prevStatus === \"authenticated\" &&\n effectiveSession.status === \"unauthenticated\"\n ) {\n clearCart();\n queryClient.removeQueries({ queryKey: [\"cartLines\"] });\n queryClient.removeQueries({ queryKey: [\"cart-also-bought\"] });\n }\n }, [effectiveSession.status, clearCart, queryClient]);\n\n // Initialize cart header\n useEffect(() => {\n if (cartHdrUid || effectiveSession.status === \"loading\") return;\n\n // Authenticated user — use session cartHdrUid\n if (effectiveSession.cartHdrUid && effectiveSession.status === \"authenticated\") {\n setCartHdrUid(effectiveSession.cartHdrUid);\n return;\n }\n\n // Guest user — lookup/create cart\n if (effectiveSession.status === \"unauthenticated\" && !isInitializingRef.current) {\n isInitializingRef.current = true;\n retryCountRef.current = 0;\n\n const initializeGuestCart = async () => {\n const existingToken = callbacks.getCartToken();\n const cartToken =\n existingToken && typeof existingToken === \"string\"\n ? existingToken\n : callbacks.generateCartToken();\n\n while (retryCountRef.current < MAX_RETRY_ATTEMPTS) {\n try {\n const cartHdr = await callbacks.cartHdrLookup(\"0\", cartToken);\n\n if (cartHdr && cartHdr.cartHdrUid !== 0) {\n callbacks.saveCartToken(cartToken);\n setCartHdrUid(cartHdr.cartHdrUid);\n isInitializingRef.current = false;\n return;\n }\n\n retryCountRef.current++;\n\n if (retryCountRef.current < MAX_RETRY_ATTEMPTS) {\n const delay = Math.min(\n RETRY_DELAY_MS * Math.pow(1.5, retryCountRef.current),\n 10000,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n } catch (error) {\n console.error(\n `Cart initialization attempt ${retryCountRef.current + 1} failed:`,\n error,\n );\n retryCountRef.current++;\n\n if (retryCountRef.current < MAX_RETRY_ATTEMPTS) {\n const delay = Math.min(\n RETRY_DELAY_MS * Math.pow(1.5, retryCountRef.current),\n 10000,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n console.error(\n `Cart initialization failed after ${MAX_RETRY_ATTEMPTS} attempts`,\n );\n isInitializingRef.current = false;\n };\n\n initializeGuestCart();\n }\n }, [effectiveSession, cartHdrUid, setCartHdrUid, callbacks]);\n\n // Fetch cart lines when cartHdrUid is available\n const { data: cartLinesData } = useQuery({\n queryKey: [\"cartLines\", cartHdrUid],\n queryFn: async () => (await callbacks.getCartLines(Number(cartHdrUid))) ?? [],\n enabled: !!cartHdrUid,\n });\n\n // Sync cart lines to Zustand store\n useEffect(() => {\n if (cartLinesData) {\n setCartLines(cartLinesData);\n }\n }, [cartLinesData, setCartLines]);\n\n return {\n cartHdrUid,\n isInitializing: isInitializingRef.current,\n retryCount: retryCountRef.current,\n };\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useCartLines } from \"../stores/cart-store\";\nimport { getItemPriceOptions, getItemPriceKey } from \"../queries/item-price\";\nimport { useAugurApi, useAugurCallbacks, useAugurAuth, useAugurCache } from \"../provider\";\nimport { getCartPricingQueryOptions } from \"../queries/cart-pricing\";\n\nexport { getCartPricingQueryOptions };\n\nexport interface CartPriceData {\n unitPrice: number;\n priceData: Record<string, unknown> | null;\n}\n\nexport interface CartPricingResult {\n /** Map of itemId -> price data (with quantity-specific pricing) */\n prices: Record<string, CartPriceData>;\n /** Get unit price for an item (returns 0 if not found) */\n getUnitPrice: (itemId: string) => number;\n /** Get total price for an item (unitPrice * quantity) */\n getItemTotal: (itemId: string, quantity: number) => number;\n /** Cart subtotal (sum of all item totals) */\n subtotal: number;\n /** True if any price is still loading */\n isLoading: boolean;\n /** True if all prices loaded successfully */\n isSuccess: boolean;\n /** True if any price failed to load */\n isError: boolean;\n}\n\ninterface UseCartPricingOptions {\n customerId?: string | number;\n /** Override per-item price fetching (e.g. with a server action). */\n queryFn?: (\n itemId: string,\n customerId: string | number,\n quantity: number,\n ) => Promise<TPriceData>;\n}\n\n/**\n * Centralized hook for cart/checkout pricing.\n *\n * Fetches prices for ALL cart items with their actual quantities\n * to support quantity-based price breaks. React Query dedupes\n * identical calls across components.\n */\nexport function useCartPricing(\n options: UseCartPricingOptions = {},\n): CartPricingResult {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const auth = useAugurAuth();\n const cache = useAugurCache();\n const cartLines = useCartLines();\n const customerId = options.customerId ?? auth?.customerId;\n\n const priceFn = options.queryFn ?? callbacks?.getItemPrice;\n\n const priceQueries = useQueries({\n queries: cartLines.map((line) => {\n const base = priceFn\n ? {\n queryKey: getItemPriceKey(line.itemId, customerId, line.quantity),\n queryFn: () => priceFn(line.itemId, customerId!, line.quantity),\n refetchOnReconnect: true,\n refetchOnWindowFocus: false,\n meta: { persist: true },\n }\n : getItemPriceOptions(api, line.itemId, customerId, line.quantity, cache);\n return {\n ...base,\n enabled: !!customerId && !!line.itemId,\n };\n }),\n });\n\n const prices = useMemo(() => {\n const map: Record<string, CartPriceData> = {};\n cartLines.forEach((line, index) => {\n const queryResult = priceQueries[index];\n if (queryResult?.data) {\n map[line.itemId.toUpperCase()] = {\n unitPrice: queryResult.data.unitPrice ?? 0,\n priceData: queryResult.data as Record<string, unknown>,\n };\n }\n });\n return map;\n }, [cartLines, priceQueries]);\n\n const getUnitPrice = useMemo(() => {\n return (itemId: string): number => {\n return prices[itemId?.toUpperCase()]?.unitPrice ?? 0;\n };\n }, [prices]);\n\n const getItemTotal = useMemo(() => {\n return (itemId: string, quantity: number): number => {\n return getUnitPrice(itemId) * quantity;\n };\n }, [getUnitPrice]);\n\n const subtotal = useMemo(() => {\n return cartLines.reduce((sum, line) => {\n const unitPrice = prices[line.itemId.toUpperCase()]?.unitPrice ?? 0;\n return sum + unitPrice * line.quantity;\n }, 0);\n }, [cartLines, prices]);\n\n const isLoading = priceQueries.some((q) => q.isLoading);\n const isSuccess = priceQueries.every((q) => q.isSuccess);\n const isError = priceQueries.some((q) => q.isError);\n\n return {\n prices,\n getUnitPrice,\n getItemTotal,\n subtotal,\n isLoading,\n isSuccess,\n isError,\n };\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback } from \"react\";\nimport type { QueryKey } from \"@tanstack/react-query\";\n\ninterface UsePaginationPrefetchOptions {\n /** Query key for the paginated data */\n queryKey: QueryKey;\n /** Function to fetch a page of data */\n queryFn: (offset: number) => Promise<unknown>;\n /** Number of items per page */\n pageSize: number;\n /** Custom query key builder. Receives the base key and offset, returns the full key. Default: [...queryKey, offset]. */\n queryKeyFn?: (baseKey: QueryKey, offset: number) => QueryKey;\n /** Stale time in ms (defaults to 10 minutes) */\n staleTime?: number;\n /** GC time in ms (defaults to 30 minutes) */\n gcTime?: number;\n enabled?: boolean;\n}\n\n/**\n * Prefetch adjacent pages on hover for instant pagination.\n * Accepts a generic queryFn so it works with any paginated resource.\n */\nexport const usePaginationPrefetch = ({\n queryKey,\n queryFn,\n pageSize,\n queryKeyFn,\n staleTime = 10 * 60 * 1000,\n gcTime = 30 * 60 * 1000,\n enabled = true,\n}: UsePaginationPrefetchOptions) => {\n const queryClient = useQueryClient();\n\n const prefetchPage = useCallback(\n async (page: number) => {\n if (!enabled) return;\n\n const offset = (page - 1) * pageSize;\n\n try {\n await queryClient.prefetchQuery({\n queryKey: queryKeyFn ? queryKeyFn(queryKey, offset) : [...queryKey, offset],\n queryFn: () => queryFn(offset),\n staleTime,\n gcTime,\n });\n } catch (error) {\n console.warn(`Error prefetching page ${page}:`, error);\n }\n },\n [queryKey, queryFn, pageSize, queryKeyFn, staleTime, gcTime, queryClient, enabled],\n );\n\n const handlePaginationHover = useCallback(\n (page: number) => {\n const timeoutId = setTimeout(() => prefetchPage(page), 150);\n return () => clearTimeout(timeoutId);\n },\n [prefetchPage],\n );\n\n return {\n prefetchPage,\n handlePaginationHover,\n };\n};\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { TItemsFilters } from \"@simpleapps-com/augur-utils\";\nimport type { InfiniteScrollPage } from \"../callbacks\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getCategoryItemsInfiniteKey,\n getCategoryItemsInfiniteOptions,\n} from \"../queries/category-items-infinite\";\n\nexport { getCategoryItemsInfiniteKey, getCategoryItemsInfiniteOptions };\n\ninterface UseCategoryItemsInfiniteOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a server action). */\n queryFn?: (context: { pageParam: unknown }) => Promise<InfiniteScrollPage>;\n}\n\n/**\n * Infinite scroll for category product listings.\n * Fetches pages of products via the augur-api SDK.\n */\nexport function useCategoryItemsInfinite(\n itemCategoryUid: number,\n itemsFilters: TItemsFilters,\n options: UseCategoryItemsInfiniteOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const { enabled = true } = options;\n\n const defaultOptions = getCategoryItemsInfiniteOptions(\n api,\n itemCategoryUid,\n itemsFilters,\n cache,\n );\n\n const cb = callbacks?.getCategoryItemsInfinite;\n const resolvedQueryFn = options.queryFn\n ?? (cb\n ? ({ pageParam }: { pageParam?: unknown }) =>\n cb({\n itemCategoryUid,\n itemsFilters,\n /* v8 ignore next */\n pageParam: (pageParam ?? 0) as number,\n })\n : undefined);\n\n return useInfiniteQuery<InfiniteScrollPage>({\n ...defaultOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: enabled && !!itemCategoryUid,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { TItemsFilters } from \"@simpleapps-com/augur-utils\";\nimport type { InfiniteScrollPage } from \"../callbacks\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getItemSearchInfiniteKey,\n getItemSearchInfiniteOptions,\n} from \"../queries/item-search-infinite\";\n\nexport { getItemSearchInfiniteKey, getItemSearchInfiniteOptions };\n\ninterface UseItemSearchInfiniteOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a server action). */\n queryFn?: (context: { pageParam: unknown }) => Promise<InfiniteScrollPage>;\n}\n\n/**\n * Infinite scroll for search results.\n * Fetches pages of products via the augur-api SDK OpenSearch endpoint.\n */\nexport function useItemSearchInfinite(\n itemsFilters: TItemsFilters,\n itemCategoryUid?: number | string,\n options: UseItemSearchInfiniteOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const { enabled = true } = options;\n\n const defaultOptions = getItemSearchInfiniteOptions(\n api,\n itemsFilters,\n itemCategoryUid,\n cache,\n );\n\n const cb = callbacks?.getItemSearchInfinite;\n const resolvedQueryFn = options.queryFn\n ?? (cb\n ? ({ pageParam }: { pageParam?: unknown }) =>\n cb({\n itemsFilters,\n itemCategoryUid,\n /* v8 ignore next */\n pageParam: (pageParam ?? 0) as number,\n })\n : undefined);\n\n return useInfiniteQuery<InfiniteScrollPage>({\n ...defaultOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: enabled && !!itemsFilters.q,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TJoomlaContent } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getJoomlaContentKey,\n getJoomlaContentOptions,\n} from \"../queries/joomla-content\";\n\nexport { getJoomlaContentKey, getJoomlaContentOptions };\n\ninterface UseJoomlaContentOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TJoomlaContent>;\n}\n\nexport function useJoomlaContent(\n articleId: number | string | undefined,\n options: UseJoomlaContentOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(articleId\n ? getJoomlaContentOptions(api, articleId, cache)\n : { queryKey: getJoomlaContentKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ?? callbacks?.getJoomlaContent\n ? { queryFn: options.queryFn ?? (() => callbacks!.getJoomlaContent!(articleId!)) }\n : {}),\n enabled: (options.enabled ?? true) && !!articleId,\n });\n\n return {\n article: data ?? null,\n isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type {\n TJoomlaContent,\n TJoomlaContentFilters,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getJoomlaContentListKey,\n getJoomlaContentListOptions,\n} from \"../queries/joomla-content-list\";\n\nexport {\n getJoomlaContentListKey,\n getJoomlaContentListOptions,\n};\n\ninterface UseJoomlaContentListOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TJoomlaContent[]>;\n filters?: Partial<TJoomlaContentFilters>;\n}\n\nexport function useJoomlaContentList(\n categoryId: number | string | undefined,\n options: UseJoomlaContentListOptions = {},\n) {\n const api = useAugurApi();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(categoryId\n ? getJoomlaContentListOptions(api, categoryId, options.filters, cache)\n : { queryKey: getJoomlaContentListKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ?? callbacks?.getJoomlaContentList\n ? {\n queryFn:\n options.queryFn ??\n (() => callbacks!.getJoomlaContentList!(categoryId!, options.filters)),\n }\n : {}),\n enabled: (options.enabled ?? true) && !!categoryId,\n });\n\n return {\n articles: data ?? [],\n isLoading,\n error: error as Error | null,\n };\n}\n","/**\n * Factory function that creates a pre-configured provider + hook bundle,\n * eliminating per-hook wrapper boilerplate in consumer sites.\n *\n * @example\n * ```ts\n * // lib/augur.ts\n * import { createSiteHooks } from \"@simpleapps-com/augur-hooks\";\n * import { getItemPrice, getItemCategory } from \"@/lib/actions/pricing\";\n *\n * export const augur = createSiteHooks({\n * callbacks: { getItemPrice, getItemCategory },\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * });\n *\n * // app/layout.tsx\n * <augur.Provider api={api} auth={{ status, customerId, userId }}>\n * {children}\n * </augur.Provider>\n *\n * // components/price.tsx\n * const { data } = augur.useItemPrice(itemId);\n * ```\n */\n\nimport { createElement, type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"./provider\";\nimport type { AugurApiClient } from \"./provider\";\nimport type { AugurCallbacks, AugurAuthContext } from \"./callbacks\";\nimport type { CacheConfig } from \"./types\";\n\n// Hook imports\nimport { useItemPrice } from \"./hooks/use-item-price\";\nimport { useInvMastDoc } from \"./hooks/use-inv-mast-doc\";\nimport { useItemCategory } from \"./hooks/use-item-category\";\nimport { useInvMast } from \"./hooks/use-inv-mast\";\nimport { useInvMastStock } from \"./hooks/use-inv-mast-stock\";\nimport { useProductCategory } from \"./hooks/use-product-category\";\nimport { useItemDetails } from \"./hooks/use-item-details\";\nimport { useItemAttributes } from \"./hooks/use-item-attributes\";\nimport { useProductSearch } from \"./hooks/use-product-search\";\nimport { useSearchSuggestions } from \"./hooks/use-search-suggestions\";\nimport { useCartActions } from \"./hooks/use-cart-actions\";\nimport { useCartInitialization } from \"./hooks/use-cart-initialization\";\nimport { useCartPricing } from \"./hooks/use-cart-pricing\";\nimport { usePaginationPrefetch } from \"./hooks/use-pagination-prefetch\";\nimport { useCategoryItemsInfinite } from \"./hooks/use-category-items-infinite\";\nimport { useItemSearchInfinite } from \"./hooks/use-item-search-infinite\";\nimport { useDebounce } from \"./hooks/use-debounce\";\nimport { useFormatPrice } from \"./hooks/use-format-price\";\nimport { useJoomlaContent } from \"./hooks/use-joomla-content\";\nimport { useJoomlaContentList } from \"./hooks/use-joomla-content-list\";\n\nexport interface CreateSiteHooksConfig {\n /** Callback registry for routing SDK calls through server actions. */\n callbacks?: Partial<AugurCallbacks>;\n /** Default customer ID used when auth.customerId is not provided. */\n defaultCustomerId?: string | number;\n /** Cache configuration — controls edge and Redis caching per tier. */\n cache?: CacheConfig;\n}\n\nexport interface SiteHooksProviderProps {\n /** The augur-api SDK instance. */\n api: AugurApiClient;\n /** Auth context (partial -- missing fields are filled from config defaults). */\n auth?: Partial<AugurAuthContext>;\n children: ReactNode;\n}\n\nexport interface SiteHooks {\n Provider: (props: SiteHooksProviderProps) => ReturnType<typeof createElement>;\n\n // Hooks -- pricing\n useItemPrice: typeof useItemPrice;\n useCartPricing: typeof useCartPricing;\n\n // Hooks -- inventory\n useInvMast: typeof useInvMast;\n useInvMastDoc: typeof useInvMastDoc;\n useInvMastStock: typeof useInvMastStock;\n\n // Hooks -- items & categories\n useItemCategory: typeof useItemCategory;\n useProductCategory: typeof useProductCategory;\n useItemDetails: typeof useItemDetails;\n useItemAttributes: typeof useItemAttributes;\n\n // Hooks -- search\n useProductSearch: typeof useProductSearch;\n useSearchSuggestions: typeof useSearchSuggestions;\n\n // Hooks -- cart\n useCartActions: typeof useCartActions;\n useCartInitialization: typeof useCartInitialization;\n\n // Hooks -- pagination & infinite scroll\n usePaginationPrefetch: typeof usePaginationPrefetch;\n useCategoryItemsInfinite: typeof useCategoryItemsInfinite;\n useItemSearchInfinite: typeof useItemSearchInfinite;\n\n // Hooks -- Joomla\n useJoomlaContent: typeof useJoomlaContent;\n useJoomlaContentList: typeof useJoomlaContentList;\n\n // Hooks -- utilities\n useDebounce: typeof useDebounce;\n useFormatPrice: typeof useFormatPrice;\n}\n\n/**\n * Creates a pre-configured provider component and re-exports all hooks.\n *\n * The returned `Provider` merges `config.defaultCustomerId` into the auth\n * context; an explicit `auth.customerId` prop takes priority.\n */\nexport function createSiteHooks(config: CreateSiteHooksConfig = {}): SiteHooks {\n const { callbacks, defaultCustomerId, cache } = config;\n\n function Provider({ api, auth, children }: SiteHooksProviderProps) {\n const mergedAuth: AugurAuthContext = {\n status: auth?.status ?? \"unauthenticated\",\n customerId: auth?.customerId ?? defaultCustomerId,\n userId: auth?.userId,\n cartHdrUid: auth?.cartHdrUid,\n };\n\n return createElement(AugurHooksProvider, {\n api,\n callbacks: callbacks as AugurCallbacks | undefined,\n auth: mergedAuth,\n cache,\n children,\n });\n }\n\n Provider.displayName = \"AugurSiteProvider\";\n\n return {\n Provider,\n\n // Hooks -- pricing\n useItemPrice,\n useCartPricing,\n\n // Hooks -- inventory\n useInvMast,\n useInvMastDoc,\n useInvMastStock,\n\n // Hooks -- items & categories\n useItemCategory,\n useProductCategory,\n useItemDetails,\n useItemAttributes,\n\n // Hooks -- search\n useProductSearch,\n useSearchSuggestions,\n\n // Hooks -- cart\n useCartActions,\n useCartInitialization,\n\n // Hooks -- pagination & infinite scroll\n usePaginationPrefetch,\n useCategoryItemsInfinite,\n useItemSearchInfinite,\n\n // Hooks -- Joomla\n useJoomlaContent,\n useJoomlaContentList,\n\n // Hooks -- utilities\n useDebounce,\n useFormatPrice,\n };\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport type { PersistenceConfig } from \"../types\";\nimport { createPersister } from \"./create-persister\";\nimport { useStorageMonitor } from \"./use-storage-monitor\";\n\n/**\n * Returns a fully configured `persistOptions` object for use with\n * `PersistQueryClientProvider` from `@tanstack/react-query-persist-client`.\n *\n * Handles:\n * - SSR-safe persister creation (no-op on server)\n * - Map → Record serialization for localStorage compatibility\n * - Selective persistence (only successful queries matching persistableKeys)\n * - Per-key-prefix LRU eviction (via `limits`)\n * - Throttled writes to localStorage\n * - Hydration safety (maxAge: 0 until client mount)\n * - Storage monitoring with automatic eviction when over threshold\n * - Dev mode auto-buster (invalidates cache on each restart)\n *\n * @example\n * ```tsx\n * import { useAugurPersistence } from \"@simpleapps-com/augur-hooks\";\n *\n * function Providers({ children }) {\n * const [queryClient] = useState(() => new QueryClient({ ... }));\n * const persistOptions = useAugurPersistence({\n * key: \"my-site-cache\",\n * buster: \"1.0.0\",\n * persistableKeys: [\"price\", \"categories\", \"invMast\"],\n * limits: { invMast: 100 },\n * });\n *\n * return (\n * <PersistQueryClientProvider client={queryClient} persistOptions={persistOptions}>\n * <augur.Provider api={api} auth={auth}>\n * {children}\n * </augur.Provider>\n * </PersistQueryClientProvider>\n * );\n * }\n * ```\n */\nexport function useAugurPersistence(config: PersistenceConfig) {\n const [persister] = useState(() => createPersister(config));\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useStorageMonitor(config);\n\n const isDev = typeof process !== \"undefined\"\n && process.env?.NODE_ENV === \"development\";\n\n const { persistableKeys } = config;\n\n const dehydrateOptions = useMemo(() => ({\n shouldDehydrateQuery: (query: { queryKey: readonly unknown[]; state: { status: string } }) => {\n const key = query.queryKey;\n if (!Array.isArray(key) || key.length === 0) return false;\n if (query.state.status !== \"success\") return false;\n return persistableKeys.includes(key[0] as string);\n },\n }), [persistableKeys]);\n\n return {\n persister,\n maxAge: isMounted ? (config.maxAge ?? 24 * 60 * 60 * 1000) : 0,\n buster: isDev ? String(Date.now()) : (config.buster ?? \"\"),\n dehydrateOptions,\n };\n}\n","import type { PersistedClient } from \"@tanstack/react-query-persist-client\";\n\n/**\n * Serializes a PersistedClient to a JSON string.\n * Converts Map instances to plain objects for localStorage compatibility.\n */\nexport function serialize(data: PersistedClient): string {\n return JSON.stringify(data, (_key, value) => {\n if (value instanceof Map) return Object.fromEntries(value);\n return value;\n });\n}\n\n/**\n * Deserializes a JSON string back to a PersistedClient.\n */\nexport function deserialize(data: string): PersistedClient {\n return JSON.parse(data) as PersistedClient;\n}\n","import type { PersistedClient } from \"@tanstack/react-query-persist-client\";\n\ninterface QueryEntry {\n queryKey: readonly unknown[];\n queryHash: string;\n state: { dataUpdatedAt?: number };\n}\n\n/**\n * Applies per-key-prefix LRU limits to the queries in a PersistedClient.\n * For each prefix in `limits`, keeps only the N most-recently-updated queries.\n * Returns a shallow copy with trimmed queries; does not mutate the input.\n */\nexport function applyLimits(\n data: PersistedClient,\n limits: Record<string, number>,\n): PersistedClient {\n const queries = data.clientState?.queries;\n if (!queries || Object.keys(limits).length === 0) return data;\n\n const entries = queries as unknown as QueryEntry[];\n const unlimited: QueryEntry[] = [];\n const groups = new Map<string, QueryEntry[]>();\n\n for (const q of entries) {\n const prefix = Array.isArray(q.queryKey) ? q.queryKey[0] : undefined;\n if (typeof prefix === \"string\" && prefix in limits) {\n const group = groups.get(prefix) ?? [];\n group.push(q);\n groups.set(prefix, group);\n } else {\n unlimited.push(q);\n }\n }\n\n const kept: QueryEntry[] = [];\n for (const [prefix, group] of groups) {\n const limit = limits[prefix]!;\n const sorted = [...group].sort(\n (a, b) => (b.state.dataUpdatedAt ?? 0) - (a.state.dataUpdatedAt ?? 0),\n );\n kept.push(...sorted.slice(0, limit));\n }\n\n return {\n ...data,\n clientState: {\n ...data.clientState,\n queries: [...unlimited, ...kept] as unknown as typeof queries,\n },\n };\n}\n","import type {\n Persister,\n PersistedClient,\n} from \"@tanstack/react-query-persist-client\";\nimport type { PersistenceConfig } from \"../types\";\nimport { serialize, deserialize } from \"./serializer\";\nimport { applyLimits } from \"./apply-limits\";\n\n/** No-op persister for SSR environments where localStorage is unavailable. */\nconst noopPersister: Persister = {\n persistClient: async () => {},\n restoreClient: async () => undefined,\n removeClient: async () => {},\n};\n\n/**\n * Creates an SSR-safe localStorage persister with throttled writes and LRU limiting.\n *\n * On the server (typeof window === \"undefined\"), returns a no-op persister.\n * On the client, writes are throttled to avoid performance degradation.\n */\nexport function createPersister(config: PersistenceConfig): Persister {\n if (typeof window === \"undefined\") return noopPersister;\n\n const throttleMs = config.throttleMs ?? 1000;\n const limits = config.limits ?? {};\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pending: PersistedClient | undefined;\n\n function flush() {\n /* v8 ignore next -- defensive guard; pending is always set before timer starts */\n if (!pending) return;\n try {\n const limited = applyLimits(pending, limits);\n window.localStorage.setItem(config.key, serialize(limited));\n } catch {\n /* quota exceeded — silently skip */\n }\n pending = undefined;\n }\n\n return {\n persistClient(client: PersistedClient) {\n pending = client;\n if (!timer) {\n timer = setTimeout(() => {\n timer = undefined;\n flush();\n }, throttleMs);\n }\n },\n\n restoreClient() {\n try {\n const raw = window.localStorage.getItem(config.key);\n if (!raw) return undefined;\n return deserialize(raw);\n } catch {\n return undefined;\n }\n },\n\n removeClient() {\n window.localStorage.removeItem(config.key);\n },\n };\n}\n","import { useEffect } from \"react\";\nimport type { PersistenceConfig } from \"../types\";\n\nconst CHECK_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Monitors total localStorage size and evicts limited query families\n * when the threshold is exceeded.\n *\n * Eviction strategy: remove queries whose key prefix appears in `limits`,\n * starting with the largest family. If parsing fails, clears the entire\n * persistence key as a fallback.\n */\nexport function useStorageMonitor(config: PersistenceConfig): void {\n const { key, limits = {}, maxStorageMB = 3 } = config;\n const limitKeys = Object.keys(limits);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || limitKeys.length === 0) return;\n\n function evict() {\n const storage = window.localStorage;\n let totalSize = 0;\n\n for (const k of Object.keys(storage)) {\n const v = storage.getItem(k);\n if (v) totalSize += k.length + v.length;\n }\n\n // UTF-16: each char = 2 bytes\n const usedMB = (totalSize * 2) / 1024 / 1024;\n if (usedMB <= maxStorageMB) return;\n\n try {\n const raw = storage.getItem(key);\n if (!raw) return;\n const parsed = JSON.parse(raw);\n if (!parsed.clientState?.queries) return;\n\n // Remove all queries whose prefix is in limits\n parsed.clientState.queries = parsed.clientState.queries.filter(\n (q: { queryKey?: unknown[] }) => {\n if (!Array.isArray(q.queryKey)) return true;\n const prefix = q.queryKey[0];\n return typeof prefix !== \"string\" || !limitKeys.includes(prefix);\n },\n );\n\n storage.setItem(key, JSON.stringify(parsed));\n } catch {\n // Corrupted data — clear entirely\n storage.removeItem(key);\n }\n }\n\n evict();\n const id = setInterval(evict, CHECK_INTERVAL_MS);\n return () => clearInterval(id);\n }, [key, maxStorageMB, limitKeys.length]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-hooks/dist/index.cjs","../src/provider.tsx","../src/stores/cart-store.ts","../src/stores/items-filters-store.ts","../src/hooks/use-debounce.ts","../src/hooks/use-format-price.ts","../src/hooks/use-item-price.ts","../src/hooks/use-inv-mast-doc.ts","../src/hooks/use-item-category.ts","../src/hooks/use-inv-mast.ts","../src/hooks/use-inv-mast-stock.ts","../src/hooks/use-product-category.ts","../src/hooks/use-item-details.ts","../src/hooks/use-item-attributes.ts","../src/hooks/use-product-search.ts","../src/hooks/use-search-suggestions.ts","../src/hooks/use-cart-actions.ts","../src/hooks/use-cart-initialization.ts","../src/hooks/use-cart-pricing.ts","../src/hooks/use-pagination-prefetch.ts","../src/hooks/use-category-items-infinite.ts","../src/hooks/use-item-search-infinite.ts","../src/hooks/use-joomla-content.ts","../src/hooks/use-joomla-content-list.ts","../src/create-site-hooks.ts","../src/persistence/use-persistence.ts","../src/persistence/serializer.ts","../src/persistence/apply-limits.ts","../src/persistence/create-persister.ts","../src/persistence/use-storage-monitor.ts"],"names":["create","devtools","useQuery","useEffect","useQueryClient","useMemo","useCallback","useInfiniteQuery","useState"],"mappings":"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AA;AACC,YAAA;AACT,UAAA;AACF,QAAA;AAEQ,QAAA;AACF,MAAA;AAEE,QAAA;AACV,MAAA;AACF,IAAA;AAEM,IAAA;AACK,IAAA;AACE,IAAA;AACN,EAAA;AACX;A7BigCuB;AACA;AyBnhCP;AACMK,EAAAA;AACF,EAAA;AAEF,EAAA;AACG,IAAA;AACd,EAAA;AAEa,EAAA;AAEG,EAAA;AAGb,EAAA;AAEF,EAAA;AACJ,IAAA;AACc,MAAA;AACD,MAAA;AACK,MAAA;AACT,MAAA;AACT,IAAA;AACmB,EAAA;AAEd,EAAA;AACL,IAAA;AACQ,IAAA;AACQ,IAAA;AAChB,IAAA;AACF,EAAA;AACF;AzB8gCuB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-hooks/dist/index.cjs","sourcesContent":[null,"import { createContext, useContext, type ReactNode } from \"react\";\nimport type { AugurCallbacks, AugurAuthContext } from \"./callbacks\";\nimport type { CacheConfig } from \"./types\";\n\n/**\n * Minimal type for the augur-api SDK instance.\n * Consumers provide their concrete AugurAPI instance; we keep the type\n * loose so augur-hooks doesn't need to depend directly on the SDK package.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AugurApiClient = any;\n\ninterface AugurHooksProviderProps {\n /** SDK client instance. Optional when all data fetching is routed through callbacks. */\n api?: AugurApiClient;\n /** Optional callback registry for routing SDK calls through server actions. */\n callbacks?: AugurCallbacks;\n /** Optional auth context — hooks fall back to these values when not passed directly. */\n auth?: AugurAuthContext;\n /** Optional cache configuration — controls edge and Redis caching per tier. */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\nconst AugurApiContext = createContext<AugurApiClient | null>(null);\nconst AugurCallbacksContext = createContext<AugurCallbacks | undefined>(\n undefined,\n);\nconst AugurAuthReactContext = createContext<AugurAuthContext | undefined>(\n undefined,\n);\nconst AugurCacheContext = createContext<CacheConfig | undefined>(undefined);\n\n/**\n * Provides the augur-api SDK instance and optional callbacks to all hooks.\n *\n * ```tsx\n * // With SDK client:\n * <AugurHooksProvider api={api}>\n * <App />\n * </AugurHooksProvider>\n *\n * // With callbacks only (no client-side SDK needed):\n * <AugurHooksProvider\n * callbacks={{\n * getItemPrice: (id, cust, qty) => getItemPriceAction(id, cust, qty),\n * }}\n * auth={{ status, customerId, userId, cartHdrUid }}\n * >\n * <App />\n * </AugurHooksProvider>\n * ```\n */\nexport function AugurHooksProvider({\n api,\n callbacks,\n auth,\n cache,\n children,\n}: AugurHooksProviderProps) {\n if (process.env.NODE_ENV === \"development\" && !api && !callbacks) {\n console.warn(\n \"AugurHooksProvider: neither `api` nor `callbacks` provided. \" +\n \"Hooks will fail at runtime unless every hook receives a queryFn override.\",\n );\n }\n\n return (\n <AugurApiContext.Provider value={api ?? null}>\n <AugurCallbacksContext.Provider value={callbacks}>\n <AugurAuthReactContext.Provider value={auth}>\n <AugurCacheContext.Provider value={cache}>\n {children}\n </AugurCacheContext.Provider>\n </AugurAuthReactContext.Provider>\n </AugurCallbacksContext.Provider>\n </AugurApiContext.Provider>\n );\n}\n\n/**\n * Returns the augur-api SDK instance from context, or null if not provided.\n * Used internally by hooks that check for callback overrides first.\n */\nexport function useAugurApiOptional(): AugurApiClient | null {\n return useContext(AugurApiContext);\n}\n\n/**\n * Returns the augur-api SDK instance from context.\n * Throws if called outside of `<AugurHooksProvider>` or when no api is provided.\n */\nexport function useAugurApi(): AugurApiClient {\n const api = useContext(AugurApiContext);\n if (!api) {\n throw new Error(\n \"useAugurApi must be used within an <AugurHooksProvider>. \" +\n \"Wrap your app with <AugurHooksProvider api={apiInstance}>.\",\n );\n }\n return api;\n}\n\n/**\n * Returns the provider-level callback registry, if any.\n * Used internally by hooks to check for server action overrides.\n */\nexport function useAugurCallbacks(): AugurCallbacks | undefined {\n return useContext(AugurCallbacksContext);\n}\n\n/**\n * Returns the provider-level auth context, if any.\n * Used internally by hooks to fall back to provider auth when\n * auth fields are not passed directly as hook parameters.\n */\nexport function useAugurAuth(): AugurAuthContext | undefined {\n return useContext(AugurAuthReactContext);\n}\n\n/**\n * Returns the provider-level cache configuration, if any.\n * Used internally by hooks to enable edge/Redis caching.\n */\nexport function useAugurCache(): CacheConfig | undefined {\n return useContext(AugurCacheContext);\n}\n","import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport type { TCartLine } from \"@simpleapps-com/augur-utils\";\n\ninterface CartState {\n cartHdrUid: number | string | undefined;\n cartLines: TCartLine[];\n cartQuantityTotal: number;\n cartLineCount: number;\n setCartHdrUid: (cartHdrUid: number | string | undefined) => void;\n setCartLines: (cartLines: TCartLine[]) => void;\n clearCart: () => void;\n}\n\nexport const useCartStore = create<CartState>()(\n devtools(\n (set) => ({\n cartHdrUid: undefined,\n cartLines: [],\n cartQuantityTotal: 0,\n cartLineCount: 0,\n\n setCartHdrUid: (cartHdrUid) =>\n set({ cartHdrUid }, false, \"setCartHdrUid\"),\n\n setCartLines: (cartLines) => {\n const cartQuantityTotal = cartLines.reduce(\n (sum, line) => sum + (line.quantity || 0),\n 0,\n );\n const cartLineCount = cartLines.length;\n set({ cartLines, cartQuantityTotal, cartLineCount }, false, \"setCartLines\");\n },\n\n clearCart: () =>\n set(\n { cartHdrUid: undefined, cartLines: [], cartQuantityTotal: 0, cartLineCount: 0 },\n false,\n \"clearCart\",\n ),\n }),\n { name: \"CartStore\", enabled: process.env.NODE_ENV === \"development\" },\n ),\n);\n\n// Selector hooks -- only re-render when specific state changes\nexport const useCartHdrUid = () => useCartStore((s) => s.cartHdrUid);\nexport const useCartLines = () => useCartStore((s) => s.cartLines);\nexport const useCartQuantityTotal = () => useCartStore((s) => s.cartQuantityTotal);\nexport const useCartLineCount = () => useCartStore((s) => s.cartLineCount);\nexport const useSetCartHdrUid = () => useCartStore((s) => s.setCartHdrUid);\nexport const useSetCartLines = () => useCartStore((s) => s.setCartLines);\nexport const useClearCart = () => useCartStore((s) => s.clearCart);\n","import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport type { TItemsFilters } from \"@simpleapps-com/augur-utils\";\n\nconst DEFAULT_FILTER_STATE: TItemsFilters = {\n filters: [],\n limit: 12,\n offset: 0,\n sortBy: \"asc\",\n q: \"\",\n page: 1,\n};\n\ninterface ItemsFiltersState {\n initialFiltersState: TItemsFilters;\n itemsFilters: TItemsFilters;\n setItemsFilters: (itemFilters: TItemsFilters) => void;\n}\n\nexport const useItemFiltersStore = create<ItemsFiltersState>()(\n devtools(\n (set) => ({\n initialFiltersState: DEFAULT_FILTER_STATE,\n itemsFilters: DEFAULT_FILTER_STATE,\n setItemsFilters: (state) =>\n set({ itemsFilters: state }, false, \"setItemsFilters\"),\n }),\n {\n name: \"ItemsFiltersStore\",\n enabled: process.env.NODE_ENV === \"development\",\n },\n ),\n);\n","import { useEffect, useState } from \"react\";\n\n/**\n * Debounces a rapidly-changing value.\n * Returns the latest value only after `delay` ms of inactivity.\n */\nexport function useDebounce<T>(value: T, delay: number = 500): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","/**\n * Hook that returns a price formatter.\n * Wraps Intl.NumberFormat with configurable locale/currency.\n */\nexport function useFormatPrice(\n locale: string = \"en-US\",\n currency: string = \"USD\",\n) {\n const formatPrice = (price: number): string => {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(price);\n };\n\n return { formatPrice };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurAuth, useAugurCache } from \"../provider\";\nimport {\n getItemPriceKey,\n getItemPriceOptions,\n} from \"../queries/item-price\";\n\nexport { getItemPriceKey, getItemPriceOptions };\n\ninterface UseItemPriceOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TPriceData>;\n}\n\n/**\n * Fetches and caches item pricing via the augur-api SDK.\n *\n * Pass `options.queryFn` to override with a cached server action:\n * ```ts\n * useItemPrice(itemId, customerId, 1, {\n * queryFn: () => getItemPriceCached(itemId, customerId, 1),\n * });\n * ```\n */\nexport function useItemPrice(\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n options: UseItemPriceOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const auth = useAugurAuth();\n const cache = useAugurCache();\n const effectiveCustomerId = customerId ?? auth?.customerId;\n const defaultOptions = getItemPriceOptions(api, itemId, effectiveCustomerId, quantity, cache);\n\n const resolvedQueryFn = options.queryFn\n ?? (callbacks?.getItemPrice\n ? () => callbacks.getItemPrice!(itemId!, effectiveCustomerId!, quantity)\n : undefined);\n\n return useQuery({\n ...defaultOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: options.enabled ?? (Boolean(itemId) && Boolean(effectiveCustomerId)),\n retry: 3,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TInvMastDoc } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getInvMastDocKey,\n getInvMastDocOptions,\n} from \"../queries/inv-mast-doc\";\n\nexport { getInvMastDocKey, getInvMastDocOptions };\n\ninterface UseInvMastDocOptions {\n enabled?: boolean;\n includePricing?: \"Y\" | \"N\";\n /** Initial data from server -- enables instant render without loading state. */\n initialData?: TInvMastDoc;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TInvMastDoc>;\n}\n\n/**\n * Fetches and caches an inventory master document via the augur-api SDK.\n */\nexport function useInvMastDoc(\n invMastUid: number,\n itemId: string,\n options: UseInvMastDocOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getInvMastDocOptions(\n api,\n invMastUid,\n itemId,\n options.includePricing ?? \"N\",\n cache,\n );\n\n const { data, isLoading, error } = useQuery<TInvMastDoc, Error>({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getInvMastDoc\n ? { queryFn: options.queryFn ?? (() => callbacks!.getInvMastDoc!(invMastUid, itemId, options.includePricing ?? \"N\")) }\n : {}),\n enabled: options.enabled ?? true,\n initialData: options.initialData,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { GetItemCategoryApiOptions } from \"../types\";\nimport {\n getItemCategoryKey,\n getItemCategoryOptions,\n} from \"../queries/item-category\";\n\nexport { getItemCategoryKey, getItemCategoryOptions };\n\ntype ItemCategoryQueryKey = readonly [\n \"itemCategory\",\n number,\n GetItemCategoryApiOptions | undefined,\n];\n\ninterface UseItemCategoryOptions {\n enabled?: boolean;\n apiOptions?: GetItemCategoryApiOptions;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TCategory>;\n}\n\n/**\n * Fetches and caches item category data via the augur-api SDK.\n */\nexport function useItemCategory(\n itemCategoryUid: number,\n options: UseItemCategoryOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getItemCategoryOptions(\n api,\n itemCategoryUid,\n options.apiOptions,\n cache,\n );\n\n const { data, isLoading, error } = useQuery<\n TCategory,\n Error,\n TCategory,\n ItemCategoryQueryKey\n >({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getItemCategory\n ? { queryFn: options.queryFn ?? (() => callbacks!.getItemCategory!(itemCategoryUid, options.apiOptions)) }\n : {}),\n enabled: options.enabled ?? true,\n });\n\n return { category: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getInvMastKey,\n getInvMastOptions,\n} from \"../queries/inv-mast\";\n\nexport { getInvMastKey, getInvMastOptions };\n\ninterface UseInvMastOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport function useInvMast(\n invMastUid: number,\n itemId: string,\n options: UseInvMastOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getInvMastOptions(api, invMastUid, itemId, cache);\n\n const { data, isLoading, error } = useQuery<TItemDetails, Error>({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getInvMast\n ? { queryFn: options.queryFn ?? (() => callbacks!.getInvMast!(invMastUid, itemId)) }\n : {}),\n enabled: options.enabled ?? true,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getInvMastStockKey,\n getInvMastStockOptions,\n} from \"../queries/inv-mast-stock\";\n\nexport { getInvMastStockKey, getInvMastStockOptions };\n\ninterface UseInvMastStockOptions {\n enabled?: boolean;\n queryFn?: () => Promise<number>;\n}\n\nexport function useInvMastStock(\n invMastUid: number | string,\n options: UseInvMastStockOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const queryOpts = getInvMastStockOptions(api, invMastUid, cache);\n\n const { data, isLoading, error } = useQuery({\n ...queryOpts,\n ...(options.queryFn ?? callbacks?.getInvMastStock\n ? { queryFn: options.queryFn ?? (() => callbacks!.getInvMastStock!(invMastUid)) }\n : {}),\n enabled: (options.enabled ?? true) && !!invMastUid,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n qtyOnHand: data ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getProductCategoryKey,\n getProductCategoryOptions,\n} from \"../queries/product-category\";\n\nexport { getProductCategoryKey, getProductCategoryOptions };\n\ntype ProductCategoryResponse = {\n itemCategoryDesc: string;\n childrenTotal: number;\n children: unknown[];\n categoryImage: string | null;\n};\n\ninterface UseProductCategoryOptions {\n enabled?: boolean;\n queryFn?: () => Promise<ProductCategoryResponse>;\n}\n\nfunction resolveData(data: ProductCategoryResponse | undefined) {\n return {\n childrenTotal: data?.childrenTotal ?? 0,\n itemCategoryDesc: data?.itemCategoryDesc ?? \"\",\n productCategories: data?.children ?? null,\n productCategoryImage: data?.categoryImage ?? null,\n };\n}\n\nexport function useProductCategory(\n itemCategoryUid: number | string | null,\n options: UseProductCategoryOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const baseOptions = itemCategoryUid\n ? getProductCategoryOptions(api, itemCategoryUid, cache)\n : {\n queryKey: getProductCategoryKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n };\n\n const resolvedQueryFn = options.queryFn\n ?? (callbacks?.getProductCategory\n ? () => callbacks.getProductCategory!(itemCategoryUid!)\n : undefined);\n\n const { data, isLoading, error } = useQuery({\n ...baseOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: (options.enabled ?? true) && !!itemCategoryUid,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n ...resolveData(data),\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport {\n getItemDetailsKey,\n getItemDetailsOptions,\n} from \"../queries/item-details\";\n\nexport { getItemDetailsKey, getItemDetailsOptions };\n\ninterface UseItemDetailsOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport function useItemDetails(\n itemId: number | string | undefined,\n options: UseItemDetailsOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(itemId\n ? getItemDetailsOptions(api, itemId, cache)\n : { queryKey: getItemDetailsKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ?? callbacks?.getItemDetails\n ? { queryFn: options.queryFn ?? (() => callbacks!.getItemDetails!(itemId!)) }\n : {}),\n enabled: (options.enabled ?? true) && !!itemId,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n const categoryList = data?.categoryList ?? [];\n\n return {\n itemCategoryUid:\n categoryList.length > 0 ? categoryList[categoryList.length - 1] : null,\n itemDetails: data ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TAttribute } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getItemAttributesKey,\n getItemAttributesOptions,\n} from \"../queries/item-attributes\";\n\nexport { getItemAttributesKey, getItemAttributesOptions };\n\ninterface UseItemAttributesOptions {\n enabled?: boolean;\n queryFn?: () => Promise<{ attributes: TAttribute[] }>;\n}\n\nexport function useItemAttributes(\n itemCategoryUid: number | string | null,\n options: UseItemAttributesOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getItemAttributesOptions(api, itemCategoryUid, cache)\n : {\n queryKey: getItemAttributesKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n }),\n ...(options.queryFn ?? callbacks?.getItemAttributes\n ? { queryFn: options.queryFn ?? (() => callbacks!.getItemAttributes!(itemCategoryUid!)) }\n : {}),\n enabled: (options.enabled ?? true) && !!itemCategoryUid,\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n attributes: data?.attributes ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { PageData } from \"../types\";\nimport {\n getProductSearchKey,\n getProductSearchOptions,\n} from \"../queries/product-search\";\n\nexport { getProductSearchKey, getProductSearchOptions };\n\ntype ProductSearchResponse = {\n items: unknown[];\n totalResults: number;\n};\n\ninterface UseProductSearchOptions {\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<ProductSearchResponse>;\n}\n\n/**\n * Searches products via the augur-api OpenSearch endpoint.\n * Replaces the ampro-online pattern of fetching from a Next.js API route.\n */\nexport function useProductSearch(\n pageData: PageData,\n options: UseProductSearchOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const defaultOptions = getProductSearchOptions(api, pageData, cache);\n\n const { data, isLoading, error } = useQuery({\n ...defaultOptions,\n ...(options.queryFn ?? callbacks?.getProductSearch\n ? { queryFn: options.queryFn ?? (() => callbacks!.getProductSearch!(pageData)) }\n : {}),\n retry: 3,\n /* v8 ignore start */\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 10000),\n /* v8 ignore stop */\n });\n\n return {\n productItems: data?.items ?? null,\n total: data?.totalResults ?? 0,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport type { SearchSuggestionsResponse } from \"../types\";\nimport {\n getSearchSuggestionsKey,\n getSearchSuggestionsOptions,\n} from \"../queries/search-suggestions\";\n\nexport { getSearchSuggestionsKey, getSearchSuggestionsOptions };\n\ninterface UseSearchSuggestionsOptions {\n enabled?: boolean;\n limit?: number;\n offset?: number;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<SearchSuggestionsResponse>;\n}\n\n/**\n * Fetches search suggestions via the augur-api OpenSearch endpoint.\n * Replaces the ampro-online pattern of fetching from a Next.js API route.\n */\nexport function useSearchSuggestions(\n query: string,\n options: UseSearchSuggestionsOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const limit = options.limit ?? 10;\n const offset = options.offset ?? 0;\n const enabled = (options.enabled ?? true) && query.trim().length > 0;\n\n const defaultOptions = getSearchSuggestionsOptions(api, query, limit, offset, cache);\n\n const { data, isLoading, error } = useQuery<\n SearchSuggestionsResponse,\n Error\n >({\n ...defaultOptions,\n ...(options.queryFn ?? callbacks?.getSearchSuggestions\n ? { queryFn: options.queryFn ?? (() => callbacks!.getSearchSuggestions!(query, limit, offset)) }\n : {}),\n enabled,\n });\n\n return {\n suggestions: data?.data ?? [],\n total: data?.total ?? 0,\n isLoading,\n error,\n };\n}\n","import { useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useCartLines,\n useSetCartLines,\n} from \"../stores/cart-store\";\n\ntype CartLineInput = Pick<\n TCartLine,\n \"invMastUid\" | \"quantity\" | \"unitOfMeasure\"\n> & {\n cartHdrUid?: number | string | undefined;\n};\n\n/** Site-specific callbacks injected into useCartActions. */\nexport interface CartActionCallbacks {\n /** Add items to cart via API. Truthy = success, falsy = failure. */\n addToCart: (\n cartHdrUid: number,\n items: Array<{\n cartHdrUid: number;\n invMastUid: number;\n quantity: number;\n unitOfMeasure: string;\n }>,\n ) => Promise<boolean | undefined | void>;\n /** Update cart lines via API. Truthy = success, falsy = failure. */\n updateCartLines: (\n cartHdrUid: number,\n lines: TCartLine[],\n ) => Promise<boolean | undefined | void>;\n /** Delete all items from cart via API. Truthy = success, falsy = failure. */\n deleteItemsFromCart: (cartHdrUid: number) => Promise<boolean | undefined | void>;\n /** Optional toast notification callback. */\n toast?: {\n info?: (message: string) => void;\n error?: (message: string) => void;\n success?: (message: string) => void;\n };\n}\n\ninterface CartActionOptions {\n showToast?: boolean;\n itemId?: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction requireCartUid(\n cartHdrUid: string | number | undefined,\n): number {\n const num = typeof cartHdrUid === \"string\" ? Number(cartHdrUid) : cartHdrUid;\n if (!num) throw new Error(\"Cart UID is not set\");\n return num;\n}\n\nfunction buildOptimisticAdd(\n cartLines: TCartLine[],\n item: CartLineInput,\n cartHdrUid: number,\n itemId: string,\n): TCartLine[] {\n const existingIndex = cartLines.findIndex(\n (line) => line.invMastUid === item.invMastUid,\n );\n\n if (existingIndex >= 0) {\n return cartLines.map((line, index) =>\n index === existingIndex\n ? { ...line, quantity: line.quantity + item.quantity }\n : line,\n );\n }\n\n return [\n ...cartLines,\n {\n cartHdrUid,\n invMastUid: item.invMastUid,\n invMastUidCount: 1,\n isAssembly: \"N\",\n itemId,\n lineNo: cartLines.length + 1,\n lineNote: null,\n quantity: item.quantity,\n unitOfMeasure: item.unitOfMeasure,\n },\n ];\n}\n\n/**\n * Optimistic cart actions hook with automatic rollback on failure.\n *\n * Accepts site-specific server action callbacks so the hook itself\n * has no dependency on any particular server action implementation.\n *\n * @example\n * ```tsx\n * import { useCartActions } from \"@simpleapps-com/augur-hooks\";\n * import { addToCart, updateCartLines, deleteItemsFromCart } from \"@/lib/actions/commerce\";\n * import { toast } from \"react-toastify\";\n *\n * const cart = useCartActions({\n * addToCart, updateCartLines, deleteItemsFromCart,\n * toast: { info: toast.info, error: toast.error },\n * });\n *\n * await cart.addToCart({ invMastUid: 123, quantity: 1, unitOfMeasure: \"EA\" });\n * ```\n */\nexport function useCartActions(callbacks: CartActionCallbacks) {\n const queryClient = useQueryClient();\n const cartHdrUid = useCartHdrUid();\n const cartLines = useCartLines();\n const setCartLines = useSetCartLines();\n const notify = callbacks.toast;\n\n const invalidateCartCache = useCallback(() => {\n queryClient.invalidateQueries({ queryKey: [\"cartLines\", cartHdrUid] });\n queryClient.invalidateQueries({\n queryKey: [\"cart-also-bought\", cartHdrUid],\n });\n }, [queryClient, cartHdrUid]);\n\n const addToCart = useCallback(\n async (\n item: CartLineInput,\n options: CartActionOptions = {},\n ): Promise<boolean> => {\n const { showToast = true, itemId = \"\", onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n\n setCartLines(buildOptimisticAdd(cartLines, item, uid, itemId));\n\n try {\n const success = await callbacks.addToCart(uid, [\n {\n cartHdrUid: uid,\n invMastUid: item.invMastUid,\n quantity: item.quantity,\n unitOfMeasure: item.unitOfMeasure,\n },\n ]);\n if (!success) throw new Error(\"Failed to add item to cart\");\n\n invalidateCartCache();\n if (showToast && notify?.info) {\n notify.info(`${item.quantity} x ${itemId || \"Item\"} added to cart`);\n }\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to add item to cart. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const updateQuantity = useCallback(\n async (\n invMastUid: number,\n newQuantity: number,\n options: CartActionOptions = {},\n ): Promise<boolean> => {\n const { showToast = false, onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n\n const updatedLines = cartLines.map((line) =>\n line.invMastUid === invMastUid\n ? { ...line, quantity: newQuantity }\n : line,\n );\n setCartLines(updatedLines);\n\n try {\n const success = await callbacks.updateCartLines(uid, updatedLines);\n if (!success) throw new Error(\"Failed to update quantity\");\n\n invalidateCartCache();\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to update quantity. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const removeFromCart = useCallback(\n async (\n invMastUid: number,\n options: CartActionOptions = {},\n ): Promise<boolean> => {\n const { showToast = true, itemId = \"\", onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n\n setCartLines(cartLines.filter((line) => line.invMastUid !== invMastUid));\n\n try {\n const zeroedLines = cartLines.map((line) =>\n line.invMastUid === invMastUid ? { ...line, quantity: 0 } : line,\n );\n const success = await callbacks.updateCartLines(uid, zeroedLines);\n if (!success) throw new Error(\"Failed to remove item\");\n\n invalidateCartCache();\n if (showToast && notify?.info) {\n notify.info(`${itemId || \"Item\"} removed from cart`);\n }\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to remove item. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const clearCart = useCallback(\n async (options: Omit<CartActionOptions, \"itemId\"> = {}): Promise<boolean> => {\n const { showToast = true, onSuccess, onError } = options;\n const uid = requireCartUid(cartHdrUid);\n const previousCartLines = [...cartLines];\n setCartLines([]);\n\n try {\n const success = await callbacks.deleteItemsFromCart(uid);\n if (!success) throw new Error(\"Failed to clear cart\");\n\n invalidateCartCache();\n if (showToast && notify?.info) {\n notify.info(\"Cart cleared\");\n }\n onSuccess?.();\n return true;\n } catch (error) {\n setCartLines(previousCartLines);\n if (showToast && notify?.error) {\n notify.error(\"Failed to clear cart. Please try again.\");\n }\n onError?.(error as Error);\n return false;\n }\n },\n [cartHdrUid, cartLines, setCartLines, invalidateCartCache, callbacks, notify],\n );\n\n const isInCart = useCallback(\n (invMastUid: number): boolean => {\n return cartLines.some((line) => line.invMastUid === invMastUid);\n },\n [cartLines],\n );\n\n const getItemQuantity = useCallback(\n (invMastUid: number): number => {\n return cartLines.find((line) => line.invMastUid === invMastUid)?.quantity ?? 0;\n },\n [cartLines],\n );\n\n return {\n addToCart,\n updateQuantity,\n removeFromCart,\n clearCart,\n isInCart,\n getItemQuantity,\n cartHdrUid,\n cartLines,\n invalidateCartCache,\n };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type { TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useSetCartHdrUid,\n useSetCartLines,\n useClearCart,\n} from \"../stores/cart-store\";\nimport { useAugurAuth } from \"../provider\";\n\nconst MAX_RETRY_ATTEMPTS = 7;\nconst RETRY_DELAY_MS = 1000;\n\n/** Session info passed from the consumer's auth system. */\nexport interface CartSessionInfo {\n /** Auth status: \"loading\" | \"authenticated\" | \"unauthenticated\" */\n status: \"loading\" | \"authenticated\" | \"unauthenticated\";\n /** User's ID (e.g., Joomla user ID). Undefined if not authenticated. */\n userId?: string | number;\n /** Cart header UID from the auth session, if available. */\n cartHdrUid?: number | string;\n}\n\n/** Site-specific callbacks injected into useCartInitialization. */\nexport interface CartInitCallbacks {\n /** Look up or create a cart header. Returns { cartHdrUid, cartToken? }. */\n cartHdrLookup: (\n userId: string | number,\n cartToken: string,\n ) => Promise<{ cartHdrUid: number; cartToken?: string | null } | null | undefined>;\n /** Fetch cart line items for a given cart header UID. */\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[] | undefined>;\n /** Get the current cart token from cookies. */\n getCartToken: () => string | null;\n /** Save cart token to cookies. */\n saveCartToken: (token: string) => void;\n /** Generate a new unique cart token (e.g., uuidv4). */\n generateCartToken: () => string;\n}\n\n/**\n * Initialize cart state from session (authenticated) or cookie (guest).\n * Call once in the root layout.\n *\n * @example\n * ```tsx\n * import { useCartInitialization } from \"@simpleapps-com/augur-hooks\";\n * import { useSession } from \"next-auth/react\";\n * import { cartHdrLookup, getCartLines } from \"@/lib/actions/commerce\";\n * import { getCookie, setCookie } from \"cookies-next/client\";\n * import { v4 as uuidv4 } from \"uuid\";\n *\n * function CartInitializer() {\n * const { data: session, status } = useSession();\n *\n * useCartInitialization(\n * {\n * status,\n * userId: session?.user?.id,\n * cartHdrUid: session?.user?.cartHdrUid,\n * },\n * {\n * cartHdrLookup,\n * getCartLines,\n * getCartToken: () => getCookie(\"cartToken\") as string | null,\n * saveCartToken: (token) => setCookie(\"cartToken\", token, { maxAge: 604800, path: \"/\" }),\n * generateCartToken: uuidv4,\n * },\n * );\n *\n * return null;\n * }\n * ```\n */\nexport function useCartInitialization(\n session: CartSessionInfo,\n callbacks: CartInitCallbacks,\n) {\n const auth = useAugurAuth();\n const cartHdrUid = useCartHdrUid();\n const setCartHdrUid = useSetCartHdrUid();\n const setCartLines = useSetCartLines();\n const clearCart = useClearCart();\n const queryClient = useQueryClient();\n\n // Merge session with provider auth — session fields take priority\n const effectiveStatus = session.status;\n const effectiveUserId = session.userId ?? auth?.userId;\n const effectiveCartHdrUid = session.cartHdrUid ?? auth?.cartHdrUid;\n const effectiveSession = useMemo<CartSessionInfo>(\n () => ({ status: effectiveStatus, userId: effectiveUserId, cartHdrUid: effectiveCartHdrUid }),\n [effectiveStatus, effectiveUserId, effectiveCartHdrUid],\n );\n\n const retryCountRef = useRef(0);\n const isInitializingRef = useRef(false);\n const prevStatusRef = useRef(effectiveSession.status);\n\n // Auto-clear cart on logout (authenticated → unauthenticated)\n useEffect(() => {\n const prevStatus = prevStatusRef.current;\n prevStatusRef.current = effectiveSession.status;\n\n if (\n prevStatus === \"authenticated\" &&\n effectiveSession.status === \"unauthenticated\"\n ) {\n clearCart();\n queryClient.removeQueries({ queryKey: [\"cartLines\"] });\n queryClient.removeQueries({ queryKey: [\"cart-also-bought\"] });\n }\n }, [effectiveSession.status, clearCart, queryClient]);\n\n // Initialize cart header\n useEffect(() => {\n if (cartHdrUid || effectiveSession.status === \"loading\") return;\n\n // Authenticated user — use session cartHdrUid\n if (effectiveSession.cartHdrUid && effectiveSession.status === \"authenticated\") {\n setCartHdrUid(effectiveSession.cartHdrUid);\n return;\n }\n\n // Guest user — lookup/create cart\n if (effectiveSession.status === \"unauthenticated\" && !isInitializingRef.current) {\n isInitializingRef.current = true;\n retryCountRef.current = 0;\n\n const initializeGuestCart = async () => {\n const existingToken = callbacks.getCartToken();\n const cartToken =\n existingToken && typeof existingToken === \"string\"\n ? existingToken\n : callbacks.generateCartToken();\n\n while (retryCountRef.current < MAX_RETRY_ATTEMPTS) {\n try {\n const cartHdr = await callbacks.cartHdrLookup(\"0\", cartToken);\n\n if (cartHdr && cartHdr.cartHdrUid !== 0) {\n callbacks.saveCartToken(cartToken);\n setCartHdrUid(cartHdr.cartHdrUid);\n isInitializingRef.current = false;\n return;\n }\n\n retryCountRef.current++;\n\n if (retryCountRef.current < MAX_RETRY_ATTEMPTS) {\n const delay = Math.min(\n RETRY_DELAY_MS * Math.pow(1.5, retryCountRef.current),\n 10000,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n } catch (error) {\n console.error(\n `Cart initialization attempt ${retryCountRef.current + 1} failed:`,\n error,\n );\n retryCountRef.current++;\n\n if (retryCountRef.current < MAX_RETRY_ATTEMPTS) {\n const delay = Math.min(\n RETRY_DELAY_MS * Math.pow(1.5, retryCountRef.current),\n 10000,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n console.error(\n `Cart initialization failed after ${MAX_RETRY_ATTEMPTS} attempts`,\n );\n isInitializingRef.current = false;\n };\n\n initializeGuestCart();\n }\n }, [effectiveSession, cartHdrUid, setCartHdrUid, callbacks]);\n\n // Fetch cart lines when cartHdrUid is available\n const { data: cartLinesData } = useQuery({\n queryKey: [\"cartLines\", cartHdrUid],\n queryFn: async () => (await callbacks.getCartLines(Number(cartHdrUid))) ?? [],\n enabled: !!cartHdrUid,\n });\n\n // Sync cart lines to Zustand store\n useEffect(() => {\n if (cartLinesData) {\n setCartLines(cartLinesData);\n }\n }, [cartLinesData, setCartLines]);\n\n return {\n cartHdrUid,\n isInitializing: isInitializingRef.current,\n retryCount: retryCountRef.current,\n };\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useCartLines } from \"../stores/cart-store\";\nimport { getItemPriceOptions, getItemPriceKey } from \"../queries/item-price\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurAuth, useAugurCache } from \"../provider\";\nimport { getCartPricingQueryOptions } from \"../queries/cart-pricing\";\n\nexport { getCartPricingQueryOptions };\n\nexport interface CartPriceData {\n unitPrice: number;\n priceData: Record<string, unknown> | null;\n}\n\nexport interface CartPricingResult {\n /** Map of itemId -> price data (with quantity-specific pricing) */\n prices: Record<string, CartPriceData>;\n /** Get unit price for an item (returns 0 if not found) */\n getUnitPrice: (itemId: string) => number;\n /** Get total price for an item (unitPrice * quantity) */\n getItemTotal: (itemId: string, quantity: number) => number;\n /** Cart subtotal (sum of all item totals) */\n subtotal: number;\n /** True if any price is still loading */\n isLoading: boolean;\n /** True if all prices loaded successfully */\n isSuccess: boolean;\n /** True if any price failed to load */\n isError: boolean;\n}\n\ninterface UseCartPricingOptions {\n customerId?: string | number;\n /** Override per-item price fetching (e.g. with a server action). */\n queryFn?: (\n itemId: string,\n customerId: string | number,\n quantity: number,\n ) => Promise<TPriceData>;\n}\n\n/**\n * Centralized hook for cart/checkout pricing.\n *\n * Fetches prices for ALL cart items with their actual quantities\n * to support quantity-based price breaks. React Query dedupes\n * identical calls across components.\n */\nexport function useCartPricing(\n options: UseCartPricingOptions = {},\n): CartPricingResult {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const auth = useAugurAuth();\n const cache = useAugurCache();\n const cartLines = useCartLines();\n const customerId = options.customerId ?? auth?.customerId;\n\n const priceFn = options.queryFn ?? callbacks?.getItemPrice;\n\n const priceQueries = useQueries({\n queries: cartLines.map((line) => {\n const base = priceFn\n ? {\n queryKey: getItemPriceKey(line.itemId, customerId, line.quantity),\n queryFn: () => priceFn(line.itemId, customerId!, line.quantity),\n refetchOnReconnect: true,\n refetchOnWindowFocus: false,\n meta: { persist: true },\n }\n : getItemPriceOptions(api, line.itemId, customerId, line.quantity, cache);\n return {\n ...base,\n enabled: !!customerId && !!line.itemId,\n };\n }),\n });\n\n const prices = useMemo(() => {\n const map: Record<string, CartPriceData> = {};\n cartLines.forEach((line, index) => {\n const queryResult = priceQueries[index];\n if (queryResult?.data) {\n map[line.itemId.toUpperCase()] = {\n unitPrice: queryResult.data.unitPrice ?? 0,\n priceData: queryResult.data as Record<string, unknown>,\n };\n }\n });\n return map;\n }, [cartLines, priceQueries]);\n\n const getUnitPrice = useMemo(() => {\n return (itemId: string): number => {\n return prices[itemId?.toUpperCase()]?.unitPrice ?? 0;\n };\n }, [prices]);\n\n const getItemTotal = useMemo(() => {\n return (itemId: string, quantity: number): number => {\n return getUnitPrice(itemId) * quantity;\n };\n }, [getUnitPrice]);\n\n const subtotal = useMemo(() => {\n return cartLines.reduce((sum, line) => {\n const unitPrice = prices[line.itemId.toUpperCase()]?.unitPrice ?? 0;\n return sum + unitPrice * line.quantity;\n }, 0);\n }, [cartLines, prices]);\n\n const isLoading = priceQueries.some((q) => q.isLoading);\n const isSuccess = priceQueries.every((q) => q.isSuccess);\n const isError = priceQueries.some((q) => q.isError);\n\n return {\n prices,\n getUnitPrice,\n getItemTotal,\n subtotal,\n isLoading,\n isSuccess,\n isError,\n };\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback } from \"react\";\nimport type { QueryKey } from \"@tanstack/react-query\";\n\ninterface UsePaginationPrefetchOptions {\n /** Query key for the paginated data */\n queryKey: QueryKey;\n /** Function to fetch a page of data */\n queryFn: (offset: number) => Promise<unknown>;\n /** Number of items per page */\n pageSize: number;\n /** Custom query key builder. Receives the base key and offset, returns the full key. Default: [...queryKey, offset]. */\n queryKeyFn?: (baseKey: QueryKey, offset: number) => QueryKey;\n /** Stale time in ms (defaults to 10 minutes) */\n staleTime?: number;\n /** GC time in ms (defaults to 30 minutes) */\n gcTime?: number;\n enabled?: boolean;\n}\n\n/**\n * Prefetch adjacent pages on hover for instant pagination.\n * Accepts a generic queryFn so it works with any paginated resource.\n */\nexport const usePaginationPrefetch = ({\n queryKey,\n queryFn,\n pageSize,\n queryKeyFn,\n staleTime = 10 * 60 * 1000,\n gcTime = 30 * 60 * 1000,\n enabled = true,\n}: UsePaginationPrefetchOptions) => {\n const queryClient = useQueryClient();\n\n const prefetchPage = useCallback(\n async (page: number) => {\n if (!enabled) return;\n\n const offset = (page - 1) * pageSize;\n\n try {\n await queryClient.prefetchQuery({\n queryKey: queryKeyFn ? queryKeyFn(queryKey, offset) : [...queryKey, offset],\n queryFn: () => queryFn(offset),\n staleTime,\n gcTime,\n });\n } catch (error) {\n console.warn(`Error prefetching page ${page}:`, error);\n }\n },\n [queryKey, queryFn, pageSize, queryKeyFn, staleTime, gcTime, queryClient, enabled],\n );\n\n const handlePaginationHover = useCallback(\n (page: number) => {\n const timeoutId = setTimeout(() => prefetchPage(page), 150);\n return () => clearTimeout(timeoutId);\n },\n [prefetchPage],\n );\n\n return {\n prefetchPage,\n handlePaginationHover,\n };\n};\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { TItemsFilters } from \"@simpleapps-com/augur-utils\";\nimport type { InfiniteScrollPage } from \"../callbacks\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getCategoryItemsInfiniteKey,\n getCategoryItemsInfiniteOptions,\n} from \"../queries/category-items-infinite\";\n\nexport { getCategoryItemsInfiniteKey, getCategoryItemsInfiniteOptions };\n\ninterface UseCategoryItemsInfiniteOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a server action). */\n queryFn?: (context: { pageParam: unknown }) => Promise<InfiniteScrollPage>;\n}\n\n/**\n * Infinite scroll for category product listings.\n * Fetches pages of products via the augur-api SDK.\n */\nexport function useCategoryItemsInfinite(\n itemCategoryUid: number,\n itemsFilters: TItemsFilters,\n options: UseCategoryItemsInfiniteOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const { enabled = true } = options;\n\n const defaultOptions = getCategoryItemsInfiniteOptions(\n api,\n itemCategoryUid,\n itemsFilters,\n cache,\n );\n\n const cb = callbacks?.getCategoryItemsInfinite;\n const resolvedQueryFn = options.queryFn\n ?? (cb\n ? ({ pageParam }: { pageParam?: unknown }) =>\n cb({\n itemCategoryUid,\n itemsFilters,\n /* v8 ignore next */\n pageParam: (pageParam ?? 0) as number,\n })\n : undefined);\n\n return useInfiniteQuery<InfiniteScrollPage>({\n ...defaultOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: enabled && !!itemCategoryUid,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { TItemsFilters } from \"@simpleapps-com/augur-utils\";\nimport type { InfiniteScrollPage } from \"../callbacks\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getItemSearchInfiniteKey,\n getItemSearchInfiniteOptions,\n} from \"../queries/item-search-infinite\";\n\nexport { getItemSearchInfiniteKey, getItemSearchInfiniteOptions };\n\ninterface UseItemSearchInfiniteOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a server action). */\n queryFn?: (context: { pageParam: unknown }) => Promise<InfiniteScrollPage>;\n}\n\n/**\n * Infinite scroll for search results.\n * Fetches pages of products via the augur-api SDK OpenSearch endpoint.\n */\nexport function useItemSearchInfinite(\n itemsFilters: TItemsFilters,\n itemCategoryUid?: number | string,\n options: UseItemSearchInfiniteOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n const { enabled = true } = options;\n\n const defaultOptions = getItemSearchInfiniteOptions(\n api,\n itemsFilters,\n itemCategoryUid,\n cache,\n );\n\n const cb = callbacks?.getItemSearchInfinite;\n const resolvedQueryFn = options.queryFn\n ?? (cb\n ? ({ pageParam }: { pageParam?: unknown }) =>\n cb({\n itemsFilters,\n itemCategoryUid,\n /* v8 ignore next */\n pageParam: (pageParam ?? 0) as number,\n })\n : undefined);\n\n return useInfiniteQuery<InfiniteScrollPage>({\n ...defaultOptions,\n ...(resolvedQueryFn ? { queryFn: resolvedQueryFn } : {}),\n enabled: enabled && !!itemsFilters.q,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { TJoomlaContent } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getJoomlaContentKey,\n getJoomlaContentOptions,\n} from \"../queries/joomla-content\";\n\nexport { getJoomlaContentKey, getJoomlaContentOptions };\n\ninterface UseJoomlaContentOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TJoomlaContent>;\n}\n\nexport function useJoomlaContent(\n articleId: number | string | undefined,\n options: UseJoomlaContentOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(articleId\n ? getJoomlaContentOptions(api, articleId, cache)\n : { queryKey: getJoomlaContentKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ?? callbacks?.getJoomlaContent\n ? { queryFn: options.queryFn ?? (() => callbacks!.getJoomlaContent!(articleId!)) }\n : {}),\n enabled: (options.enabled ?? true) && !!articleId,\n });\n\n return {\n article: data ?? null,\n isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type {\n TJoomlaContent,\n TJoomlaContentFilters,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApiOptional, useAugurCallbacks, useAugurCache } from \"../provider\";\nimport {\n getJoomlaContentListKey,\n getJoomlaContentListOptions,\n} from \"../queries/joomla-content-list\";\n\nexport {\n getJoomlaContentListKey,\n getJoomlaContentListOptions,\n};\n\ninterface UseJoomlaContentListOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TJoomlaContent[]>;\n filters?: Partial<TJoomlaContentFilters>;\n}\n\nexport function useJoomlaContentList(\n categoryId: number | string | undefined,\n options: UseJoomlaContentListOptions = {},\n) {\n const api = useAugurApiOptional();\n const callbacks = useAugurCallbacks();\n const cache = useAugurCache();\n\n const { data, isLoading, error } = useQuery({\n ...(categoryId\n ? getJoomlaContentListOptions(api, categoryId, options.filters, cache)\n : { queryKey: getJoomlaContentListKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ?? callbacks?.getJoomlaContentList\n ? {\n queryFn:\n options.queryFn ??\n (() => callbacks!.getJoomlaContentList!(categoryId!, options.filters)),\n }\n : {}),\n enabled: (options.enabled ?? true) && !!categoryId,\n });\n\n return {\n articles: data ?? [],\n isLoading,\n error: error as Error | null,\n };\n}\n","/**\n * Factory function that creates a pre-configured provider + hook bundle,\n * eliminating per-hook wrapper boilerplate in consumer sites.\n *\n * @example\n * ```ts\n * // lib/augur.ts\n * import { createSiteHooks } from \"@simpleapps-com/augur-hooks\";\n * import { getItemPrice, getItemCategory } from \"@/lib/actions/pricing\";\n *\n * export const augur = createSiteHooks({\n * callbacks: { getItemPrice, getItemCategory },\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * });\n *\n * // app/layout.tsx\n * <augur.Provider api={api} auth={{ status, customerId, userId }}>\n * {children}\n * </augur.Provider>\n *\n * // components/price.tsx\n * const { data } = augur.useItemPrice(itemId);\n * ```\n */\n\nimport { createElement, type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"./provider\";\nimport type { AugurApiClient } from \"./provider\";\nimport type { AugurCallbacks, AugurAuthContext } from \"./callbacks\";\nimport type { CacheConfig } from \"./types\";\n\n// Hook imports\nimport { useItemPrice } from \"./hooks/use-item-price\";\nimport { useInvMastDoc } from \"./hooks/use-inv-mast-doc\";\nimport { useItemCategory } from \"./hooks/use-item-category\";\nimport { useInvMast } from \"./hooks/use-inv-mast\";\nimport { useInvMastStock } from \"./hooks/use-inv-mast-stock\";\nimport { useProductCategory } from \"./hooks/use-product-category\";\nimport { useItemDetails } from \"./hooks/use-item-details\";\nimport { useItemAttributes } from \"./hooks/use-item-attributes\";\nimport { useProductSearch } from \"./hooks/use-product-search\";\nimport { useSearchSuggestions } from \"./hooks/use-search-suggestions\";\nimport { useCartActions } from \"./hooks/use-cart-actions\";\nimport { useCartInitialization } from \"./hooks/use-cart-initialization\";\nimport { useCartPricing } from \"./hooks/use-cart-pricing\";\nimport { usePaginationPrefetch } from \"./hooks/use-pagination-prefetch\";\nimport { useCategoryItemsInfinite } from \"./hooks/use-category-items-infinite\";\nimport { useItemSearchInfinite } from \"./hooks/use-item-search-infinite\";\nimport { useDebounce } from \"./hooks/use-debounce\";\nimport { useFormatPrice } from \"./hooks/use-format-price\";\nimport { useJoomlaContent } from \"./hooks/use-joomla-content\";\nimport { useJoomlaContentList } from \"./hooks/use-joomla-content-list\";\n\nexport interface CreateSiteHooksConfig {\n /** Callback registry for routing SDK calls through server actions. */\n callbacks?: Partial<AugurCallbacks>;\n /** Default customer ID used when auth.customerId is not provided. */\n defaultCustomerId?: string | number;\n /** Cache configuration — controls edge and Redis caching per tier. */\n cache?: CacheConfig;\n}\n\nexport interface SiteHooksProviderProps {\n /** SDK client instance. Optional when all data fetching is routed through callbacks. */\n api?: AugurApiClient;\n /** Auth context (partial -- missing fields are filled from config defaults). */\n auth?: Partial<AugurAuthContext>;\n children: ReactNode;\n}\n\nexport interface SiteHooks {\n Provider: (props: SiteHooksProviderProps) => ReturnType<typeof createElement>;\n\n // Hooks -- pricing\n useItemPrice: typeof useItemPrice;\n useCartPricing: typeof useCartPricing;\n\n // Hooks -- inventory\n useInvMast: typeof useInvMast;\n useInvMastDoc: typeof useInvMastDoc;\n useInvMastStock: typeof useInvMastStock;\n\n // Hooks -- items & categories\n useItemCategory: typeof useItemCategory;\n useProductCategory: typeof useProductCategory;\n useItemDetails: typeof useItemDetails;\n useItemAttributes: typeof useItemAttributes;\n\n // Hooks -- search\n useProductSearch: typeof useProductSearch;\n useSearchSuggestions: typeof useSearchSuggestions;\n\n // Hooks -- cart\n useCartActions: typeof useCartActions;\n useCartInitialization: typeof useCartInitialization;\n\n // Hooks -- pagination & infinite scroll\n usePaginationPrefetch: typeof usePaginationPrefetch;\n useCategoryItemsInfinite: typeof useCategoryItemsInfinite;\n useItemSearchInfinite: typeof useItemSearchInfinite;\n\n // Hooks -- Joomla\n useJoomlaContent: typeof useJoomlaContent;\n useJoomlaContentList: typeof useJoomlaContentList;\n\n // Hooks -- utilities\n useDebounce: typeof useDebounce;\n useFormatPrice: typeof useFormatPrice;\n}\n\n/**\n * Creates a pre-configured provider component and re-exports all hooks.\n *\n * The returned `Provider` merges `config.defaultCustomerId` into the auth\n * context; an explicit `auth.customerId` prop takes priority.\n */\nexport function createSiteHooks(config: CreateSiteHooksConfig = {}): SiteHooks {\n const { callbacks, defaultCustomerId, cache } = config;\n\n function Provider({ api, auth, children }: SiteHooksProviderProps) {\n const mergedAuth: AugurAuthContext = {\n status: auth?.status ?? \"unauthenticated\",\n customerId: auth?.customerId ?? defaultCustomerId,\n userId: auth?.userId,\n cartHdrUid: auth?.cartHdrUid,\n };\n\n return createElement(AugurHooksProvider, {\n api,\n callbacks: callbacks as AugurCallbacks | undefined,\n auth: mergedAuth,\n cache,\n children,\n });\n }\n\n Provider.displayName = \"AugurSiteProvider\";\n\n return {\n Provider,\n\n // Hooks -- pricing\n useItemPrice,\n useCartPricing,\n\n // Hooks -- inventory\n useInvMast,\n useInvMastDoc,\n useInvMastStock,\n\n // Hooks -- items & categories\n useItemCategory,\n useProductCategory,\n useItemDetails,\n useItemAttributes,\n\n // Hooks -- search\n useProductSearch,\n useSearchSuggestions,\n\n // Hooks -- cart\n useCartActions,\n useCartInitialization,\n\n // Hooks -- pagination & infinite scroll\n usePaginationPrefetch,\n useCategoryItemsInfinite,\n useItemSearchInfinite,\n\n // Hooks -- Joomla\n useJoomlaContent,\n useJoomlaContentList,\n\n // Hooks -- utilities\n useDebounce,\n useFormatPrice,\n };\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport type { PersistenceConfig } from \"../types\";\nimport { createPersister } from \"./create-persister\";\nimport { useStorageMonitor } from \"./use-storage-monitor\";\n\n/**\n * Returns a fully configured `persistOptions` object for use with\n * `PersistQueryClientProvider` from `@tanstack/react-query-persist-client`.\n *\n * Handles:\n * - SSR-safe persister creation (no-op on server)\n * - Map → Record serialization for localStorage compatibility\n * - Selective persistence (only successful queries matching persistableKeys)\n * - Per-key-prefix LRU eviction (via `limits`)\n * - Throttled writes to localStorage\n * - Hydration safety (maxAge: 0 until client mount)\n * - Storage monitoring with automatic eviction when over threshold\n * - Dev mode auto-buster (invalidates cache on each restart)\n *\n * @example\n * ```tsx\n * import { useAugurPersistence } from \"@simpleapps-com/augur-hooks\";\n *\n * function Providers({ children }) {\n * const [queryClient] = useState(() => new QueryClient({ ... }));\n * const persistOptions = useAugurPersistence({\n * key: \"my-site-cache\",\n * buster: \"1.0.0\",\n * persistableKeys: [\"price\", \"categories\", \"invMast\"],\n * limits: { invMast: 100 },\n * });\n *\n * return (\n * <PersistQueryClientProvider client={queryClient} persistOptions={persistOptions}>\n * <augur.Provider api={api} auth={auth}>\n * {children}\n * </augur.Provider>\n * </PersistQueryClientProvider>\n * );\n * }\n * ```\n */\nexport function useAugurPersistence(config: PersistenceConfig) {\n const [persister] = useState(() => createPersister(config));\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useStorageMonitor(config);\n\n const isDev = typeof process !== \"undefined\"\n && process.env?.NODE_ENV === \"development\";\n\n const { persistableKeys } = config;\n\n const dehydrateOptions = useMemo(() => ({\n shouldDehydrateQuery: (query: { queryKey: readonly unknown[]; state: { status: string } }) => {\n const key = query.queryKey;\n if (!Array.isArray(key) || key.length === 0) return false;\n if (query.state.status !== \"success\") return false;\n return persistableKeys.includes(key[0] as string);\n },\n }), [persistableKeys]);\n\n return {\n persister,\n maxAge: isMounted ? (config.maxAge ?? 24 * 60 * 60 * 1000) : 0,\n buster: isDev ? String(Date.now()) : (config.buster ?? \"\"),\n dehydrateOptions,\n };\n}\n","import type { PersistedClient } from \"@tanstack/react-query-persist-client\";\n\n/**\n * Serializes a PersistedClient to a JSON string.\n * Converts Map instances to plain objects for localStorage compatibility.\n */\nexport function serialize(data: PersistedClient): string {\n return JSON.stringify(data, (_key, value) => {\n if (value instanceof Map) return Object.fromEntries(value);\n return value;\n });\n}\n\n/**\n * Deserializes a JSON string back to a PersistedClient.\n */\nexport function deserialize(data: string): PersistedClient {\n return JSON.parse(data) as PersistedClient;\n}\n","import type { PersistedClient } from \"@tanstack/react-query-persist-client\";\n\ninterface QueryEntry {\n queryKey: readonly unknown[];\n queryHash: string;\n state: { dataUpdatedAt?: number };\n}\n\n/**\n * Applies per-key-prefix LRU limits to the queries in a PersistedClient.\n * For each prefix in `limits`, keeps only the N most-recently-updated queries.\n * Returns a shallow copy with trimmed queries; does not mutate the input.\n */\nexport function applyLimits(\n data: PersistedClient,\n limits: Record<string, number>,\n): PersistedClient {\n const queries = data.clientState?.queries;\n if (!queries || Object.keys(limits).length === 0) return data;\n\n const entries = queries as unknown as QueryEntry[];\n const unlimited: QueryEntry[] = [];\n const groups = new Map<string, QueryEntry[]>();\n\n for (const q of entries) {\n const prefix = Array.isArray(q.queryKey) ? q.queryKey[0] : undefined;\n if (typeof prefix === \"string\" && prefix in limits) {\n const group = groups.get(prefix) ?? [];\n group.push(q);\n groups.set(prefix, group);\n } else {\n unlimited.push(q);\n }\n }\n\n const kept: QueryEntry[] = [];\n for (const [prefix, group] of groups) {\n const limit = limits[prefix]!;\n const sorted = [...group].sort(\n (a, b) => (b.state.dataUpdatedAt ?? 0) - (a.state.dataUpdatedAt ?? 0),\n );\n kept.push(...sorted.slice(0, limit));\n }\n\n return {\n ...data,\n clientState: {\n ...data.clientState,\n queries: [...unlimited, ...kept] as unknown as typeof queries,\n },\n };\n}\n","import type {\n Persister,\n PersistedClient,\n} from \"@tanstack/react-query-persist-client\";\nimport type { PersistenceConfig } from \"../types\";\nimport { serialize, deserialize } from \"./serializer\";\nimport { applyLimits } from \"./apply-limits\";\n\n/** No-op persister for SSR environments where localStorage is unavailable. */\nconst noopPersister: Persister = {\n persistClient: async () => {},\n restoreClient: async () => undefined,\n removeClient: async () => {},\n};\n\n/**\n * Creates an SSR-safe localStorage persister with throttled writes and LRU limiting.\n *\n * On the server (typeof window === \"undefined\"), returns a no-op persister.\n * On the client, writes are throttled to avoid performance degradation.\n */\nexport function createPersister(config: PersistenceConfig): Persister {\n if (typeof window === \"undefined\") return noopPersister;\n\n const throttleMs = config.throttleMs ?? 1000;\n const limits = config.limits ?? {};\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pending: PersistedClient | undefined;\n\n function flush() {\n /* v8 ignore next -- defensive guard; pending is always set before timer starts */\n if (!pending) return;\n try {\n const limited = applyLimits(pending, limits);\n window.localStorage.setItem(config.key, serialize(limited));\n } catch {\n /* quota exceeded — silently skip */\n }\n pending = undefined;\n }\n\n return {\n persistClient(client: PersistedClient) {\n pending = client;\n if (!timer) {\n timer = setTimeout(() => {\n timer = undefined;\n flush();\n }, throttleMs);\n }\n },\n\n restoreClient() {\n try {\n const raw = window.localStorage.getItem(config.key);\n if (!raw) return undefined;\n return deserialize(raw);\n } catch {\n return undefined;\n }\n },\n\n removeClient() {\n window.localStorage.removeItem(config.key);\n },\n };\n}\n","import { useEffect } from \"react\";\nimport type { PersistenceConfig } from \"../types\";\n\nconst CHECK_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Monitors total localStorage size and evicts limited query families\n * when the threshold is exceeded.\n *\n * Eviction strategy: remove queries whose key prefix appears in `limits`,\n * starting with the largest family. If parsing fails, clears the entire\n * persistence key as a fallback.\n */\nexport function useStorageMonitor(config: PersistenceConfig): void {\n const { key, limits = {}, maxStorageMB = 3 } = config;\n const limitKeys = Object.keys(limits);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || limitKeys.length === 0) return;\n\n function evict() {\n const storage = window.localStorage;\n let totalSize = 0;\n\n for (const k of Object.keys(storage)) {\n const v = storage.getItem(k);\n if (v) totalSize += k.length + v.length;\n }\n\n // UTF-16: each char = 2 bytes\n const usedMB = (totalSize * 2) / 1024 / 1024;\n if (usedMB <= maxStorageMB) return;\n\n try {\n const raw = storage.getItem(key);\n if (!raw) return;\n const parsed = JSON.parse(raw);\n if (!parsed.clientState?.queries) return;\n\n // Remove all queries whose prefix is in limits\n parsed.clientState.queries = parsed.clientState.queries.filter(\n (q: { queryKey?: unknown[] }) => {\n if (!Array.isArray(q.queryKey)) return true;\n const prefix = q.queryKey[0];\n return typeof prefix !== \"string\" || !limitKeys.includes(prefix);\n },\n );\n\n storage.setItem(key, JSON.stringify(parsed));\n } catch {\n // Corrupted data — clear entirely\n storage.removeItem(key);\n }\n }\n\n evict();\n const id = setInterval(evict, CHECK_INTERVAL_MS);\n return () => clearInterval(id);\n }, [key, maxStorageMB, limitKeys.length]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { G as GetItemCategoryApiOptions, P as PageData, S as SearchSuggestionsResponse, a as SearchSuggestion, I as InfiniteScrollPage, A as AugurCallbacks, C as CacheConfig, b as AugurApiClient, c as AugurAuthContext, d as PersistenceConfig } from './joomla-content-list-
|
|
2
|
-
export { e as AugurHooksProvider, f as CacheProvider, g as CacheTierConfig, h as getCartPricingQueryOptions, i as getCategoryItemsInfiniteKey, j as getCategoryItemsInfiniteOptions, k as getInvMastDocKey, l as getInvMastDocOptions, m as getInvMastKey, n as getInvMastOptions, o as getInvMastStockKey, p as getInvMastStockOptions, q as getItemAttributesKey, r as getItemAttributesOptions, s as getItemCategoryKey, t as getItemCategoryOptions, u as getItemDetailsKey, v as getItemDetailsOptions, w as getItemPriceKey, x as getItemPriceOptions, y as getItemSearchInfiniteKey, z as getItemSearchInfiniteOptions, B as getJoomlaContentKey, D as getJoomlaContentListKey, E as getJoomlaContentListOptions, F as getJoomlaContentOptions, H as getProductCategoryKey, J as getProductCategoryOptions, K as getProductSearchKey, L as getProductSearchOptions, M as getSearchSuggestionsKey, N as getSearchSuggestionsOptions, O as useAugurApi, Q as
|
|
1
|
+
import { G as GetItemCategoryApiOptions, P as PageData, S as SearchSuggestionsResponse, a as SearchSuggestion, I as InfiniteScrollPage, A as AugurCallbacks, C as CacheConfig, b as AugurApiClient, c as AugurAuthContext, d as PersistenceConfig } from './joomla-content-list-D-DV69o0.cjs';
|
|
2
|
+
export { e as AugurHooksProvider, f as CacheProvider, g as CacheTierConfig, h as getCartPricingQueryOptions, i as getCategoryItemsInfiniteKey, j as getCategoryItemsInfiniteOptions, k as getInvMastDocKey, l as getInvMastDocOptions, m as getInvMastKey, n as getInvMastOptions, o as getInvMastStockKey, p as getInvMastStockOptions, q as getItemAttributesKey, r as getItemAttributesOptions, s as getItemCategoryKey, t as getItemCategoryOptions, u as getItemDetailsKey, v as getItemDetailsOptions, w as getItemPriceKey, x as getItemPriceOptions, y as getItemSearchInfiniteKey, z as getItemSearchInfiniteOptions, B as getJoomlaContentKey, D as getJoomlaContentListKey, E as getJoomlaContentListOptions, F as getJoomlaContentOptions, H as getProductCategoryKey, J as getProductCategoryOptions, K as getProductSearchKey, L as getProductSearchOptions, M as getSearchSuggestionsKey, N as getSearchSuggestionsOptions, O as useAugurApi, Q as useAugurApiOptional, R as useAugurAuth, T as useAugurCache } from './joomla-content-list-D-DV69o0.cjs';
|
|
3
3
|
import * as zustand from 'zustand';
|
|
4
4
|
import { TCartLine, TItemsFilters, TPriceData, TInvMastDoc, TCategory, TItemDetails, TAttribute, TJoomlaContent, TJoomlaContentFilters } from '@simpleapps-com/augur-utils';
|
|
5
5
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
@@ -11,7 +11,8 @@ import 'react/jsx-runtime';
|
|
|
11
11
|
interface CartState {
|
|
12
12
|
cartHdrUid: number | string | undefined;
|
|
13
13
|
cartLines: TCartLine[];
|
|
14
|
-
|
|
14
|
+
cartQuantityTotal: number;
|
|
15
|
+
cartLineCount: number;
|
|
15
16
|
setCartHdrUid: (cartHdrUid: number | string | undefined) => void;
|
|
16
17
|
setCartLines: (cartLines: TCartLine[]) => void;
|
|
17
18
|
clearCart: () => void;
|
|
@@ -35,7 +36,8 @@ declare const useCartStore: zustand.UseBoundStore<Omit<zustand.StoreApi<CartStat
|
|
|
35
36
|
}>;
|
|
36
37
|
declare const useCartHdrUid: () => string | number | undefined;
|
|
37
38
|
declare const useCartLines: () => TCartLine[];
|
|
38
|
-
declare const
|
|
39
|
+
declare const useCartQuantityTotal: () => number;
|
|
40
|
+
declare const useCartLineCount: () => number;
|
|
39
41
|
declare const useSetCartHdrUid: () => (cartHdrUid: number | string | undefined) => void;
|
|
40
42
|
declare const useSetCartLines: () => (cartLines: TCartLine[]) => void;
|
|
41
43
|
declare const useClearCart: () => () => void;
|
|
@@ -490,8 +492,8 @@ interface CreateSiteHooksConfig {
|
|
|
490
492
|
cache?: CacheConfig;
|
|
491
493
|
}
|
|
492
494
|
interface SiteHooksProviderProps {
|
|
493
|
-
/**
|
|
494
|
-
api
|
|
495
|
+
/** SDK client instance. Optional when all data fetching is routed through callbacks. */
|
|
496
|
+
api?: AugurApiClient;
|
|
495
497
|
/** Auth context (partial -- missing fields are filled from config defaults). */
|
|
496
498
|
auth?: Partial<AugurAuthContext>;
|
|
497
499
|
children: ReactNode;
|
|
@@ -578,4 +580,4 @@ declare function useAugurPersistence(config: PersistenceConfig): {
|
|
|
578
580
|
};
|
|
579
581
|
};
|
|
580
582
|
|
|
581
|
-
export { AugurApiClient, AugurAuthContext, AugurCallbacks, CacheConfig, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type CreateSiteHooksConfig, GetItemCategoryApiOptions, InfiniteScrollPage, PageData, PersistenceConfig, SearchSuggestion, SearchSuggestionsResponse, createSiteHooks, useAugurPersistence, useCartActions, useCartHdrUid, useCartInitialization,
|
|
583
|
+
export { AugurApiClient, AugurAuthContext, AugurCallbacks, CacheConfig, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type CreateSiteHooksConfig, GetItemCategoryApiOptions, InfiniteScrollPage, PageData, PersistenceConfig, SearchSuggestion, SearchSuggestionsResponse, createSiteHooks, useAugurPersistence, useCartActions, useCartHdrUid, useCartInitialization, useCartLineCount, useCartLines, useCartPricing, useCartQuantityTotal, useCartStore, useCategoryItemsInfinite, useClearCart, useDebounce, useFormatPrice, useInvMast, useInvMastDoc, useInvMastStock, useItemAttributes, useItemCategory, useItemDetails, useItemFiltersStore, useItemPrice, useItemSearchInfinite, useJoomlaContent, useJoomlaContentList, usePaginationPrefetch, useProductCategory, useProductSearch, useSearchSuggestions, useSetCartHdrUid, useSetCartLines };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { G as GetItemCategoryApiOptions, P as PageData, S as SearchSuggestionsResponse, a as SearchSuggestion, I as InfiniteScrollPage, A as AugurCallbacks, C as CacheConfig, b as AugurApiClient, c as AugurAuthContext, d as PersistenceConfig } from './joomla-content-list-
|
|
2
|
-
export { e as AugurHooksProvider, f as CacheProvider, g as CacheTierConfig, h as getCartPricingQueryOptions, i as getCategoryItemsInfiniteKey, j as getCategoryItemsInfiniteOptions, k as getInvMastDocKey, l as getInvMastDocOptions, m as getInvMastKey, n as getInvMastOptions, o as getInvMastStockKey, p as getInvMastStockOptions, q as getItemAttributesKey, r as getItemAttributesOptions, s as getItemCategoryKey, t as getItemCategoryOptions, u as getItemDetailsKey, v as getItemDetailsOptions, w as getItemPriceKey, x as getItemPriceOptions, y as getItemSearchInfiniteKey, z as getItemSearchInfiniteOptions, B as getJoomlaContentKey, D as getJoomlaContentListKey, E as getJoomlaContentListOptions, F as getJoomlaContentOptions, H as getProductCategoryKey, J as getProductCategoryOptions, K as getProductSearchKey, L as getProductSearchOptions, M as getSearchSuggestionsKey, N as getSearchSuggestionsOptions, O as useAugurApi, Q as
|
|
1
|
+
import { G as GetItemCategoryApiOptions, P as PageData, S as SearchSuggestionsResponse, a as SearchSuggestion, I as InfiniteScrollPage, A as AugurCallbacks, C as CacheConfig, b as AugurApiClient, c as AugurAuthContext, d as PersistenceConfig } from './joomla-content-list-D-DV69o0.js';
|
|
2
|
+
export { e as AugurHooksProvider, f as CacheProvider, g as CacheTierConfig, h as getCartPricingQueryOptions, i as getCategoryItemsInfiniteKey, j as getCategoryItemsInfiniteOptions, k as getInvMastDocKey, l as getInvMastDocOptions, m as getInvMastKey, n as getInvMastOptions, o as getInvMastStockKey, p as getInvMastStockOptions, q as getItemAttributesKey, r as getItemAttributesOptions, s as getItemCategoryKey, t as getItemCategoryOptions, u as getItemDetailsKey, v as getItemDetailsOptions, w as getItemPriceKey, x as getItemPriceOptions, y as getItemSearchInfiniteKey, z as getItemSearchInfiniteOptions, B as getJoomlaContentKey, D as getJoomlaContentListKey, E as getJoomlaContentListOptions, F as getJoomlaContentOptions, H as getProductCategoryKey, J as getProductCategoryOptions, K as getProductSearchKey, L as getProductSearchOptions, M as getSearchSuggestionsKey, N as getSearchSuggestionsOptions, O as useAugurApi, Q as useAugurApiOptional, R as useAugurAuth, T as useAugurCache } from './joomla-content-list-D-DV69o0.js';
|
|
3
3
|
import * as zustand from 'zustand';
|
|
4
4
|
import { TCartLine, TItemsFilters, TPriceData, TInvMastDoc, TCategory, TItemDetails, TAttribute, TJoomlaContent, TJoomlaContentFilters } from '@simpleapps-com/augur-utils';
|
|
5
5
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
@@ -11,7 +11,8 @@ import 'react/jsx-runtime';
|
|
|
11
11
|
interface CartState {
|
|
12
12
|
cartHdrUid: number | string | undefined;
|
|
13
13
|
cartLines: TCartLine[];
|
|
14
|
-
|
|
14
|
+
cartQuantityTotal: number;
|
|
15
|
+
cartLineCount: number;
|
|
15
16
|
setCartHdrUid: (cartHdrUid: number | string | undefined) => void;
|
|
16
17
|
setCartLines: (cartLines: TCartLine[]) => void;
|
|
17
18
|
clearCart: () => void;
|
|
@@ -35,7 +36,8 @@ declare const useCartStore: zustand.UseBoundStore<Omit<zustand.StoreApi<CartStat
|
|
|
35
36
|
}>;
|
|
36
37
|
declare const useCartHdrUid: () => string | number | undefined;
|
|
37
38
|
declare const useCartLines: () => TCartLine[];
|
|
38
|
-
declare const
|
|
39
|
+
declare const useCartQuantityTotal: () => number;
|
|
40
|
+
declare const useCartLineCount: () => number;
|
|
39
41
|
declare const useSetCartHdrUid: () => (cartHdrUid: number | string | undefined) => void;
|
|
40
42
|
declare const useSetCartLines: () => (cartLines: TCartLine[]) => void;
|
|
41
43
|
declare const useClearCart: () => () => void;
|
|
@@ -490,8 +492,8 @@ interface CreateSiteHooksConfig {
|
|
|
490
492
|
cache?: CacheConfig;
|
|
491
493
|
}
|
|
492
494
|
interface SiteHooksProviderProps {
|
|
493
|
-
/**
|
|
494
|
-
api
|
|
495
|
+
/** SDK client instance. Optional when all data fetching is routed through callbacks. */
|
|
496
|
+
api?: AugurApiClient;
|
|
495
497
|
/** Auth context (partial -- missing fields are filled from config defaults). */
|
|
496
498
|
auth?: Partial<AugurAuthContext>;
|
|
497
499
|
children: ReactNode;
|
|
@@ -578,4 +580,4 @@ declare function useAugurPersistence(config: PersistenceConfig): {
|
|
|
578
580
|
};
|
|
579
581
|
};
|
|
580
582
|
|
|
581
|
-
export { AugurApiClient, AugurAuthContext, AugurCallbacks, CacheConfig, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type CreateSiteHooksConfig, GetItemCategoryApiOptions, InfiniteScrollPage, PageData, PersistenceConfig, SearchSuggestion, SearchSuggestionsResponse, createSiteHooks, useAugurPersistence, useCartActions, useCartHdrUid, useCartInitialization,
|
|
583
|
+
export { AugurApiClient, AugurAuthContext, AugurCallbacks, CacheConfig, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type CreateSiteHooksConfig, GetItemCategoryApiOptions, InfiniteScrollPage, PageData, PersistenceConfig, SearchSuggestion, SearchSuggestionsResponse, createSiteHooks, useAugurPersistence, useCartActions, useCartHdrUid, useCartInitialization, useCartLineCount, useCartLines, useCartPricing, useCartQuantityTotal, useCartStore, useCategoryItemsInfinite, useClearCart, useDebounce, useFormatPrice, useInvMast, useInvMastDoc, useInvMastStock, useItemAttributes, useItemCategory, useItemDetails, useItemFiltersStore, useItemPrice, useItemSearchInfinite, useJoomlaContent, useJoomlaContentList, usePaginationPrefetch, useProductCategory, useProductSearch, useSearchSuggestions, useSetCartHdrUid, useSetCartLines };
|