@viu/emporix-sdk-react 2.6.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hooks.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AddressMutationsApi, C as CartMutationsApi, a as CheckoutApi, b as CompanySwitcherApi, c as CouponActionVars, d as CustomerSessionApi, P as PasswordResetApi, U as UseAvailabilitiesOptions, e as UseAvailabilityOptions, f as UseCancelOrderVars, g as UseMyOrdersInfiniteOptions, h as UseMyOrdersOptions, i as UseOrderOptions, j as UseOrderTransitionVars, k as UseReorderResult, l as UseReorderVars, m as UseUpdateSalesOrderVars, n as UseVariantChildrenOptions, u as useActiveCart, o as useAddToShoppingList, p as useAddressMutations, q as useAssignContact, r as useAvailabilities, s as useAvailability, t as useCancelOrder, v as useCart, w as useCartMutations, x as useCategories, y as useCategoriesInfinite, z as useCategory, B as useCategoryTree, D as useChangePassword, E as useCheckout, F as useCompany, G as useCompanyContacts, H as useCompanyGroups, I as useCompanyLocations, J as useCompanySwitcher, K as useCreateCart, L as useCreateCompany, M as useCreateLocation, N as useCreateReturn, O as useCreateShoppingList, Q as useCustomerAddresses, R as useCustomerSession, S as useDefaultSite, T as useDeleteCompany, V as useDeleteLocation, W as useDeleteShoppingList, X as useMatchPrices, Y as useMatchPricesChunked, Z as useMyCompanies, _ as useMyOrders, $ as useMyOrdersInfinite, a0 as useMyReturns, a1 as useMyRewardPoints, a2 as useMyRewardPointsSummary, a3 as useMySegmentCategories, a4 as useMySegmentCategoriesInfinite, a5 as useMySegmentCategoryTree, a6 as useMySegmentItems, a7 as useMySegmentProducts, a8 as useMySegmentProductsInfinite, a9 as useMySegments, aa as useOrder, ab as useOrderTransition, ac as usePasswordReset, ad as usePaymentModes, ae as useProduct, af as useProductByCode, ag as useProductMedia, ah as useProductSearch, ai as useProducts, aj as useProductsByCodes, ak as useProductsInCategory, al as useProductsInCategoryInfinite, am as useProductsInfinite, an as useRedeemCoupon, ao as useRedeemOptions, ap as useRedeemRewardPoints, aq as useRemoveFromShoppingList, ar as useReorder, as as useReturn, at as useSalesOrder, au as useSetShoppingListItemQuantity, av as useShoppingLists, aw as useSiteContext, ax as useSites, ay as useUnassignContact, az as useUpdateCompany, aA as useUpdateContactAssignment, aB as useUpdateCustomer, aC as useUpdateLocation, aD as useUpdateSalesOrder, aE as useValidateCoupon, aF as useVariantChildren } from './use-returns-BbOXQG4L.cjs';
1
+ export { A as AddressMutationsApi, C as CartMutationsApi, a as CheckoutApi, b as CompanySwitcherApi, c as CouponActionVars, d as CustomerSessionApi, P as PasswordResetApi, U as UseAvailabilitiesOptions, e as UseAvailabilityOptions, f as UseCancelOrderVars, g as UseMyOrdersInfiniteOptions, h as UseMyOrdersOptions, i as UseOrderOptions, j as UseOrderTransitionVars, k as UseReorderResult, l as UseReorderVars, m as UseUpdateSalesOrderVars, n as UseVariantChildrenOptions, u as useActiveCart, o as useAddToShoppingList, p as useAddressMutations, q as useAssignContact, r as useAvailabilities, s as useAvailability, t as useCancelOrder, v as useCart, w as useCartMutations, x as useCategories, y as useCategoriesInfinite, z as useCategory, B as useCategoryTree, D as useChangePassword, E as useCheckout, F as useCompany, G as useCompanyContacts, H as useCompanyGroups, I as useCompanyLocations, J as useCompanySwitcher, K as useCreateCart, L as useCreateCompany, M as useCreateLocation, N as useCreateReturn, O as useCreateShoppingList, Q as useCustomerAddresses, R as useCustomerSession, S as useDefaultSite, T as useDeleteCompany, V as useDeleteLocation, W as useDeleteShoppingList, X as useMatchPrices, Y as useMatchPricesChunked, Z as useMyCompanies, _ as useMyOrders, $ as useMyOrdersInfinite, a0 as useMyReturns, a1 as useMyRewardPoints, a2 as useMyRewardPointsSummary, a3 as useMySegmentCategories, a4 as useMySegmentCategoriesInfinite, a5 as useMySegmentCategoryTree, a6 as useMySegmentItems, a7 as useMySegmentProducts, a8 as useMySegmentProductsInfinite, a9 as useMySegments, aa as useOrder, ab as useOrderTransition, ac as usePasswordReset, ad as usePaymentModes, ae as useProduct, af as useProductByCode, ag as useProductMedia, ah as useProductSearch, ai as useProducts, aj as useProductsByCodes, ak as useProductsInCategory, al as useProductsInCategoryInfinite, am as useProductsInfinite, an as useRedeemCoupon, ao as useRedeemOptions, ap as useRedeemRewardPoints, aq as useRemoveFromShoppingList, ar as useReorder, as as useReturn, at as useSalesOrder, au as useSetShoppingListItemQuantity, av as useShoppingLists, aw as useSiteContext, ax as useSites, ay as useSubcategories, az as useUnassignContact, aA as useUpdateCompany, aB as useUpdateContactAssignment, aC as useUpdateCustomer, aD as useUpdateLocation, aE as useUpdateSalesOrder, aF as useValidateCoupon, aG as useVariantChildren } from './use-returns-D9g9zYu1.cjs';
2
2
  import { UseQueryResult, UseMutationResult } from '@tanstack/react-query';
