@simpleapps-com/augur-hooks 0.1.1 → 0.1.3

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 CHANGED
@@ -31,7 +31,12 @@ var useCartStore = _zustand.create.call(void 0, )(
31
31
  0
32
32
  );
33
33
  set({ cartLines, cartItemCount }, false, "setCartLines");
34
- }
34
+ },
35
+ clearCart: () => set(
36
+ { cartHdrUid: void 0, cartLines: [], cartItemCount: 0 },
37
+ false,
38
+ "clearCart"
39
+ )
35
40
  }),
36
41
  { name: "CartStore", enabled: process.env.NODE_ENV === "development" }
37
42
  )
@@ -41,6 +46,7 @@ var useCartLines = () => useCartStore((s) => s.cartLines);
41
46
  var useCartItemCount = () => useCartStore((s) => s.cartItemCount);
42
47
  var useSetCartHdrUid = () => useCartStore((s) => s.setCartHdrUid);
43
48
  var useSetCartLines = () => useCartStore((s) => s.setCartLines);
49
+ var useClearCart = () => useCartStore((s) => s.clearCart);
44
50
 
45
51
  // src/stores/items-filters-store.ts
46
52
 
@@ -663,8 +669,20 @@ function useCartInitialization(session, callbacks) {
663
669
  const cartHdrUid = useCartHdrUid();
664
670
  const setCartHdrUid = useSetCartHdrUid();
665
671
  const setCartLines = useSetCartLines();
672
+ const clearCart = useClearCart();
673
+ const queryClient = _reactquery.useQueryClient.call(void 0, );
666
674
  const retryCountRef = _react.useRef.call(void 0, 0);
667
675
  const isInitializingRef = _react.useRef.call(void 0, false);
676
+ const prevStatusRef = _react.useRef.call(void 0, session.status);
677
+ _react.useEffect.call(void 0, () => {
678
+ const prevStatus = prevStatusRef.current;
679
+ prevStatusRef.current = session.status;
680
+ if (prevStatus === "authenticated" && session.status === "unauthenticated") {
681
+ clearCart();
682
+ queryClient.removeQueries({ queryKey: ["cartLines"] });
683
+ queryClient.removeQueries({ queryKey: ["cart-also-bought"] });
684
+ }
685
+ }, [session.status, clearCart, queryClient]);
668
686
  _react.useEffect.call(void 0, () => {
669
687
  if (cartHdrUid || session.status === "loading") return;
670
688
  if (session.cartHdrUid && session.status === "authenticated") {
@@ -978,5 +996,6 @@ function useItemSearchInfinite(itemsFilters, itemCategoryUid, options = {}) {
978
996
 
979
997
 
980
998
 
981
- exports.AugurHooksProvider = AugurHooksProvider; exports.CATEGORY_CACHE_OPTIONS = CATEGORY_CACHE_OPTIONS; exports.INV_MAST_CACHE_OPTIONS = INV_MAST_CACHE_OPTIONS; exports.INV_MAST_DOC_CACHE_OPTIONS = INV_MAST_DOC_CACHE_OPTIONS; exports.PRICE_CACHE_OPTIONS = PRICE_CACHE_OPTIONS; exports.getCartPricingQueryOptions = getCartPricingQueryOptions; exports.getCategoryItemsInfiniteKey = getCategoryItemsInfiniteKey; exports.getInvMastDocKey = getInvMastDocKey; exports.getInvMastDocOptions = getInvMastDocOptions; exports.getInvMastKey = getInvMastKey; exports.getInvMastOptions = getInvMastOptions; exports.getInvMastStockKey = getInvMastStockKey; exports.getInvMastStockOptions = getInvMastStockOptions; exports.getItemAttributesKey = getItemAttributesKey; exports.getItemAttributesOptions = getItemAttributesOptions; exports.getItemCategoryKey = getItemCategoryKey; exports.getItemCategoryOptions = getItemCategoryOptions; exports.getItemDetailsKey = getItemDetailsKey; exports.getItemDetailsOptions = getItemDetailsOptions; exports.getItemPriceKey = getItemPriceKey; exports.getItemPriceOptions = getItemPriceOptions; exports.getItemSearchInfiniteKey = getItemSearchInfiniteKey; exports.getProductCategoryKey = getProductCategoryKey; exports.getProductCategoryOptions = getProductCategoryOptions; exports.getProductSearchKey = getProductSearchKey; exports.getProductSearchOptions = getProductSearchOptions; exports.getSearchSuggestionsKey = getSearchSuggestionsKey; exports.getSearchSuggestionsOptions = getSearchSuggestionsOptions; exports.useAugurApi = useAugurApi; exports.useCartActions = useCartActions; exports.useCartHdrUid = useCartHdrUid; exports.useCartInitialization = useCartInitialization; exports.useCartItemCount = useCartItemCount; exports.useCartLines = useCartLines; exports.useCartPricing = useCartPricing; exports.useCartStore = useCartStore; exports.useCategoryItemsInfinite = useCategoryItemsInfinite; exports.useDebounce = useDebounce; exports.useFormatPrice = useFormatPrice; exports.useInvMast = useInvMast; exports.useInvMastDoc = useInvMastDoc; exports.useInvMastStock = useInvMastStock; exports.useItemAttributes = useItemAttributes; exports.useItemCategory = useItemCategory; exports.useItemDetails = useItemDetails; exports.useItemFiltersStore = useItemFiltersStore; exports.useItemPrice = useItemPrice; exports.useItemSearchInfinite = useItemSearchInfinite; exports.usePaginationPrefetch = usePaginationPrefetch; exports.useProductCategory = useProductCategory; exports.useProductSearch = useProductSearch; exports.useSearchSuggestions = useSearchSuggestions; exports.useSetCartHdrUid = useSetCartHdrUid; exports.useSetCartLines = useSetCartLines;
999
+
1000
+ exports.AugurHooksProvider = AugurHooksProvider; exports.CATEGORY_CACHE_OPTIONS = CATEGORY_CACHE_OPTIONS; exports.INV_MAST_CACHE_OPTIONS = INV_MAST_CACHE_OPTIONS; exports.INV_MAST_DOC_CACHE_OPTIONS = INV_MAST_DOC_CACHE_OPTIONS; exports.PRICE_CACHE_OPTIONS = PRICE_CACHE_OPTIONS; exports.getCartPricingQueryOptions = getCartPricingQueryOptions; exports.getCategoryItemsInfiniteKey = getCategoryItemsInfiniteKey; exports.getInvMastDocKey = getInvMastDocKey; exports.getInvMastDocOptions = getInvMastDocOptions; exports.getInvMastKey = getInvMastKey; exports.getInvMastOptions = getInvMastOptions; exports.getInvMastStockKey = getInvMastStockKey; exports.getInvMastStockOptions = getInvMastStockOptions; exports.getItemAttributesKey = getItemAttributesKey; exports.getItemAttributesOptions = getItemAttributesOptions; exports.getItemCategoryKey = getItemCategoryKey; exports.getItemCategoryOptions = getItemCategoryOptions; exports.getItemDetailsKey = getItemDetailsKey; exports.getItemDetailsOptions = getItemDetailsOptions; exports.getItemPriceKey = getItemPriceKey; exports.getItemPriceOptions = getItemPriceOptions; exports.getItemSearchInfiniteKey = getItemSearchInfiniteKey; exports.getProductCategoryKey = getProductCategoryKey; exports.getProductCategoryOptions = getProductCategoryOptions; exports.getProductSearchKey = getProductSearchKey; exports.getProductSearchOptions = getProductSearchOptions; exports.getSearchSuggestionsKey = getSearchSuggestionsKey; exports.getSearchSuggestionsOptions = getSearchSuggestionsOptions; exports.useAugurApi = useAugurApi; exports.useCartActions = useCartActions; exports.useCartHdrUid = useCartHdrUid; exports.useCartInitialization = useCartInitialization; exports.useCartItemCount = useCartItemCount; exports.useCartLines = useCartLines; exports.useCartPricing = useCartPricing; exports.useCartStore = useCartStore; exports.useCategoryItemsInfinite = useCategoryItemsInfinite; exports.useClearCart = useClearCart; exports.useDebounce = useDebounce; exports.useFormatPrice = useFormatPrice; exports.useInvMast = useInvMast; exports.useInvMastDoc = useInvMastDoc; exports.useInvMastStock = useInvMastStock; exports.useItemAttributes = useItemAttributes; exports.useItemCategory = useItemCategory; exports.useItemDetails = useItemDetails; exports.useItemFiltersStore = useItemFiltersStore; exports.useItemPrice = useItemPrice; exports.useItemSearchInfinite = useItemSearchInfinite; exports.usePaginationPrefetch = usePaginationPrefetch; exports.useProductCategory = useProductCategory; exports.useProductSearch = useProductSearch; exports.useSearchSuggestions = useSearchSuggestions; exports.useSetCartHdrUid = useSetCartHdrUid; exports.useSetCartLines = useSetCartLines;
982
1001
  //# sourceMappingURL=index.cjs.map
@@ -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"],"names":["create","devtools","CACHE_CONFIG","useQuery","useEffect","useQueryClient","useCallback","useInfiniteQuery"],"mappings":"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ACP,IAAA;AACV,EAAA;AACH;ApB8yBuB;AACA;AqBn3Bd;AACT;AACEA;AAGK;AAaM;AAIJ,EAAA;AACL,IAAA;AACe,IAAA;AACf,IAAA;AACF,EAAA;AACF;AAMgB;AAKF,EAAA;AACM,EAAA;AAEXK,EAAAA;AACK,IAAA;AACQ,IAAA;AACC,MAAA;AACZ,QAAA;AACS,QAAA;AACN,QAAA;AACA,QAAA;AACQ,QAAA;AAGL,QAAA;AAGV,MAAA;AAC6B,MAAA;AACR,MAAA;AAChB,MAAA;AACC,MAAA;AACC,QAAA;AACN,QAAA;AACY,QAAA;AACd,MAAA;AACF,IAAA;AACkB,IAAA;AACC,IAAA;AACH,IAAA;AACP,IAAA;AACQ,IAAA;AAClB,EAAA;AACH;ArBs1BuB;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\";\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 children: ReactNode;\n}\n\nconst AugurApiContext = createContext<AugurApiClient | null>(null);\n\n/**\n * Provides the augur-api SDK instance to all hooks in the tree.\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 */\nexport function AugurHooksProvider({ api, children }: AugurHooksProviderProps) {\n return (\n <AugurApiContext.Provider value={api}>{children}</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","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}\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 { 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);\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 { CACHE_CONFIG, type TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemPriceOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TPriceData>;\n}\n\nexport const PRICE_CACHE_OPTIONS = {\n ...CACHE_CONFIG.SEMI_STATIC,\n refetchOnReconnect: true,\n refetchOnWindowFocus: false,\n meta: { persist: true },\n} as const;\n\n/**\n * Generates a consistent query key for item price queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemPriceKey = (\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => {\n return [\"price\", itemId?.toUpperCase() || \"\", customerId, quantity] as const;\n};\n\n/**\n * Query options for item price. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemPriceOptions = (\n api: AugurApiClient,\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => ({\n queryKey: getItemPriceKey(itemId, customerId, quantity),\n queryFn: async (): Promise<TPriceData> => {\n const response = await api.pricing.priceEngine.get({\n itemId: itemId?.toUpperCase() || \"\",\n customerId: Number(customerId),\n quantity,\n });\n return response.data;\n },\n ...PRICE_CACHE_OPTIONS,\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 defaultOptions = getItemPriceOptions(api, itemId, customerId, quantity);\n\n return useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? (Boolean(itemId) && Boolean(customerId)),\n retry: 3,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TInvMastDoc } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\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\nexport const INV_MAST_DOC_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for inv mast doc queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getInvMastDocKey = (\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => {\n return [\n \"invMastDoc\",\n invMastUid,\n itemId.toUpperCase(),\n includePricing,\n ] as const;\n};\n\n/**\n * Query options for inv mast doc. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getInvMastDocOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => ({\n queryKey: getInvMastDocKey(invMastUid, itemId, includePricing),\n queryFn: async (): Promise<TInvMastDoc> => {\n const response = await api.items.invMast.doc.list(invMastUid, {\n includePricing,\n });\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_DOC_CACHE_OPTIONS,\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 queryOpts = getInvMastDocOptions(\n api,\n invMastUid,\n itemId,\n options.includePricing ?? \"N\",\n );\n\n const { data, isLoading, error } = useQuery<TInvMastDoc, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { GetItemCategoryApiOptions } from \"../types\";\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\nexport const CATEGORY_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\ntype ItemCategoryQueryKey = readonly [\n \"itemCategory\",\n number,\n GetItemCategoryApiOptions | undefined,\n];\n\n/**\n * Generates a consistent query key for item category queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemCategoryKey = (\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n): ItemCategoryQueryKey => {\n return [\"itemCategory\", itemCategoryUid, apiOptions] as const;\n};\n\n/**\n * Query options for item category. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n) => ({\n queryKey: getItemCategoryKey(itemCategoryUid, apiOptions),\n queryFn: async (): Promise<TCategory> => {\n const response = await api.items.itemCategory.get(\n itemCategoryUid,\n apiOptions,\n );\n if (!response.data) throw new Error(\"Item category not found\");\n return response.data;\n },\n ...CATEGORY_CACHE_OPTIONS,\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 queryOpts = getItemCategoryOptions(\n api,\n itemCategoryUid,\n options.apiOptions,\n );\n\n const { data, isLoading, error } = useQuery<\n TCategory,\n Error,\n TCategory,\n ItemCategoryQueryKey\n >({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { category: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const INV_MAST_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\nexport const getInvMastKey = (invMastUid: number, itemId: string) => {\n return [\"invMast\", invMastUid, itemId.toUpperCase()] as const;\n};\n\nexport const getInvMastOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n) => ({\n queryKey: getInvMastKey(invMastUid, itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.get(invMastUid);\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_CACHE_OPTIONS,\n});\n\nexport function useInvMast(\n invMastUid: number,\n itemId: string,\n options: UseInvMastOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastOptions(api, invMastUid, itemId);\n\n const { data, isLoading, error } = useQuery<TItemDetails, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TStockData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastStockOptions {\n enabled?: boolean;\n queryFn?: () => Promise<number>;\n}\n\nexport const getInvMastStockKey = (invMastUid: number | string) => {\n return [\"invMastStock\", invMastUid] as const;\n};\n\nexport const getInvMastStockOptions = (\n api: AugurApiClient,\n invMastUid: number | string,\n) => ({\n queryKey: getInvMastStockKey(invMastUid),\n queryFn: async (): Promise<number> => {\n const response = await api.items.invMast.stock.list(Number(invMastUid));\n const stockData: TStockData[] = response.data?.stockData ?? [];\n return stockData.reduce(\n (qty: number, stock: TStockData) => qty + stock.qtyOnHand,\n 0,\n );\n },\n ...CACHE_CONFIG.SEMI_STATIC,\n});\n\nexport function useInvMastStock(\n invMastUid: number | string,\n options: UseInvMastStockOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastStockOptions(api, invMastUid);\n\n const { data, isLoading, error } = useQuery({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ntype ProductCategoryResponse = {\n itemCategoryDesc: string;\n childrenTotal: number;\n children: TProductCategory[];\n categoryImage: string | null;\n};\n\ninterface UseProductCategoryOptions {\n enabled?: boolean;\n queryFn?: () => Promise<ProductCategoryResponse>;\n}\n\nexport const getProductCategoryKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"productCategory\", itemCategoryUid] as const;\n};\n\nexport const getProductCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getProductCategoryKey(itemCategoryUid),\n queryFn: async (): Promise<ProductCategoryResponse> => {\n const response = await api.items.itemCategory.get(\n Number(itemCategoryUid),\n );\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useProductCategory(\n itemCategoryUid: number | string | null,\n options: UseProductCategoryOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getProductCategoryOptions(api, itemCategoryUid)\n : { queryKey: getProductCategoryKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 childrenTotal: data?.childrenTotal ?? 0,\n itemCategoryDesc: data?.itemCategoryDesc ?? \"\",\n productCategories: data?.children ?? null,\n productCategoryImage: data?.categoryImage ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemDetailsOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const getItemDetailsKey = (itemId: number | string) => {\n return [\"itemDetails\", itemId] as const;\n};\n\nexport const getItemDetailsOptions = (\n api: AugurApiClient,\n itemId: number | string,\n) => ({\n queryKey: getItemDetailsKey(itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.doc.list(Number(itemId));\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemDetails(\n itemId: number | string | undefined,\n options: UseItemDetailsOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemId\n ? getItemDetailsOptions(api, itemId)\n : { queryKey: getItemDetailsKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TAttribute } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemAttributesOptions {\n enabled?: boolean;\n queryFn?: () => Promise<{ attributes: TAttribute[] }>;\n}\n\nexport const getItemAttributesKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"itemAttributes\", itemCategoryUid] as const;\n};\n\nexport const getItemAttributesOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getItemAttributesKey(itemCategoryUid),\n queryFn: async () => {\n const response = await api.openSearch.itemSearch.attributes.list({\n q: \"\",\n searchType: \"query\",\n classId5List: String(itemCategoryUid),\n });\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemAttributes(\n itemCategoryUid: number | string | null,\n options: UseItemAttributesOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getItemAttributesOptions(api, itemCategoryUid)\n : {\n queryKey: getItemAttributesKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductItem } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { PageData } from \"../types\";\n\ntype ProductSearchResponse = {\n items: TProductItem[];\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 * Generates a consistent query key for product search queries.\n */\nexport const getProductSearchKey = (pageData: PageData) => {\n return [\n \"productSearch\",\n pageData.q,\n pageData.limit,\n pageData.offset,\n pageData.sortBy,\n pageData.itemCategoryUid,\n ] as const;\n};\n\n/**\n * Query options for product search. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getProductSearchOptions = (\n api: AugurApiClient,\n pageData: PageData,\n) => ({\n queryKey: getProductSearchKey(pageData),\n queryFn: async (): Promise<ProductSearchResponse> => {\n const response = await api.openSearch.itemSearch.list({\n q: pageData.q,\n searchType: \"query\",\n size: pageData.limit,\n from: pageData.offset,\n classId5List: pageData.itemCategoryUid\n ? String(pageData.itemCategoryUid)\n : undefined,\n filters: pageData.filters\n ? JSON.stringify(pageData.filters)\n : undefined,\n });\n return response.data;\n },\n ...CACHE_CONFIG.SEMI_STATIC,\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 defaultOptions = getProductSearchOptions(api, pageData);\n\n const { data, isLoading, error } = useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { SearchSuggestionsResponse } from \"../types\";\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\nconst SEARCH_SUGGESTIONS_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for search suggestion queries.\n */\nexport const getSearchSuggestionsKey = (\n query: string,\n limit: number,\n offset: number,\n) => {\n return [\"searchSuggestions\", query, limit, offset] as const;\n};\n\n/**\n * Query options for search suggestions. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getSearchSuggestionsOptions = (\n api: AugurApiClient,\n query: string,\n limit: number = 10,\n offset: number = 0,\n) => ({\n queryKey: getSearchSuggestionsKey(query, limit, offset),\n queryFn: async (): Promise<SearchSuggestionsResponse> => {\n const response = await api.openSearch.suggestions.suggest.list({\n q: query,\n });\n return response.data;\n },\n ...SEARCH_SUGGESTIONS_CACHE_OPTIONS,\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 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);\n\n const { data, isLoading, error } = useQuery<\n SearchSuggestionsResponse,\n Error\n >({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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. Returns true on success. */\n addToCart: (\n cartHdrUid: number,\n items: Array<{\n cartHdrUid: number;\n invMastUid: number;\n quantity: number;\n unitOfMeasure: string;\n }>,\n ) => Promise<boolean | unknown>;\n /** Update cart lines via API. Returns true on success. */\n updateCartLines: (\n cartHdrUid: number,\n lines: TCartLine[],\n ) => Promise<boolean | unknown>;\n /** Delete all items from cart via API. Returns true on success. */\n deleteItemsFromCart: (cartHdrUid: number) => Promise<boolean | unknown>;\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, useRef } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useSetCartHdrUid,\n useSetCartLines,\n} from \"../stores/cart-store\";\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;\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>;\n /** Fetch cart line items for a given cart header UID. */\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[]>;\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 cartHdrUid = useCartHdrUid();\n const setCartHdrUid = useSetCartHdrUid();\n const setCartLines = useSetCartLines();\n\n const retryCountRef = useRef(0);\n const isInitializingRef = useRef(false);\n\n // Initialize cart header\n useEffect(() => {\n if (cartHdrUid || session.status === \"loading\") return;\n\n // Authenticated user — use session cartHdrUid\n if (session.cartHdrUid && session.status === \"authenticated\") {\n setCartHdrUid(session.cartHdrUid);\n return;\n }\n\n // Guest user — lookup/create cart\n if (session.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 }, [session, cartHdrUid, setCartHdrUid, callbacks]);\n\n // Fetch cart lines when cartHdrUid is available\n const { data: cartLinesData } = useQuery({\n queryKey: [\"cartLines\", cartHdrUid],\n queryFn: () => callbacks.getCartLines(Number(cartHdrUid)),\n enabled: !!cartHdrUid,\n ...CACHE_CONFIG.CART,\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 { useCartLines } from \"../stores/cart-store\";\nimport { getItemPriceOptions } from \"./use-item-price\";\nimport { useAugurApi } from \"../provider\";\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}\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 cartLines = useCartLines();\n const { customerId } = options;\n\n const priceQueries = useQueries({\n queries: cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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\n/**\n * Get cart pricing query options for prefetching or parent components.\n */\nexport function getCartPricingQueryOptions(\n api: ReturnType<typeof useAugurApi>,\n cartLines: Array<{ itemId: string; quantity: number }>,\n customerId: string | number | undefined,\n) {\n return cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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 /** 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 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: [...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, 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 {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface CategoryItemsInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseCategoryItemsInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getCategoryItemsInfiniteKey = (\n itemCategoryUid: number,\n itemsFilters: TItemsFilters,\n) => {\n return [\n \"categoryItemsInfinite\",\n itemCategoryUid,\n JSON.stringify(itemsFilters),\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<CategoryItemsInfiniteResponse>({\n queryKey: getCategoryItemsInfiniteKey(itemCategoryUid, itemsFilters),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q || \"\",\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: String(itemCategoryUid),\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemCategoryUid,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface ItemSearchInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseItemSearchInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getItemSearchInfiniteKey = (\n itemsFilters: TItemsFilters,\n itemCategoryUid?: number | string,\n) => {\n return [\n \"itemSearchInfinite\",\n JSON.stringify(itemsFilters),\n itemCategoryUid,\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<ItemSearchInfiniteResponse>({\n queryKey: getItemSearchInfiniteKey(itemsFilters, itemCategoryUid),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q,\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemsFilters.q,\n meta: { persist: true },\n });\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"],"names":["create","devtools","CACHE_CONFIG","useQuery","useEffect","useQueryClient","useCallback","useInfiniteQuery"],"mappings":"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;AACF,EAAA;AACF;AnB0xBuB;AACA;AoB31Bd;AACT;AACEJ;AAGK;AAaM;AAIJ,EAAA;AACL,IAAA;AACA,IAAA;AACe,IAAA;AACjB,EAAA;AACF;AAMgB;AAKF,EAAA;AACM,EAAA;AAEX,EAAA;AACK,IAAA;AACQ,IAAA;AACC,MAAA;AACZ,QAAA;AACS,QAAA;AACN,QAAA;AACA,QAAA;AACQ,QAAA;AACL,QAAA;AAGV,MAAA;AAC6B,MAAA;AACR,MAAA;AAChB,MAAA;AACC,MAAA;AACC,QAAA;AACN,QAAA;AACY,QAAA;AACd,MAAA;AACF,IAAA;AACkB,IAAA;AACC,IAAA;AACH,IAAA;AACP,IAAA;AACV,EAAA;AACH;ApBg0BuB;AACA;AqBr4Bd;AACT;AACEA;AAGK;AAaM;AAIJ,EAAA;AACL,IAAA;AACe,IAAA;AACf,IAAA;AACF,EAAA;AACF;AAMgB;AAKF,EAAA;AACM,EAAA;AAEXK,EAAAA;AACK,IAAA;AACQ,IAAA;AACC,MAAA;AACZ,QAAA;AACS,QAAA;AACN,QAAA;AACA,QAAA;AACQ,QAAA;AAGL,QAAA;AAGV,MAAA;AAC6B,MAAA;AACR,MAAA;AAChB,MAAA;AACC,MAAA;AACC,QAAA;AACN,QAAA;AACY,QAAA;AACd,MAAA;AACF,IAAA;AACkB,IAAA;AACC,IAAA;AACH,IAAA;AACP,IAAA;AACQ,IAAA;AAClB,EAAA;AACH;ArBw2BuB;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\";\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 children: ReactNode;\n}\n\nconst AugurApiContext = createContext<AugurApiClient | null>(null);\n\n/**\n * Provides the augur-api SDK instance to all hooks in the tree.\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 */\nexport function AugurHooksProvider({ api, children }: AugurHooksProviderProps) {\n return (\n <AugurApiContext.Provider value={api}>{children}</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","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 { CACHE_CONFIG, type TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemPriceOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TPriceData>;\n}\n\nexport const PRICE_CACHE_OPTIONS = {\n ...CACHE_CONFIG.SEMI_STATIC,\n refetchOnReconnect: true,\n refetchOnWindowFocus: false,\n meta: { persist: true },\n} as const;\n\n/**\n * Generates a consistent query key for item price queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemPriceKey = (\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => {\n return [\"price\", itemId?.toUpperCase() || \"\", customerId, quantity] as const;\n};\n\n/**\n * Query options for item price. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemPriceOptions = (\n api: AugurApiClient,\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => ({\n queryKey: getItemPriceKey(itemId, customerId, quantity),\n queryFn: async (): Promise<TPriceData> => {\n const response = await api.pricing.priceEngine.get({\n itemId: itemId?.toUpperCase() || \"\",\n customerId: Number(customerId),\n quantity,\n });\n return response.data;\n },\n ...PRICE_CACHE_OPTIONS,\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 defaultOptions = getItemPriceOptions(api, itemId, customerId, quantity);\n\n return useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? (Boolean(itemId) && Boolean(customerId)),\n retry: 3,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TInvMastDoc } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\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\nexport const INV_MAST_DOC_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for inv mast doc queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getInvMastDocKey = (\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => {\n return [\n \"invMastDoc\",\n invMastUid,\n itemId.toUpperCase(),\n includePricing,\n ] as const;\n};\n\n/**\n * Query options for inv mast doc. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getInvMastDocOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => ({\n queryKey: getInvMastDocKey(invMastUid, itemId, includePricing),\n queryFn: async (): Promise<TInvMastDoc> => {\n const response = await api.items.invMast.doc.list(invMastUid, {\n includePricing,\n });\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_DOC_CACHE_OPTIONS,\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 queryOpts = getInvMastDocOptions(\n api,\n invMastUid,\n itemId,\n options.includePricing ?? \"N\",\n );\n\n const { data, isLoading, error } = useQuery<TInvMastDoc, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { GetItemCategoryApiOptions } from \"../types\";\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\nexport const CATEGORY_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\ntype ItemCategoryQueryKey = readonly [\n \"itemCategory\",\n number,\n GetItemCategoryApiOptions | undefined,\n];\n\n/**\n * Generates a consistent query key for item category queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemCategoryKey = (\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n): ItemCategoryQueryKey => {\n return [\"itemCategory\", itemCategoryUid, apiOptions] as const;\n};\n\n/**\n * Query options for item category. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n) => ({\n queryKey: getItemCategoryKey(itemCategoryUid, apiOptions),\n queryFn: async (): Promise<TCategory> => {\n const response = await api.items.itemCategory.get(\n itemCategoryUid,\n apiOptions,\n );\n if (!response.data) throw new Error(\"Item category not found\");\n return response.data;\n },\n ...CATEGORY_CACHE_OPTIONS,\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 queryOpts = getItemCategoryOptions(\n api,\n itemCategoryUid,\n options.apiOptions,\n );\n\n const { data, isLoading, error } = useQuery<\n TCategory,\n Error,\n TCategory,\n ItemCategoryQueryKey\n >({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { category: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const INV_MAST_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\nexport const getInvMastKey = (invMastUid: number, itemId: string) => {\n return [\"invMast\", invMastUid, itemId.toUpperCase()] as const;\n};\n\nexport const getInvMastOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n) => ({\n queryKey: getInvMastKey(invMastUid, itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.get(invMastUid);\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_CACHE_OPTIONS,\n});\n\nexport function useInvMast(\n invMastUid: number,\n itemId: string,\n options: UseInvMastOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastOptions(api, invMastUid, itemId);\n\n const { data, isLoading, error } = useQuery<TItemDetails, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TStockData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastStockOptions {\n enabled?: boolean;\n queryFn?: () => Promise<number>;\n}\n\nexport const getInvMastStockKey = (invMastUid: number | string) => {\n return [\"invMastStock\", invMastUid] as const;\n};\n\nexport const getInvMastStockOptions = (\n api: AugurApiClient,\n invMastUid: number | string,\n) => ({\n queryKey: getInvMastStockKey(invMastUid),\n queryFn: async (): Promise<number> => {\n const response = await api.items.invMast.stock.list(Number(invMastUid));\n const stockData: TStockData[] = response.data?.stockData ?? [];\n return stockData.reduce(\n (qty: number, stock: TStockData) => qty + stock.qtyOnHand,\n 0,\n );\n },\n ...CACHE_CONFIG.SEMI_STATIC,\n});\n\nexport function useInvMastStock(\n invMastUid: number | string,\n options: UseInvMastStockOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastStockOptions(api, invMastUid);\n\n const { data, isLoading, error } = useQuery({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ntype ProductCategoryResponse = {\n itemCategoryDesc: string;\n childrenTotal: number;\n children: TProductCategory[];\n categoryImage: string | null;\n};\n\ninterface UseProductCategoryOptions {\n enabled?: boolean;\n queryFn?: () => Promise<ProductCategoryResponse>;\n}\n\nexport const getProductCategoryKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"productCategory\", itemCategoryUid] as const;\n};\n\nexport const getProductCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getProductCategoryKey(itemCategoryUid),\n queryFn: async (): Promise<ProductCategoryResponse> => {\n const response = await api.items.itemCategory.get(\n Number(itemCategoryUid),\n );\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useProductCategory(\n itemCategoryUid: number | string | null,\n options: UseProductCategoryOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getProductCategoryOptions(api, itemCategoryUid)\n : { queryKey: getProductCategoryKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 childrenTotal: data?.childrenTotal ?? 0,\n itemCategoryDesc: data?.itemCategoryDesc ?? \"\",\n productCategories: data?.children ?? null,\n productCategoryImage: data?.categoryImage ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemDetailsOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const getItemDetailsKey = (itemId: number | string) => {\n return [\"itemDetails\", itemId] as const;\n};\n\nexport const getItemDetailsOptions = (\n api: AugurApiClient,\n itemId: number | string,\n) => ({\n queryKey: getItemDetailsKey(itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.doc.list(Number(itemId));\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemDetails(\n itemId: number | string | undefined,\n options: UseItemDetailsOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemId\n ? getItemDetailsOptions(api, itemId)\n : { queryKey: getItemDetailsKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TAttribute } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemAttributesOptions {\n enabled?: boolean;\n queryFn?: () => Promise<{ attributes: TAttribute[] }>;\n}\n\nexport const getItemAttributesKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"itemAttributes\", itemCategoryUid] as const;\n};\n\nexport const getItemAttributesOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getItemAttributesKey(itemCategoryUid),\n queryFn: async () => {\n const response = await api.openSearch.itemSearch.attributes.list({\n q: \"\",\n searchType: \"query\",\n classId5List: String(itemCategoryUid),\n });\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemAttributes(\n itemCategoryUid: number | string | null,\n options: UseItemAttributesOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getItemAttributesOptions(api, itemCategoryUid)\n : {\n queryKey: getItemAttributesKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductItem } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { PageData } from \"../types\";\n\ntype ProductSearchResponse = {\n items: TProductItem[];\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 * Generates a consistent query key for product search queries.\n */\nexport const getProductSearchKey = (pageData: PageData) => {\n return [\n \"productSearch\",\n pageData.q,\n pageData.limit,\n pageData.offset,\n pageData.sortBy,\n pageData.itemCategoryUid,\n ] as const;\n};\n\n/**\n * Query options for product search. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getProductSearchOptions = (\n api: AugurApiClient,\n pageData: PageData,\n) => ({\n queryKey: getProductSearchKey(pageData),\n queryFn: async (): Promise<ProductSearchResponse> => {\n const response = await api.openSearch.itemSearch.list({\n q: pageData.q,\n searchType: \"query\",\n size: pageData.limit,\n from: pageData.offset,\n classId5List: pageData.itemCategoryUid\n ? String(pageData.itemCategoryUid)\n : undefined,\n filters: pageData.filters\n ? JSON.stringify(pageData.filters)\n : undefined,\n });\n return response.data;\n },\n ...CACHE_CONFIG.SEMI_STATIC,\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 defaultOptions = getProductSearchOptions(api, pageData);\n\n const { data, isLoading, error } = useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { SearchSuggestionsResponse } from \"../types\";\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\nconst SEARCH_SUGGESTIONS_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for search suggestion queries.\n */\nexport const getSearchSuggestionsKey = (\n query: string,\n limit: number,\n offset: number,\n) => {\n return [\"searchSuggestions\", query, limit, offset] as const;\n};\n\n/**\n * Query options for search suggestions. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getSearchSuggestionsOptions = (\n api: AugurApiClient,\n query: string,\n limit: number = 10,\n offset: number = 0,\n) => ({\n queryKey: getSearchSuggestionsKey(query, limit, offset),\n queryFn: async (): Promise<SearchSuggestionsResponse> => {\n const response = await api.openSearch.suggestions.suggest.list({\n q: query,\n });\n return response.data;\n },\n ...SEARCH_SUGGESTIONS_CACHE_OPTIONS,\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 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);\n\n const { data, isLoading, error } = useQuery<\n SearchSuggestionsResponse,\n Error\n >({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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. Returns true on success. */\n addToCart: (\n cartHdrUid: number,\n items: Array<{\n cartHdrUid: number;\n invMastUid: number;\n quantity: number;\n unitOfMeasure: string;\n }>,\n ) => Promise<boolean | unknown>;\n /** Update cart lines via API. Returns true on success. */\n updateCartLines: (\n cartHdrUid: number,\n lines: TCartLine[],\n ) => Promise<boolean | unknown>;\n /** Delete all items from cart via API. Returns true on success. */\n deleteItemsFromCart: (cartHdrUid: number) => Promise<boolean | unknown>;\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, useRef } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useSetCartHdrUid,\n useSetCartLines,\n useClearCart,\n} from \"../stores/cart-store\";\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;\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>;\n /** Fetch cart line items for a given cart header UID. */\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[]>;\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 cartHdrUid = useCartHdrUid();\n const setCartHdrUid = useSetCartHdrUid();\n const setCartLines = useSetCartLines();\n const clearCart = useClearCart();\n const queryClient = useQueryClient();\n\n const retryCountRef = useRef(0);\n const isInitializingRef = useRef(false);\n const prevStatusRef = useRef(session.status);\n\n // Auto-clear cart on logout (authenticated → unauthenticated)\n useEffect(() => {\n const prevStatus = prevStatusRef.current;\n prevStatusRef.current = session.status;\n\n if (\n prevStatus === \"authenticated\" &&\n session.status === \"unauthenticated\"\n ) {\n clearCart();\n queryClient.removeQueries({ queryKey: [\"cartLines\"] });\n queryClient.removeQueries({ queryKey: [\"cart-also-bought\"] });\n }\n }, [session.status, clearCart, queryClient]);\n\n // Initialize cart header\n useEffect(() => {\n if (cartHdrUid || session.status === \"loading\") return;\n\n // Authenticated user — use session cartHdrUid\n if (session.cartHdrUid && session.status === \"authenticated\") {\n setCartHdrUid(session.cartHdrUid);\n return;\n }\n\n // Guest user — lookup/create cart\n if (session.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 }, [session, cartHdrUid, setCartHdrUid, callbacks]);\n\n // Fetch cart lines when cartHdrUid is available\n const { data: cartLinesData } = useQuery({\n queryKey: [\"cartLines\", cartHdrUid],\n queryFn: () => callbacks.getCartLines(Number(cartHdrUid)),\n enabled: !!cartHdrUid,\n ...CACHE_CONFIG.CART,\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 { useCartLines } from \"../stores/cart-store\";\nimport { getItemPriceOptions } from \"./use-item-price\";\nimport { useAugurApi } from \"../provider\";\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}\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 cartLines = useCartLines();\n const { customerId } = options;\n\n const priceQueries = useQueries({\n queries: cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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\n/**\n * Get cart pricing query options for prefetching or parent components.\n */\nexport function getCartPricingQueryOptions(\n api: ReturnType<typeof useAugurApi>,\n cartLines: Array<{ itemId: string; quantity: number }>,\n customerId: string | number | undefined,\n) {\n return cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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 /** 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 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: [...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, 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 {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface CategoryItemsInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseCategoryItemsInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getCategoryItemsInfiniteKey = (\n itemCategoryUid: number,\n itemsFilters: TItemsFilters,\n) => {\n return [\n \"categoryItemsInfinite\",\n itemCategoryUid,\n JSON.stringify(itemsFilters),\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<CategoryItemsInfiniteResponse>({\n queryKey: getCategoryItemsInfiniteKey(itemCategoryUid, itemsFilters),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q || \"\",\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: String(itemCategoryUid),\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemCategoryUid,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface ItemSearchInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseItemSearchInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getItemSearchInfiniteKey = (\n itemsFilters: TItemsFilters,\n itemCategoryUid?: number | string,\n) => {\n return [\n \"itemSearchInfinite\",\n JSON.stringify(itemsFilters),\n itemCategoryUid,\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<ItemSearchInfiniteResponse>({\n queryKey: getItemSearchInfiniteKey(itemsFilters, itemCategoryUid),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q,\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemsFilters.q,\n meta: { persist: true },\n });\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -95,6 +95,7 @@ interface CartState {
95
95
  cartItemCount: number;
96
96
  setCartHdrUid: (cartHdrUid: number | string | undefined) => void;
97
97
  setCartLines: (cartLines: TCartLine[]) => void;
98
+ clearCart: () => void;
98
99
  }
99
100
  declare const useCartStore: zustand.UseBoundStore<Omit<zustand.StoreApi<CartState>, "setState" | "devtools"> & {
100
101
  setState(partial: CartState | Partial<CartState> | ((state: CartState) => CartState | Partial<CartState>), replace?: false | undefined, action?: (string | {
@@ -118,6 +119,7 @@ declare const useCartLines: () => TCartLine[];
118
119
  declare const useCartItemCount: () => number;
119
120
  declare const useSetCartHdrUid: () => (cartHdrUid: number | string | undefined) => void;
120
121
  declare const useSetCartLines: () => (cartLines: TCartLine[]) => void;
122
+ declare const useClearCart: () => () => void;
121
123
 
122
124
  interface ItemsFiltersState {
123
125
  initialFiltersState: TItemsFilters;
@@ -671,4 +673,4 @@ declare const getItemSearchInfiniteKey: (itemsFilters: TItemsFilters, itemCatego
671
673
  */
672
674
  declare function useItemSearchInfinite(itemsFilters: TItemsFilters, itemCategoryUid?: number | string, options?: UseItemSearchInfiniteOptions): _tanstack_react_query.UseInfiniteQueryResult<_tanstack_react_query.InfiniteData<ItemSearchInfiniteResponse, unknown>, Error>;
673
675
 
674
- export { type AugurApiClient, AugurHooksProvider, CATEGORY_CACHE_OPTIONS, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type GetItemCategoryApiOptions, INV_MAST_CACHE_OPTIONS, INV_MAST_DOC_CACHE_OPTIONS, PRICE_CACHE_OPTIONS, type PageData, type SearchSuggestion, type SearchSuggestionsResponse, getCartPricingQueryOptions, getCategoryItemsInfiniteKey, getInvMastDocKey, getInvMastDocOptions, getInvMastKey, getInvMastOptions, getInvMastStockKey, getInvMastStockOptions, getItemAttributesKey, getItemAttributesOptions, getItemCategoryKey, getItemCategoryOptions, getItemDetailsKey, getItemDetailsOptions, getItemPriceKey, getItemPriceOptions, getItemSearchInfiniteKey, getProductCategoryKey, getProductCategoryOptions, getProductSearchKey, getProductSearchOptions, getSearchSuggestionsKey, getSearchSuggestionsOptions, useAugurApi, useCartActions, useCartHdrUid, useCartInitialization, useCartItemCount, useCartLines, useCartPricing, useCartStore, useCategoryItemsInfinite, useDebounce, useFormatPrice, useInvMast, useInvMastDoc, useInvMastStock, useItemAttributes, useItemCategory, useItemDetails, useItemFiltersStore, useItemPrice, useItemSearchInfinite, usePaginationPrefetch, useProductCategory, useProductSearch, useSearchSuggestions, useSetCartHdrUid, useSetCartLines };
676
+ export { type AugurApiClient, AugurHooksProvider, CATEGORY_CACHE_OPTIONS, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type GetItemCategoryApiOptions, INV_MAST_CACHE_OPTIONS, INV_MAST_DOC_CACHE_OPTIONS, PRICE_CACHE_OPTIONS, type PageData, type SearchSuggestion, type SearchSuggestionsResponse, getCartPricingQueryOptions, getCategoryItemsInfiniteKey, getInvMastDocKey, getInvMastDocOptions, getInvMastKey, getInvMastOptions, getInvMastStockKey, getInvMastStockOptions, getItemAttributesKey, getItemAttributesOptions, getItemCategoryKey, getItemCategoryOptions, getItemDetailsKey, getItemDetailsOptions, getItemPriceKey, getItemPriceOptions, getItemSearchInfiniteKey, getProductCategoryKey, getProductCategoryOptions, getProductSearchKey, getProductSearchOptions, getSearchSuggestionsKey, getSearchSuggestionsOptions, useAugurApi, useCartActions, useCartHdrUid, useCartInitialization, useCartItemCount, useCartLines, useCartPricing, useCartStore, useCategoryItemsInfinite, useClearCart, useDebounce, useFormatPrice, useInvMast, useInvMastDoc, useInvMastStock, useItemAttributes, useItemCategory, useItemDetails, useItemFiltersStore, useItemPrice, useItemSearchInfinite, usePaginationPrefetch, useProductCategory, useProductSearch, useSearchSuggestions, useSetCartHdrUid, useSetCartLines };
package/dist/index.d.ts CHANGED
@@ -95,6 +95,7 @@ interface CartState {
95
95
  cartItemCount: number;
96
96
  setCartHdrUid: (cartHdrUid: number | string | undefined) => void;
97
97
  setCartLines: (cartLines: TCartLine[]) => void;
98
+ clearCart: () => void;
98
99
  }
99
100
  declare const useCartStore: zustand.UseBoundStore<Omit<zustand.StoreApi<CartState>, "setState" | "devtools"> & {
100
101
  setState(partial: CartState | Partial<CartState> | ((state: CartState) => CartState | Partial<CartState>), replace?: false | undefined, action?: (string | {
@@ -118,6 +119,7 @@ declare const useCartLines: () => TCartLine[];
118
119
  declare const useCartItemCount: () => number;
119
120
  declare const useSetCartHdrUid: () => (cartHdrUid: number | string | undefined) => void;
120
121
  declare const useSetCartLines: () => (cartLines: TCartLine[]) => void;
122
+ declare const useClearCart: () => () => void;
121
123
 
122
124
  interface ItemsFiltersState {
123
125
  initialFiltersState: TItemsFilters;
@@ -671,4 +673,4 @@ declare const getItemSearchInfiniteKey: (itemsFilters: TItemsFilters, itemCatego
671
673
  */
672
674
  declare function useItemSearchInfinite(itemsFilters: TItemsFilters, itemCategoryUid?: number | string, options?: UseItemSearchInfiniteOptions): _tanstack_react_query.UseInfiniteQueryResult<_tanstack_react_query.InfiniteData<ItemSearchInfiniteResponse, unknown>, Error>;
673
675
 
674
- export { type AugurApiClient, AugurHooksProvider, CATEGORY_CACHE_OPTIONS, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type GetItemCategoryApiOptions, INV_MAST_CACHE_OPTIONS, INV_MAST_DOC_CACHE_OPTIONS, PRICE_CACHE_OPTIONS, type PageData, type SearchSuggestion, type SearchSuggestionsResponse, getCartPricingQueryOptions, getCategoryItemsInfiniteKey, getInvMastDocKey, getInvMastDocOptions, getInvMastKey, getInvMastOptions, getInvMastStockKey, getInvMastStockOptions, getItemAttributesKey, getItemAttributesOptions, getItemCategoryKey, getItemCategoryOptions, getItemDetailsKey, getItemDetailsOptions, getItemPriceKey, getItemPriceOptions, getItemSearchInfiniteKey, getProductCategoryKey, getProductCategoryOptions, getProductSearchKey, getProductSearchOptions, getSearchSuggestionsKey, getSearchSuggestionsOptions, useAugurApi, useCartActions, useCartHdrUid, useCartInitialization, useCartItemCount, useCartLines, useCartPricing, useCartStore, useCategoryItemsInfinite, useDebounce, useFormatPrice, useInvMast, useInvMastDoc, useInvMastStock, useItemAttributes, useItemCategory, useItemDetails, useItemFiltersStore, useItemPrice, useItemSearchInfinite, usePaginationPrefetch, useProductCategory, useProductSearch, useSearchSuggestions, useSetCartHdrUid, useSetCartLines };
676
+ export { type AugurApiClient, AugurHooksProvider, CATEGORY_CACHE_OPTIONS, type CartActionCallbacks, type CartInitCallbacks, type CartPriceData, type CartPricingResult, type CartSessionInfo, type GetItemCategoryApiOptions, INV_MAST_CACHE_OPTIONS, INV_MAST_DOC_CACHE_OPTIONS, PRICE_CACHE_OPTIONS, type PageData, type SearchSuggestion, type SearchSuggestionsResponse, getCartPricingQueryOptions, getCategoryItemsInfiniteKey, getInvMastDocKey, getInvMastDocOptions, getInvMastKey, getInvMastOptions, getInvMastStockKey, getInvMastStockOptions, getItemAttributesKey, getItemAttributesOptions, getItemCategoryKey, getItemCategoryOptions, getItemDetailsKey, getItemDetailsOptions, getItemPriceKey, getItemPriceOptions, getItemSearchInfiniteKey, getProductCategoryKey, getProductCategoryOptions, getProductSearchKey, getProductSearchOptions, getSearchSuggestionsKey, getSearchSuggestionsOptions, useAugurApi, useCartActions, useCartHdrUid, useCartInitialization, useCartItemCount, useCartLines, useCartPricing, useCartStore, useCategoryItemsInfinite, useClearCart, useDebounce, useFormatPrice, useInvMast, useInvMastDoc, useInvMastStock, useItemAttributes, useItemCategory, useItemDetails, useItemFiltersStore, useItemPrice, useItemSearchInfinite, usePaginationPrefetch, useProductCategory, useProductSearch, useSearchSuggestions, useSetCartHdrUid, useSetCartLines };
package/dist/index.js CHANGED
@@ -31,7 +31,12 @@ var useCartStore = create()(
31
31
  0
32
32
  );
33
33
  set({ cartLines, cartItemCount }, false, "setCartLines");
34
- }
34
+ },
35
+ clearCart: () => set(
36
+ { cartHdrUid: void 0, cartLines: [], cartItemCount: 0 },
37
+ false,
38
+ "clearCart"
39
+ )
35
40
  }),
36
41
  { name: "CartStore", enabled: process.env.NODE_ENV === "development" }
37
42
  )
@@ -41,6 +46,7 @@ var useCartLines = () => useCartStore((s) => s.cartLines);
41
46
  var useCartItemCount = () => useCartStore((s) => s.cartItemCount);
42
47
  var useSetCartHdrUid = () => useCartStore((s) => s.setCartHdrUid);
43
48
  var useSetCartLines = () => useCartStore((s) => s.setCartLines);
49
+ var useClearCart = () => useCartStore((s) => s.clearCart);
44
50
 
45
51
  // src/stores/items-filters-store.ts
46
52
  import { create as create2 } from "zustand";
@@ -655,7 +661,7 @@ function useCartActions(callbacks) {
655
661
 
656
662
  // src/hooks/use-cart-initialization.ts
657
663
  import { useEffect as useEffect2, useRef } from "react";
658
- import { useQuery as useQuery11 } from "@tanstack/react-query";
664
+ import { useQuery as useQuery11, useQueryClient as useQueryClient2 } from "@tanstack/react-query";
659
665
  import { CACHE_CONFIG as CACHE_CONFIG11 } from "@simpleapps-com/augur-utils";
660
666
  var MAX_RETRY_ATTEMPTS = 7;
661
667
  var RETRY_DELAY_MS = 1e3;
@@ -663,8 +669,20 @@ function useCartInitialization(session, callbacks) {
663
669
  const cartHdrUid = useCartHdrUid();
664
670
  const setCartHdrUid = useSetCartHdrUid();
665
671
  const setCartLines = useSetCartLines();
672
+ const clearCart = useClearCart();
673
+ const queryClient = useQueryClient2();
666
674
  const retryCountRef = useRef(0);
667
675
  const isInitializingRef = useRef(false);
676
+ const prevStatusRef = useRef(session.status);
677
+ useEffect2(() => {
678
+ const prevStatus = prevStatusRef.current;
679
+ prevStatusRef.current = session.status;
680
+ if (prevStatus === "authenticated" && session.status === "unauthenticated") {
681
+ clearCart();
682
+ queryClient.removeQueries({ queryKey: ["cartLines"] });
683
+ queryClient.removeQueries({ queryKey: ["cart-also-bought"] });
684
+ }
685
+ }, [session.status, clearCart, queryClient]);
668
686
  useEffect2(() => {
669
687
  if (cartHdrUid || session.status === "loading") return;
670
688
  if (session.cartHdrUid && session.status === "authenticated") {
@@ -798,7 +816,7 @@ function getCartPricingQueryOptions(api, cartLines, customerId) {
798
816
  }
799
817
 
800
818
  // src/hooks/use-pagination-prefetch.ts
801
- import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
819
+ import { useQueryClient as useQueryClient3 } from "@tanstack/react-query";
802
820
  import { useCallback as useCallback2 } from "react";
803
821
  var usePaginationPrefetch = ({
804
822
  queryKey,
@@ -808,7 +826,7 @@ var usePaginationPrefetch = ({
808
826
  gcTime = 30 * 60 * 1e3,
809
827
  enabled = true
810
828
  }) => {
811
- const queryClient = useQueryClient2();
829
+ const queryClient = useQueryClient3();
812
830
  const prefetchPage = useCallback2(
813
831
  async (page) => {
814
832
  if (!enabled) return;
@@ -961,6 +979,7 @@ export {
961
979
  useCartPricing,
962
980
  useCartStore,
963
981
  useCategoryItemsInfinite,
982
+ useClearCart,
964
983
  useDebounce,
965
984
  useFormatPrice,
966
985
  useInvMast,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\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 children: ReactNode;\n}\n\nconst AugurApiContext = createContext<AugurApiClient | null>(null);\n\n/**\n * Provides the augur-api SDK instance to all hooks in the tree.\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 */\nexport function AugurHooksProvider({ api, children }: AugurHooksProviderProps) {\n return (\n <AugurApiContext.Provider value={api}>{children}</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","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}\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 { 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);\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 { CACHE_CONFIG, type TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemPriceOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TPriceData>;\n}\n\nexport const PRICE_CACHE_OPTIONS = {\n ...CACHE_CONFIG.SEMI_STATIC,\n refetchOnReconnect: true,\n refetchOnWindowFocus: false,\n meta: { persist: true },\n} as const;\n\n/**\n * Generates a consistent query key for item price queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemPriceKey = (\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => {\n return [\"price\", itemId?.toUpperCase() || \"\", customerId, quantity] as const;\n};\n\n/**\n * Query options for item price. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemPriceOptions = (\n api: AugurApiClient,\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => ({\n queryKey: getItemPriceKey(itemId, customerId, quantity),\n queryFn: async (): Promise<TPriceData> => {\n const response = await api.pricing.priceEngine.get({\n itemId: itemId?.toUpperCase() || \"\",\n customerId: Number(customerId),\n quantity,\n });\n return response.data;\n },\n ...PRICE_CACHE_OPTIONS,\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 defaultOptions = getItemPriceOptions(api, itemId, customerId, quantity);\n\n return useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? (Boolean(itemId) && Boolean(customerId)),\n retry: 3,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TInvMastDoc } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\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\nexport const INV_MAST_DOC_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for inv mast doc queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getInvMastDocKey = (\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => {\n return [\n \"invMastDoc\",\n invMastUid,\n itemId.toUpperCase(),\n includePricing,\n ] as const;\n};\n\n/**\n * Query options for inv mast doc. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getInvMastDocOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => ({\n queryKey: getInvMastDocKey(invMastUid, itemId, includePricing),\n queryFn: async (): Promise<TInvMastDoc> => {\n const response = await api.items.invMast.doc.list(invMastUid, {\n includePricing,\n });\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_DOC_CACHE_OPTIONS,\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 queryOpts = getInvMastDocOptions(\n api,\n invMastUid,\n itemId,\n options.includePricing ?? \"N\",\n );\n\n const { data, isLoading, error } = useQuery<TInvMastDoc, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { GetItemCategoryApiOptions } from \"../types\";\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\nexport const CATEGORY_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\ntype ItemCategoryQueryKey = readonly [\n \"itemCategory\",\n number,\n GetItemCategoryApiOptions | undefined,\n];\n\n/**\n * Generates a consistent query key for item category queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemCategoryKey = (\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n): ItemCategoryQueryKey => {\n return [\"itemCategory\", itemCategoryUid, apiOptions] as const;\n};\n\n/**\n * Query options for item category. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n) => ({\n queryKey: getItemCategoryKey(itemCategoryUid, apiOptions),\n queryFn: async (): Promise<TCategory> => {\n const response = await api.items.itemCategory.get(\n itemCategoryUid,\n apiOptions,\n );\n if (!response.data) throw new Error(\"Item category not found\");\n return response.data;\n },\n ...CATEGORY_CACHE_OPTIONS,\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 queryOpts = getItemCategoryOptions(\n api,\n itemCategoryUid,\n options.apiOptions,\n );\n\n const { data, isLoading, error } = useQuery<\n TCategory,\n Error,\n TCategory,\n ItemCategoryQueryKey\n >({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { category: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const INV_MAST_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\nexport const getInvMastKey = (invMastUid: number, itemId: string) => {\n return [\"invMast\", invMastUid, itemId.toUpperCase()] as const;\n};\n\nexport const getInvMastOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n) => ({\n queryKey: getInvMastKey(invMastUid, itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.get(invMastUid);\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_CACHE_OPTIONS,\n});\n\nexport function useInvMast(\n invMastUid: number,\n itemId: string,\n options: UseInvMastOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastOptions(api, invMastUid, itemId);\n\n const { data, isLoading, error } = useQuery<TItemDetails, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TStockData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastStockOptions {\n enabled?: boolean;\n queryFn?: () => Promise<number>;\n}\n\nexport const getInvMastStockKey = (invMastUid: number | string) => {\n return [\"invMastStock\", invMastUid] as const;\n};\n\nexport const getInvMastStockOptions = (\n api: AugurApiClient,\n invMastUid: number | string,\n) => ({\n queryKey: getInvMastStockKey(invMastUid),\n queryFn: async (): Promise<number> => {\n const response = await api.items.invMast.stock.list(Number(invMastUid));\n const stockData: TStockData[] = response.data?.stockData ?? [];\n return stockData.reduce(\n (qty: number, stock: TStockData) => qty + stock.qtyOnHand,\n 0,\n );\n },\n ...CACHE_CONFIG.SEMI_STATIC,\n});\n\nexport function useInvMastStock(\n invMastUid: number | string,\n options: UseInvMastStockOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastStockOptions(api, invMastUid);\n\n const { data, isLoading, error } = useQuery({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ntype ProductCategoryResponse = {\n itemCategoryDesc: string;\n childrenTotal: number;\n children: TProductCategory[];\n categoryImage: string | null;\n};\n\ninterface UseProductCategoryOptions {\n enabled?: boolean;\n queryFn?: () => Promise<ProductCategoryResponse>;\n}\n\nexport const getProductCategoryKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"productCategory\", itemCategoryUid] as const;\n};\n\nexport const getProductCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getProductCategoryKey(itemCategoryUid),\n queryFn: async (): Promise<ProductCategoryResponse> => {\n const response = await api.items.itemCategory.get(\n Number(itemCategoryUid),\n );\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useProductCategory(\n itemCategoryUid: number | string | null,\n options: UseProductCategoryOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getProductCategoryOptions(api, itemCategoryUid)\n : { queryKey: getProductCategoryKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 childrenTotal: data?.childrenTotal ?? 0,\n itemCategoryDesc: data?.itemCategoryDesc ?? \"\",\n productCategories: data?.children ?? null,\n productCategoryImage: data?.categoryImage ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemDetailsOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const getItemDetailsKey = (itemId: number | string) => {\n return [\"itemDetails\", itemId] as const;\n};\n\nexport const getItemDetailsOptions = (\n api: AugurApiClient,\n itemId: number | string,\n) => ({\n queryKey: getItemDetailsKey(itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.doc.list(Number(itemId));\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemDetails(\n itemId: number | string | undefined,\n options: UseItemDetailsOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemId\n ? getItemDetailsOptions(api, itemId)\n : { queryKey: getItemDetailsKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TAttribute } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemAttributesOptions {\n enabled?: boolean;\n queryFn?: () => Promise<{ attributes: TAttribute[] }>;\n}\n\nexport const getItemAttributesKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"itemAttributes\", itemCategoryUid] as const;\n};\n\nexport const getItemAttributesOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getItemAttributesKey(itemCategoryUid),\n queryFn: async () => {\n const response = await api.openSearch.itemSearch.attributes.list({\n q: \"\",\n searchType: \"query\",\n classId5List: String(itemCategoryUid),\n });\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemAttributes(\n itemCategoryUid: number | string | null,\n options: UseItemAttributesOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getItemAttributesOptions(api, itemCategoryUid)\n : {\n queryKey: getItemAttributesKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductItem } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { PageData } from \"../types\";\n\ntype ProductSearchResponse = {\n items: TProductItem[];\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 * Generates a consistent query key for product search queries.\n */\nexport const getProductSearchKey = (pageData: PageData) => {\n return [\n \"productSearch\",\n pageData.q,\n pageData.limit,\n pageData.offset,\n pageData.sortBy,\n pageData.itemCategoryUid,\n ] as const;\n};\n\n/**\n * Query options for product search. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getProductSearchOptions = (\n api: AugurApiClient,\n pageData: PageData,\n) => ({\n queryKey: getProductSearchKey(pageData),\n queryFn: async (): Promise<ProductSearchResponse> => {\n const response = await api.openSearch.itemSearch.list({\n q: pageData.q,\n searchType: \"query\",\n size: pageData.limit,\n from: pageData.offset,\n classId5List: pageData.itemCategoryUid\n ? String(pageData.itemCategoryUid)\n : undefined,\n filters: pageData.filters\n ? JSON.stringify(pageData.filters)\n : undefined,\n });\n return response.data;\n },\n ...CACHE_CONFIG.SEMI_STATIC,\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 defaultOptions = getProductSearchOptions(api, pageData);\n\n const { data, isLoading, error } = useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { SearchSuggestionsResponse } from \"../types\";\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\nconst SEARCH_SUGGESTIONS_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for search suggestion queries.\n */\nexport const getSearchSuggestionsKey = (\n query: string,\n limit: number,\n offset: number,\n) => {\n return [\"searchSuggestions\", query, limit, offset] as const;\n};\n\n/**\n * Query options for search suggestions. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getSearchSuggestionsOptions = (\n api: AugurApiClient,\n query: string,\n limit: number = 10,\n offset: number = 0,\n) => ({\n queryKey: getSearchSuggestionsKey(query, limit, offset),\n queryFn: async (): Promise<SearchSuggestionsResponse> => {\n const response = await api.openSearch.suggestions.suggest.list({\n q: query,\n });\n return response.data;\n },\n ...SEARCH_SUGGESTIONS_CACHE_OPTIONS,\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 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);\n\n const { data, isLoading, error } = useQuery<\n SearchSuggestionsResponse,\n Error\n >({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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. Returns true on success. */\n addToCart: (\n cartHdrUid: number,\n items: Array<{\n cartHdrUid: number;\n invMastUid: number;\n quantity: number;\n unitOfMeasure: string;\n }>,\n ) => Promise<boolean | unknown>;\n /** Update cart lines via API. Returns true on success. */\n updateCartLines: (\n cartHdrUid: number,\n lines: TCartLine[],\n ) => Promise<boolean | unknown>;\n /** Delete all items from cart via API. Returns true on success. */\n deleteItemsFromCart: (cartHdrUid: number) => Promise<boolean | unknown>;\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, useRef } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useSetCartHdrUid,\n useSetCartLines,\n} from \"../stores/cart-store\";\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;\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>;\n /** Fetch cart line items for a given cart header UID. */\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[]>;\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 cartHdrUid = useCartHdrUid();\n const setCartHdrUid = useSetCartHdrUid();\n const setCartLines = useSetCartLines();\n\n const retryCountRef = useRef(0);\n const isInitializingRef = useRef(false);\n\n // Initialize cart header\n useEffect(() => {\n if (cartHdrUid || session.status === \"loading\") return;\n\n // Authenticated user — use session cartHdrUid\n if (session.cartHdrUid && session.status === \"authenticated\") {\n setCartHdrUid(session.cartHdrUid);\n return;\n }\n\n // Guest user — lookup/create cart\n if (session.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 }, [session, cartHdrUid, setCartHdrUid, callbacks]);\n\n // Fetch cart lines when cartHdrUid is available\n const { data: cartLinesData } = useQuery({\n queryKey: [\"cartLines\", cartHdrUid],\n queryFn: () => callbacks.getCartLines(Number(cartHdrUid)),\n enabled: !!cartHdrUid,\n ...CACHE_CONFIG.CART,\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 { useCartLines } from \"../stores/cart-store\";\nimport { getItemPriceOptions } from \"./use-item-price\";\nimport { useAugurApi } from \"../provider\";\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}\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 cartLines = useCartLines();\n const { customerId } = options;\n\n const priceQueries = useQueries({\n queries: cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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\n/**\n * Get cart pricing query options for prefetching or parent components.\n */\nexport function getCartPricingQueryOptions(\n api: ReturnType<typeof useAugurApi>,\n cartLines: Array<{ itemId: string; quantity: number }>,\n customerId: string | number | undefined,\n) {\n return cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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 /** 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 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: [...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, 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 {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface CategoryItemsInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseCategoryItemsInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getCategoryItemsInfiniteKey = (\n itemCategoryUid: number,\n itemsFilters: TItemsFilters,\n) => {\n return [\n \"categoryItemsInfinite\",\n itemCategoryUid,\n JSON.stringify(itemsFilters),\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<CategoryItemsInfiniteResponse>({\n queryKey: getCategoryItemsInfiniteKey(itemCategoryUid, itemsFilters),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q || \"\",\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: String(itemCategoryUid),\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemCategoryUid,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface ItemSearchInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseItemSearchInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getItemSearchInfiniteKey = (\n itemsFilters: TItemsFilters,\n itemCategoryUid?: number | string,\n) => {\n return [\n \"itemSearchInfinite\",\n JSON.stringify(itemsFilters),\n itemCategoryUid,\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<ItemSearchInfiniteResponse>({\n queryKey: getItemSearchInfiniteKey(itemsFilters, itemCategoryUid),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q,\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemsFilters.q,\n meta: { persist: true },\n });\n}\n"],"mappings":"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","names":["create","devtools","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useEffect","useQuery","CACHE_CONFIG","useEffect","useQuery","CACHE_CONFIG","useQueryClient","useCallback","CACHE_CONFIG","CACHE_CONFIG","useInfiniteQuery","CACHE_CONFIG","useInfiniteQuery","CACHE_CONFIG"]}
1
+ {"version":3,"sources":["../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"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\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 children: ReactNode;\n}\n\nconst AugurApiContext = createContext<AugurApiClient | null>(null);\n\n/**\n * Provides the augur-api SDK instance to all hooks in the tree.\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 */\nexport function AugurHooksProvider({ api, children }: AugurHooksProviderProps) {\n return (\n <AugurApiContext.Provider value={api}>{children}</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","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 { CACHE_CONFIG, type TPriceData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemPriceOptions {\n enabled?: boolean;\n /** Override the default queryFn (e.g. with a cached server action). */\n queryFn?: () => Promise<TPriceData>;\n}\n\nexport const PRICE_CACHE_OPTIONS = {\n ...CACHE_CONFIG.SEMI_STATIC,\n refetchOnReconnect: true,\n refetchOnWindowFocus: false,\n meta: { persist: true },\n} as const;\n\n/**\n * Generates a consistent query key for item price queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemPriceKey = (\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => {\n return [\"price\", itemId?.toUpperCase() || \"\", customerId, quantity] as const;\n};\n\n/**\n * Query options for item price. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemPriceOptions = (\n api: AugurApiClient,\n itemId: string | undefined,\n customerId: string | number | undefined,\n quantity: number = 1,\n) => ({\n queryKey: getItemPriceKey(itemId, customerId, quantity),\n queryFn: async (): Promise<TPriceData> => {\n const response = await api.pricing.priceEngine.get({\n itemId: itemId?.toUpperCase() || \"\",\n customerId: Number(customerId),\n quantity,\n });\n return response.data;\n },\n ...PRICE_CACHE_OPTIONS,\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 defaultOptions = getItemPriceOptions(api, itemId, customerId, quantity);\n\n return useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? (Boolean(itemId) && Boolean(customerId)),\n retry: 3,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TInvMastDoc } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\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\nexport const INV_MAST_DOC_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for inv mast doc queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getInvMastDocKey = (\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => {\n return [\n \"invMastDoc\",\n invMastUid,\n itemId.toUpperCase(),\n includePricing,\n ] as const;\n};\n\n/**\n * Query options for inv mast doc. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getInvMastDocOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n includePricing: \"Y\" | \"N\",\n) => ({\n queryKey: getInvMastDocKey(invMastUid, itemId, includePricing),\n queryFn: async (): Promise<TInvMastDoc> => {\n const response = await api.items.invMast.doc.list(invMastUid, {\n includePricing,\n });\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_DOC_CACHE_OPTIONS,\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 queryOpts = getInvMastDocOptions(\n api,\n invMastUid,\n itemId,\n options.includePricing ?? \"N\",\n );\n\n const { data, isLoading, error } = useQuery<TInvMastDoc, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { GetItemCategoryApiOptions } from \"../types\";\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\nexport const CATEGORY_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\ntype ItemCategoryQueryKey = readonly [\n \"itemCategory\",\n number,\n GetItemCategoryApiOptions | undefined,\n];\n\n/**\n * Generates a consistent query key for item category queries.\n * Usable in both client hooks and server-side prefetch.\n */\nexport const getItemCategoryKey = (\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n): ItemCategoryQueryKey => {\n return [\"itemCategory\", itemCategoryUid, apiOptions] as const;\n};\n\n/**\n * Query options for item category. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getItemCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number,\n apiOptions?: GetItemCategoryApiOptions,\n) => ({\n queryKey: getItemCategoryKey(itemCategoryUid, apiOptions),\n queryFn: async (): Promise<TCategory> => {\n const response = await api.items.itemCategory.get(\n itemCategoryUid,\n apiOptions,\n );\n if (!response.data) throw new Error(\"Item category not found\");\n return response.data;\n },\n ...CATEGORY_CACHE_OPTIONS,\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 queryOpts = getItemCategoryOptions(\n api,\n itemCategoryUid,\n options.apiOptions,\n );\n\n const { data, isLoading, error } = useQuery<\n TCategory,\n Error,\n TCategory,\n ItemCategoryQueryKey\n >({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { category: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const INV_MAST_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\nexport const getInvMastKey = (invMastUid: number, itemId: string) => {\n return [\"invMast\", invMastUid, itemId.toUpperCase()] as const;\n};\n\nexport const getInvMastOptions = (\n api: AugurApiClient,\n invMastUid: number,\n itemId: string,\n) => ({\n queryKey: getInvMastKey(invMastUid, itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.get(invMastUid);\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...INV_MAST_CACHE_OPTIONS,\n});\n\nexport function useInvMast(\n invMastUid: number,\n itemId: string,\n options: UseInvMastOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastOptions(api, invMastUid, itemId);\n\n const { data, isLoading, error } = useQuery<TItemDetails, Error>({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\n enabled: options.enabled ?? true,\n });\n\n return { item: data, isLoading, error };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TStockData } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseInvMastStockOptions {\n enabled?: boolean;\n queryFn?: () => Promise<number>;\n}\n\nexport const getInvMastStockKey = (invMastUid: number | string) => {\n return [\"invMastStock\", invMastUid] as const;\n};\n\nexport const getInvMastStockOptions = (\n api: AugurApiClient,\n invMastUid: number | string,\n) => ({\n queryKey: getInvMastStockKey(invMastUid),\n queryFn: async (): Promise<number> => {\n const response = await api.items.invMast.stock.list(Number(invMastUid));\n const stockData: TStockData[] = response.data?.stockData ?? [];\n return stockData.reduce(\n (qty: number, stock: TStockData) => qty + stock.qtyOnHand,\n 0,\n );\n },\n ...CACHE_CONFIG.SEMI_STATIC,\n});\n\nexport function useInvMastStock(\n invMastUid: number | string,\n options: UseInvMastStockOptions = {},\n) {\n const api = useAugurApi();\n const queryOpts = getInvMastStockOptions(api, invMastUid);\n\n const { data, isLoading, error } = useQuery({\n ...queryOpts,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductCategory } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ntype ProductCategoryResponse = {\n itemCategoryDesc: string;\n childrenTotal: number;\n children: TProductCategory[];\n categoryImage: string | null;\n};\n\ninterface UseProductCategoryOptions {\n enabled?: boolean;\n queryFn?: () => Promise<ProductCategoryResponse>;\n}\n\nexport const getProductCategoryKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"productCategory\", itemCategoryUid] as const;\n};\n\nexport const getProductCategoryOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getProductCategoryKey(itemCategoryUid),\n queryFn: async (): Promise<ProductCategoryResponse> => {\n const response = await api.items.itemCategory.get(\n Number(itemCategoryUid),\n );\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useProductCategory(\n itemCategoryUid: number | string | null,\n options: UseProductCategoryOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getProductCategoryOptions(api, itemCategoryUid)\n : { queryKey: getProductCategoryKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 childrenTotal: data?.childrenTotal ?? 0,\n itemCategoryDesc: data?.itemCategoryDesc ?? \"\",\n productCategories: data?.children ?? null,\n productCategoryImage: data?.categoryImage ?? null,\n loading: isLoading,\n error: error as Error | null,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TItemDetails } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemDetailsOptions {\n enabled?: boolean;\n queryFn?: () => Promise<TItemDetails>;\n}\n\nexport const getItemDetailsKey = (itemId: number | string) => {\n return [\"itemDetails\", itemId] as const;\n};\n\nexport const getItemDetailsOptions = (\n api: AugurApiClient,\n itemId: number | string,\n) => ({\n queryKey: getItemDetailsKey(itemId),\n queryFn: async (): Promise<TItemDetails> => {\n const response = await api.items.invMast.doc.list(Number(itemId));\n if (!response.data) throw new Error(\"Item not found\");\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemDetails(\n itemId: number | string | undefined,\n options: UseItemDetailsOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemId\n ? getItemDetailsOptions(api, itemId)\n : { queryKey: getItemDetailsKey(\"\"),\n /* v8 ignore next */\n queryFn: () => Promise.reject() }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TAttribute } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\n\ninterface UseItemAttributesOptions {\n enabled?: boolean;\n queryFn?: () => Promise<{ attributes: TAttribute[] }>;\n}\n\nexport const getItemAttributesKey = (\n itemCategoryUid: number | string | null,\n) => {\n return [\"itemAttributes\", itemCategoryUid] as const;\n};\n\nexport const getItemAttributesOptions = (\n api: AugurApiClient,\n itemCategoryUid: number | string,\n) => ({\n queryKey: getItemAttributesKey(itemCategoryUid),\n queryFn: async () => {\n const response = await api.openSearch.itemSearch.attributes.list({\n q: \"\",\n searchType: \"query\",\n classId5List: String(itemCategoryUid),\n });\n return response.data;\n },\n ...CACHE_CONFIG.STATIC,\n});\n\nexport function useItemAttributes(\n itemCategoryUid: number | string | null,\n options: UseItemAttributesOptions = {},\n) {\n const api = useAugurApi();\n\n const { data, isLoading, error } = useQuery({\n ...(itemCategoryUid\n ? getItemAttributesOptions(api, itemCategoryUid)\n : {\n queryKey: getItemAttributesKey(null),\n /* v8 ignore next */\n queryFn: () => Promise.reject(),\n }),\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG, type TProductItem } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { PageData } from \"../types\";\n\ntype ProductSearchResponse = {\n items: TProductItem[];\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 * Generates a consistent query key for product search queries.\n */\nexport const getProductSearchKey = (pageData: PageData) => {\n return [\n \"productSearch\",\n pageData.q,\n pageData.limit,\n pageData.offset,\n pageData.sortBy,\n pageData.itemCategoryUid,\n ] as const;\n};\n\n/**\n * Query options for product search. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getProductSearchOptions = (\n api: AugurApiClient,\n pageData: PageData,\n) => ({\n queryKey: getProductSearchKey(pageData),\n queryFn: async (): Promise<ProductSearchResponse> => {\n const response = await api.openSearch.itemSearch.list({\n q: pageData.q,\n searchType: \"query\",\n size: pageData.limit,\n from: pageData.offset,\n classId5List: pageData.itemCategoryUid\n ? String(pageData.itemCategoryUid)\n : undefined,\n filters: pageData.filters\n ? JSON.stringify(pageData.filters)\n : undefined,\n });\n return response.data;\n },\n ...CACHE_CONFIG.SEMI_STATIC,\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 defaultOptions = getProductSearchOptions(api, pageData);\n\n const { data, isLoading, error } = useQuery({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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 { CACHE_CONFIG } from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi, type AugurApiClient } from \"../provider\";\nimport type { SearchSuggestionsResponse } from \"../types\";\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\nconst SEARCH_SUGGESTIONS_CACHE_OPTIONS = CACHE_CONFIG.STATIC;\n\n/**\n * Generates a consistent query key for search suggestion queries.\n */\nexport const getSearchSuggestionsKey = (\n query: string,\n limit: number,\n offset: number,\n) => {\n return [\"searchSuggestions\", query, limit, offset] as const;\n};\n\n/**\n * Query options for search suggestions. Accepts the SDK instance so it works\n * in both client (via provider) and server (via direct construction).\n */\nexport const getSearchSuggestionsOptions = (\n api: AugurApiClient,\n query: string,\n limit: number = 10,\n offset: number = 0,\n) => ({\n queryKey: getSearchSuggestionsKey(query, limit, offset),\n queryFn: async (): Promise<SearchSuggestionsResponse> => {\n const response = await api.openSearch.suggestions.suggest.list({\n q: query,\n });\n return response.data;\n },\n ...SEARCH_SUGGESTIONS_CACHE_OPTIONS,\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 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);\n\n const { data, isLoading, error } = useQuery<\n SearchSuggestionsResponse,\n Error\n >({\n ...defaultOptions,\n ...(options.queryFn ? { queryFn: options.queryFn } : {}),\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. Returns true on success. */\n addToCart: (\n cartHdrUid: number,\n items: Array<{\n cartHdrUid: number;\n invMastUid: number;\n quantity: number;\n unitOfMeasure: string;\n }>,\n ) => Promise<boolean | unknown>;\n /** Update cart lines via API. Returns true on success. */\n updateCartLines: (\n cartHdrUid: number,\n lines: TCartLine[],\n ) => Promise<boolean | unknown>;\n /** Delete all items from cart via API. Returns true on success. */\n deleteItemsFromCart: (cartHdrUid: number) => Promise<boolean | unknown>;\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, useRef } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { CACHE_CONFIG, type TCartLine } from \"@simpleapps-com/augur-utils\";\nimport {\n useCartHdrUid,\n useSetCartHdrUid,\n useSetCartLines,\n useClearCart,\n} from \"../stores/cart-store\";\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;\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>;\n /** Fetch cart line items for a given cart header UID. */\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[]>;\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 cartHdrUid = useCartHdrUid();\n const setCartHdrUid = useSetCartHdrUid();\n const setCartLines = useSetCartLines();\n const clearCart = useClearCart();\n const queryClient = useQueryClient();\n\n const retryCountRef = useRef(0);\n const isInitializingRef = useRef(false);\n const prevStatusRef = useRef(session.status);\n\n // Auto-clear cart on logout (authenticated → unauthenticated)\n useEffect(() => {\n const prevStatus = prevStatusRef.current;\n prevStatusRef.current = session.status;\n\n if (\n prevStatus === \"authenticated\" &&\n session.status === \"unauthenticated\"\n ) {\n clearCart();\n queryClient.removeQueries({ queryKey: [\"cartLines\"] });\n queryClient.removeQueries({ queryKey: [\"cart-also-bought\"] });\n }\n }, [session.status, clearCart, queryClient]);\n\n // Initialize cart header\n useEffect(() => {\n if (cartHdrUid || session.status === \"loading\") return;\n\n // Authenticated user — use session cartHdrUid\n if (session.cartHdrUid && session.status === \"authenticated\") {\n setCartHdrUid(session.cartHdrUid);\n return;\n }\n\n // Guest user — lookup/create cart\n if (session.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 }, [session, cartHdrUid, setCartHdrUid, callbacks]);\n\n // Fetch cart lines when cartHdrUid is available\n const { data: cartLinesData } = useQuery({\n queryKey: [\"cartLines\", cartHdrUid],\n queryFn: () => callbacks.getCartLines(Number(cartHdrUid)),\n enabled: !!cartHdrUid,\n ...CACHE_CONFIG.CART,\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 { useCartLines } from \"../stores/cart-store\";\nimport { getItemPriceOptions } from \"./use-item-price\";\nimport { useAugurApi } from \"../provider\";\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}\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 cartLines = useCartLines();\n const { customerId } = options;\n\n const priceQueries = useQueries({\n queries: cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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\n/**\n * Get cart pricing query options for prefetching or parent components.\n */\nexport function getCartPricingQueryOptions(\n api: ReturnType<typeof useAugurApi>,\n cartLines: Array<{ itemId: string; quantity: number }>,\n customerId: string | number | undefined,\n) {\n return cartLines.map((line) => ({\n ...getItemPriceOptions(api, line.itemId, customerId, line.quantity),\n enabled: !!customerId && !!line.itemId,\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 /** 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 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: [...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, 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 {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface CategoryItemsInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseCategoryItemsInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getCategoryItemsInfiniteKey = (\n itemCategoryUid: number,\n itemsFilters: TItemsFilters,\n) => {\n return [\n \"categoryItemsInfinite\",\n itemCategoryUid,\n JSON.stringify(itemsFilters),\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<CategoryItemsInfiniteResponse>({\n queryKey: getCategoryItemsInfiniteKey(itemCategoryUid, itemsFilters),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q || \"\",\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: String(itemCategoryUid),\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemCategoryUid,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport {\n CACHE_CONFIG,\n type TItemsFilters,\n type TProductItem,\n} from \"@simpleapps-com/augur-utils\";\nimport { useAugurApi } from \"../provider\";\n\ninterface ItemSearchInfiniteResponse {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\ninterface UseItemSearchInfiniteOptions {\n enabled?: boolean;\n}\n\nexport const getItemSearchInfiniteKey = (\n itemsFilters: TItemsFilters,\n itemCategoryUid?: number | string,\n) => {\n return [\n \"itemSearchInfinite\",\n JSON.stringify(itemsFilters),\n itemCategoryUid,\n ] as const;\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 { enabled = true } = options;\n\n return useInfiniteQuery<ItemSearchInfiniteResponse>({\n queryKey: getItemSearchInfiniteKey(itemsFilters, itemCategoryUid),\n queryFn: async ({ pageParam = 0 }) => {\n const response = await api.openSearch.itemSearch.list({\n q: itemsFilters.q,\n searchType: \"query\",\n size: itemsFilters.limit,\n from: pageParam as number,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: itemsFilters.filters?.length\n ? JSON.stringify(itemsFilters.filters)\n : undefined,\n });\n const items: TProductItem[] = response.data?.items ?? [];\n const total: number = response.data?.totalResults ?? 0;\n const nextOffset = (pageParam as number) + itemsFilters.limit;\n return {\n data: items,\n total,\n nextCursor: nextOffset < total ? nextOffset : undefined,\n };\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n ...CACHE_CONFIG.SEMI_STATIC,\n enabled: enabled && !!itemsFilters.q,\n meta: { persist: true },\n });\n}\n"],"mappings":"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","names":["create","devtools","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useQuery","CACHE_CONFIG","CACHE_CONFIG","useQuery","useEffect","useQuery","useQueryClient","CACHE_CONFIG","useQueryClient","useEffect","useQuery","CACHE_CONFIG","useQueryClient","useCallback","CACHE_CONFIG","CACHE_CONFIG","useInfiniteQuery","CACHE_CONFIG","useInfiniteQuery","CACHE_CONFIG"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simpleapps-com/augur-hooks",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Cross-platform React Query hooks and Zustand stores for Augur ecommerce sites",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  "dist"
27
27
  ],
28
28
  "dependencies": {
29
- "@simpleapps-com/augur-utils": "0.1.1"
29
+ "@simpleapps-com/augur-utils": "0.1.3"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@simpleapps-com/augur-api": "^0.9.0",