3
3
  import { ApprovalPatch, Approval, ApprovalList, ApprovalCreated, ApprovalInput } from '@viu/emporix-sdk';
4
4
  import './provider-WHISqTG2.cjs';
package/dist/hooks.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AddressMutationsApi, C as CartMutationsApi, a as CheckoutApi, b as CompanySwitcherApi, c as CouponActionVars, d as CustomerSessionApi, P as PasswordResetApi, U as UseAvailabilitiesOptions, e as UseAvailabilityOptions, f as UseCancelOrderVars, g as UseMyOrdersInfiniteOptions, h as UseMyOrdersOptions, i as UseOrderOptions, j as UseOrderTransitionVars, k as UseReorderResult, l as UseReorderVars, m as UseUpdateSalesOrderVars, n as UseVariantChildrenOptions, u as useActiveCart, o as useAddToShoppingList, p as useAddressMutations, q as useAssignContact, r as useAvailabilities, s as useAvailability, t as useCancelOrder, v as useCart, w as useCartMutations, x as useCategories, y as useCategoriesInfinite, z as useCategory, B as useCategoryTree, D as useChangePassword, E as useCheckout, F as useCompany, G as useCompanyContacts, H as useCompanyGroups, I as useCompanyLocations, J as useCompanySwitcher, K as useCreateCart, L as useCreateCompany, M as useCreateLocation, N as useCreateReturn, O as useCreateShoppingList, Q as useCustomerAddresses, R as useCustomerSession, S as useDefaultSite, T as useDeleteCompany, V as useDeleteLocation, W as useDeleteShoppingList, X as useMatchPrices, Y as useMatchPricesChunked, Z as useMyCompanies, _ as useMyOrders, $ as useMyOrdersInfinite, a0 as useMyReturns, a1 as useMyRewardPoints, a2 as useMyRewardPointsSummary, a3 as useMySegmentCategories, a4 as useMySegmentCategoriesInfinite, a5 as useMySegmentCategoryTree, a6 as useMySegmentItems, a7 as useMySegmentProducts, a8 as useMySegmentProductsInfinite, a9 as useMySegments, aa as useOrder, ab as useOrderTransition, ac as usePasswordReset, ad as usePaymentModes, ae as useProduct, af as useProductByCode, ag as useProductMedia, ah as useProductSearch, ai as useProducts, aj as useProductsByCodes, ak as useProductsInCategory, al as useProductsInCategoryInfinite, am as useProductsInfinite, an as useRedeemCoupon, ao as useRedeemOptions, ap as useRedeemRewardPoints, aq as useRemoveFromShoppingList, ar as useReorder, as as useReturn, at as useSalesOrder, au as useSetShoppingListItemQuantity, av as useShoppingLists, aw as useSiteContext, ax as useSites, ay as useUnassignContact, az as useUpdateCompany, aA as useUpdateContactAssignment, aB as useUpdateCustomer, aC as useUpdateLocation, aD as useUpdateSalesOrder, aE as useValidateCoupon, aF as useVariantChildren } from './use-returns-BED8-FtN.js';
1
+ export { A as AddressMutationsApi, C as CartMutationsApi, a as CheckoutApi, b as CompanySwitcherApi, c as CouponActionVars, d as CustomerSessionApi, P as PasswordResetApi, U as UseAvailabilitiesOptions, e as UseAvailabilityOptions, f as UseCancelOrderVars, g as UseMyOrdersInfiniteOptions, h as UseMyOrdersOptions, i as UseOrderOptions, j as UseOrderTransitionVars, k as UseReorderResult, l as UseReorderVars, m as UseUpdateSalesOrderVars, n as UseVariantChildrenOptions, u as useActiveCart, o as useAddToShoppingList, p as useAddressMutations, q as useAssignContact, r as useAvailabilities, s as useAvailability, t as useCancelOrder, v as useCart, w as useCartMutations, x as useCategories, y as useCategoriesInfinite, z as useCategory, B as useCategoryTree, D as useChangePassword, E as useCheckout, F as useCompany, G as useCompanyContacts, H as useCompanyGroups, I as useCompanyLocations, J as useCompanySwitcher, K as useCreateCart, L as useCreateCompany, M as useCreateLocation, N as useCreateReturn, O as useCreateShoppingList, Q as useCustomerAddresses, R as useCustomerSession, S as useDefaultSite, T as useDeleteCompany, V as useDeleteLocation, W as useDeleteShoppingList, X as useMatchPrices, Y as useMatchPricesChunked, Z as useMyCompanies, _ as useMyOrders, $ as useMyOrdersInfinite, a0 as useMyReturns, a1 as useMyRewardPoints, a2 as useMyRewardPointsSummary, a3 as useMySegmentCategories, a4 as useMySegmentCategoriesInfinite, a5 as useMySegmentCategoryTree, a6 as useMySegmentItems, a7 as useMySegmentProducts, a8 as useMySegmentProductsInfinite, a9 as useMySegments, aa as useOrder, ab as useOrderTransition, ac as usePasswordReset, ad as usePaymentModes, ae as useProduct, af as useProductByCode, ag as useProductMedia, ah as useProductSearch, ai as useProducts, aj as useProductsByCodes, ak as useProductsInCategory, al as useProductsInCategoryInfinite, am as useProductsInfinite, an as useRedeemCoupon, ao as useRedeemOptions, ap as useRedeemRewardPoints, aq as useRemoveFromShoppingList, ar as useReorder, as as useReturn, at as useSalesOrder, au as useSetShoppingListItemQuantity, av as useShoppingLists, aw as useSiteContext, ax as useSites, ay as useSubcategories, az as useUnassignContact, aA as useUpdateCompany, aB as useUpdateContactAssignment, aC as useUpdateCustomer, aD as useUpdateLocation, aE as useUpdateSalesOrder, aF as useValidateCoupon, aG as useVariantChildren } from './use-returns-96kuAgjF.js';
2
2
  import { UseQueryResult, UseMutationResult } from '@tanstack/react-query';
3
3
  import { ApprovalPatch, Approval, ApprovalList, ApprovalCreated, ApprovalInput } from '@viu/emporix-sdk';
4
4
  import './provider-CLNEKOuu.js';
package/dist/hooks.js CHANGED
@@ -1,4 +1,4 @@
1
- export { useActiveCart, useAddToShoppingList, useAddressMutations, useApproval, useApprovals, useAssignContact, useAvailabilities, useAvailability, useCancelOrder, useCart, useCartMutations, useCategories, useCategoriesInfinite, useCategory, useCategoryTree, useChangePassword, useCheckout, useCompany, useCompanyContacts, useCompanyGroups, useCompanyLocations, useCompanySwitcher, useCreateApproval, useCreateCart, useCreateCompany, useCreateLocation, useCreateReturn, useCreateShoppingList, useCustomerAddresses, useCustomerSession, useDefaultSite, useDeleteCompany, useDeleteLocation, useDeleteShoppingList, useMatchPrices, useMatchPricesChunked, useMyCompanies, useMyOrders, useMyOrdersInfinite, useMyReturns, useMyRewardPoints, useMyRewardPointsSummary, useMySegmentCategories, useMySegmentCategoriesInfinite, useMySegmentCategoryTree, useMySegmentItems, useMySegmentProducts, useMySegmentProductsInfinite, useMySegments, useOrder, useOrderTransition, usePasswordReset, usePaymentModes, useProduct, useProductByCode, useProductMedia, useProductSearch, useProducts, useProductsByCodes, useProductsInCategory, useProductsInCategoryInfinite, useProductsInfinite, useRedeemCoupon, useRedeemOptions, useRedeemRewardPoints, useRemoveFromShoppingList, useReorder, useReturn, useSalesOrder, useSetShoppingListItemQuantity, useShoppingLists, useSiteContext, useSites, useUnassignContact, useUpdateApproval, useUpdateCompany, useUpdateContactAssignment, useUpdateCustomer, useUpdateLocation, useUpdateSalesOrder, useValidateCoupon, useVariantChildren } from './chunk-RCI7242Y.js';
1
+ export { useActiveCart, useAddToShoppingList, useAddressMutations, useApproval, useApprovals, useAssignContact, useAvailabilities, useAvailability, useCancelOrder, useCart, useCartMutations, useCategories, useCategoriesInfinite, useCategory, useCategoryTree, useChangePassword, useCheckout, useCompany, useCompanyContacts, useCompanyGroups, useCompanyLocations, useCompanySwitcher, useCreateApproval, useCreateCart, useCreateCompany, useCreateLocation, useCreateReturn, useCreateShoppingList, useCustomerAddresses, useCustomerSession, useDefaultSite, useDeleteCompany, useDeleteLocation, useDeleteShoppingList, useMatchPrices, useMatchPricesChunked, useMyCompanies, useMyOrders, useMyOrdersInfinite, useMyReturns, useMyRewardPoints, useMyRewardPointsSummary, useMySegmentCategories, useMySegmentCategoriesInfinite, useMySegmentCategoryTree, useMySegmentItems, useMySegmentProducts, useMySegmentProductsInfinite, useMySegments, useOrder, useOrderTransition, usePasswordReset, usePaymentModes, useProduct, useProductByCode, useProductMedia, useProductSearch, useProducts, useProductsByCodes, useProductsInCategory, useProductsInCategoryInfinite, useProductsInfinite, useRedeemCoupon, useRedeemOptions, useRedeemRewardPoints, useRemoveFromShoppingList, useReorder, useReturn, useSalesOrder, useSetShoppingListItemQuantity, useShoppingLists, useSiteContext, useSites, useSubcategories, useUnassignContact, useUpdateApproval, useUpdateCompany, useUpdateContactAssignment, useUpdateCustomer, useUpdateLocation, useUpdateSalesOrder, useValidateCoupon, useVariantChildren } from './chunk-GRGWUXNB.js';
2
2
  import './chunk-SDRV73LG.js';
3
3
  import './chunk-FBQY2N7S.js';
4
4
  //# sourceMappingURL=hooks.js.map
package/dist/index.cjs CHANGED
@@ -674,6 +674,36 @@ async function bootstrapCart(opts) {
674
674
  });
675
675
  }
676
676
 
677
+ // src/hooks/internal/customer-session-store.ts
678
+ var stores = /* @__PURE__ */ new WeakMap();
679
+ function getCustomerSessionStore(storage) {
680
+ const existing = stores.get(storage);
681
+ if (existing) return existing;
682
+ let state = {
683
+ token: storage.getCustomerToken(),
684
+ refreshToken: null,
685
+ saasToken: null
686
+ };
687
+ const listeners = /* @__PURE__ */ new Set();
688
+ const store = {
689
+ getSnapshot: () => state,
690
+ setState: (next) => {
691
+ const resolved = typeof next === "function" ? next(state) : next;
692
+ if (resolved === state) return;
693
+ state = resolved;
694
+ for (const listener of listeners) listener();
695
+ },
696
+ subscribe: (listener) => {
697
+ listeners.add(listener);
698
+ return () => {
699
+ listeners.delete(listener);
700
+ };
701
+ }
702
+ };
703
+ stores.set(storage, store);
704
+ return store;
705
+ }
706
+
677
707
  // src/hooks/use-customer-session.ts
678
708
  var EMPTY_SESSION = {
679
709
  token: null,
@@ -684,14 +714,12 @@ function useCustomerSession() {
684
714
  const { client, storage } = useEmporix();
685
715
  const qc = reactQuery.useQueryClient();
686
716
  const siteCtx = react.useContext(EmporixSiteContext);
687
- const [session, setSession] = react.useState(() => ({
688
- token: storage.getCustomerToken(),
689
- refreshToken: null,
690
- saasToken: null
691
- }));
717
+ const store = react.useMemo(() => getCustomerSessionStore(storage), [storage]);
718
+ const session = react.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
719
+ const setSession = store.setState;
692
720
  react.useEffect(() => {
693
721
  return storage.subscribe?.((t) => setSession((s) => ({ ...s, token: t })));
694
- }, [storage]);
722
+ }, [storage, setSession]);
695
723
  const meQuery = reactQuery.useQuery({
696
724
  queryKey: ["emporix", "customer", "me", { tenant: client.tenant, hasToken: session.token !== null }],
697
725
  enabled: session.token !== null,
@@ -725,7 +753,7 @@ function useCustomerSession() {
725
753
  await qc.invalidateQueries({ queryKey: ["emporix", "customer"], refetchType: "none" });
726
754
  await qc.invalidateQueries({ queryKey: ["emporix", "cart"], refetchType: "none" });
727
755
  },
728
- [client, storage, qc, siteCtx]
756
+ [client, storage, qc, siteCtx, setSession]
729
757
  );
730
758
  const signup = react.useCallback(
731
759
  async (input) => {
@@ -757,7 +785,7 @@ function useCustomerSession() {
757
785
  await qc.invalidateQueries({ queryKey: ["emporix", "customer"], refetchType: "none" });
758
786
  await qc.invalidateQueries({ queryKey: ["emporix", "cart"], refetchType: "none" });
759
787
  },
760
- [client, storage, qc, siteCtx]
788
+ [client, storage, qc, siteCtx, setSession]
761
789
  );
762
790
  const socialLogin = react.useCallback(
763
791
  async (input) => {
@@ -781,10 +809,11 @@ function useCustomerSession() {
781
809
  storage.setCustomerToken(null);
782
810
  storage.setRefreshToken(null);
783
811
  storage.setActiveLegalEntityId(null);
812
+ storage.setCartId(null);
784
813
  setSession(EMPTY_SESSION);
785
814
  qc.removeQueries({ queryKey: ["emporix", "customer"] });
786
815
  qc.removeQueries({ queryKey: ["emporix", "cart"] });
787
- }, [client, session.token, storage, qc]);
816
+ }, [client, session.token, storage, qc, setSession]);
788
817
  const refresh = react.useCallback(async () => {
789
818
  await meQuery.refetch();
790
819
  }, [meQuery]);
@@ -803,10 +832,11 @@ function useCustomerSession() {
803
832
  }));
804
833
  await qc.invalidateQueries({ queryKey: ["emporix", "customer"] });
805
834
  await qc.invalidateQueries({ queryKey: ["emporix", "cart"] });
806
- }, [client, storage, qc, session.refreshToken, session.saasToken]);
835
+ }, [client, storage, qc, session.refreshToken, session.saasToken, setSession]);
807
836
  return {
808
837
  customerToken: session.token,
809
838
  refreshToken: session.refreshToken,
839
+ saasToken: session.saasToken,
810
840
  customer: meQuery.data ?? null,
811
841
  isAuthenticated: session.token !== null,
812
842
  isLoading: meQuery.isLoading && session.token !== null,
@@ -1070,6 +1100,17 @@ function useCategory(categoryId, options = {}) {
1070
1100
  staleTime: CATEGORIES_STALE_TIME
1071
1101
  });
1072
1102
  }
1103
+ function useSubcategories(categoryId, params = {}, options = {}) {
1104
+ const { client } = useEmporix();
1105
+ const { ctx } = useReadAuth(options.auth);
1106
+ const { siteCode } = useReadSite();
1107
+ return reactQuery.useQuery({
1108
+ queryKey: emporixKey("subcategories", [categoryId ?? null, params], { tenant: client.tenant, authKind: ctx.kind, siteCode }),
1109
+ enabled: typeof categoryId === "string" && categoryId !== "",
1110
+ queryFn: () => client.categories.subcategories(categoryId, params, ctx),
1111
+ staleTime: CATEGORIES_STALE_TIME
1112
+ });
1113
+ }
1073
1114
  function useCategories(params = {}, options = {}) {
1074
1115
  const { client } = useEmporix();
1075
1116
  const { ctx } = useReadAuth(options.auth);
@@ -1093,13 +1134,13 @@ function useCategoriesInfinite(params = {}, options = {}) {
1093
1134
  staleTime: CATEGORIES_STALE_TIME
1094
1135
  });
1095
1136
  }
1096
- function useCategoryTree(rootId, options = {}) {
1137
+ function useCategoryTree(options = {}) {
1097
1138
  const { client } = useEmporix();
1098
1139
  const { ctx } = useReadAuth(options.auth);
1099
1140
  const { siteCode } = useReadSite();
1100
1141
  return reactQuery.useQuery({
1101
- queryKey: emporixKey("category-tree", [rootId ?? null], { tenant: client.tenant, authKind: ctx.kind, siteCode }),
1102
- queryFn: () => client.categories.tree(rootId, ctx),
1142
+ queryKey: emporixKey("category-tree", [], { tenant: client.tenant, authKind: ctx.kind, siteCode }),
1143
+ queryFn: () => client.categories.tree(ctx),
1103
1144
  staleTime: CATEGORIES_STALE_TIME
1104
1145
  });
1105
1146
  }
@@ -1180,7 +1221,12 @@ function useCartMutations(cartId) {
1180
1221
  if (c) qc.setQueryData(c.key, c.previous);
1181
1222
  },
1182
1223
  onSuccess: (cart, _v, c) => {
1183
- if (c) qc.setQueryData(c.key, cart);
1224
+ if (!c) return;
1225
+ if (cart && Array.isArray(cart.items)) {
1226
+ qc.setQueryData(c.key, cart);
1227
+ } else {
1228
+ void qc.invalidateQueries({ queryKey: c.key });
1229
+ }
1184
1230
  }
1185
1231
  });
1186
1232
  }
@@ -1199,7 +1245,9 @@ function useCartMutations(cartId) {
1199
1245
  ]
1200
1246
  } : prev
1201
1247
  ),
1202
- updateItem: make((id, v) => client.carts.updateItem(id, v.itemId, v.patch, ctx)),
1248
+ updateItem: make(
1249
+ (id, v) => client.carts.updateItem(id, v.itemId, v.patch, ctx, v.partial ? { partial: true } : {})
1250
+ ),
1203
1251
  removeItem: make(
1204
1252
  (id, v) => client.carts.removeItem(id, v.itemId, ctx),
1205
1253
  (prev, v) => prev ? { ...prev, items: (prev.items ?? []).filter((i) => i.id !== v.itemId) } : prev
@@ -1234,6 +1282,14 @@ function useActiveCart(opts) {
1234
1282
  const { activeCompany } = useActiveCompany();
1235
1283
  const [cartId, setCartId] = react.useState(() => storage.getCartId());
1236
1284
  const effectiveLegalEntityId = opts?.legalEntityId ?? activeCompany?.id;
1285
+ react.useEffect(() => {
1286
+ if (!storage.subscribeAll) return;
1287
+ return storage.subscribeAll((key) => {
1288
+ if (key !== "cartId") return;
1289
+ const next = storage.getCartId();
1290
+ setCartId((prev) => prev === next ? prev : next);
1291
+ });
1292
+ }, [storage]);
1237
1293
  react.useEffect(() => {
1238
1294
  if (cartId !== null) return;
1239
1295
  if (!opts?.create) return;
@@ -2146,6 +2202,7 @@ exports.useSetShoppingListItemQuantity = useSetShoppingListItemQuantity;
2146
2202
  exports.useShoppingLists = useShoppingLists;
2147
2203
  exports.useSiteContext = useSiteContext;
2148
2204
  exports.useSites = useSites;
2205
+ exports.useSubcategories = useSubcategories;
2149
2206
  exports.useUnassignContact = useUnassignContact;
2150
2207
  exports.useUpdateCompany = useUpdateCompany;
2151
2208
  exports.useUpdateContactAssignment = useUpdateContactAssignment;