@growupsell/react-ecommerce-core 2.0.17 → 2.0.18

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.d.cts CHANGED
@@ -95,6 +95,7 @@ declare const FilterContext: React__default.Context<{
95
95
  selectedCategoryId: number[];
96
96
  addCategoryFilterId: (id: number) => void;
97
97
  removeCategoryFilterId: (id: number) => void;
98
+ replaceCategoryFilterIds: (ids: number[]) => void;
98
99
  menuList: any[];
99
100
  productLoading: boolean;
100
101
  currentPage: number;
@@ -136,6 +137,7 @@ declare const useFilter: () => {
136
137
  selectedCategoryId: number[];
137
138
  addCategoryFilterId: (id: number) => void;
138
139
  removeCategoryFilterId: (id: number) => void;
140
+ replaceCategoryFilterIds: (ids: number[]) => void;
139
141
  menuList: any[];
140
142
  productLoading: boolean;
141
143
  currentPage: number;
@@ -278,8 +280,6 @@ declare const CustomPageConfigContext: React__default.Context<{
278
280
  updateConfig: (config: any, index: number) => void;
279
281
  removeConfig: (index: number) => void;
280
282
  moveConfig: (fromIndex: number, toIndex: number) => void;
281
- heroSliderConfigData: any[];
282
- onUpdateHeroSlider: (slides: any[]) => Promise<void>;
283
283
  loading: boolean;
284
284
  }>;
285
285
  declare const CustomPageConfigProvider: (props: {
@@ -293,8 +293,6 @@ declare const useCustomPageConfig: () => {
293
293
  updateConfig: (config: any, index: number) => void;
294
294
  removeConfig: (index: number) => void;
295
295
  moveConfig: (fromIndex: number, toIndex: number) => void;
296
- heroSliderConfigData: any[];
297
- onUpdateHeroSlider: (slides: any[]) => Promise<void>;
298
296
  loading: boolean;
299
297
  };
300
298
 
@@ -397,20 +395,29 @@ declare const ModalProvider: ({ children }: {
397
395
  }) => react_jsx_runtime.JSX.Element;
398
396
  declare const useModal: () => ModalContextType;
399
397
 
400
- declare const HomeConfigHeroSliderContext: React__default.Context<{
398
+ declare const HERO_SECTION_SLUG = "hero_section";
399
+ type HeroSectionState = {
400
+ type: string;
401
+ data: any;
402
+ } | null;
403
+ /** Read a `hero_section` theme row. Empty or missing type means no hero. */
404
+ declare function resolveHeroSection(sectionRow: any): HeroSectionState;
405
+ declare const HomeConfigHeroSectionContext: React__default.Context<{
401
406
  loading: boolean;
402
- heroSliderConfigData: any;
403
- onUpdateHeroSlider: (updatedSlides: any) => void;
407
+ heroSection: HeroSectionState;
408
+ onUpdateHeroSection: (next: HeroSectionState) => Promise<void>;
404
409
  }>;
405
- declare const HomeConfigHeroSliderProvider: (props: {
410
+ declare const HomeConfigHeroSectionProvider: (props: {
406
411
  children: React__default.ReactNode;
407
- /** Server-fetched theme content for SSR / first paint (crawlers). */
408
- initialThemeContent?: any;
412
+ /** `hero_section` theme row from the server. Null when the slug is missing. */
413
+ initialHeroSection?: any;
414
+ /** True after the server asked for `hero_section`, even if it is null. */
415
+ heroContentFetched?: boolean;
409
416
  }) => react_jsx_runtime.JSX.Element;
410
- declare const useHomeConfigHeroSlider: () => {
417
+ declare const useHomeConfigHeroSection: () => {
411
418
  loading: boolean;
412
- heroSliderConfigData: any;
413
- onUpdateHeroSlider: (updatedSlides: any) => void;
419
+ heroSection: HeroSectionState;
420
+ onUpdateHeroSection: (next: HeroSectionState) => Promise<void>;
414
421
  };
415
422
 
416
423
  declare const HeaderFooterContext: React__default.Context<{
@@ -546,4 +553,4 @@ type Props = {
546
553
  declare const LiveSupportWidgetProvider: React__default.FC<Props>;
547
554
  declare const useLiveSupportWidget: () => LiveSupportWidgetContextValue;
548
555
 
549
- export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomerConfigContext, CustomerConfigProvider, FilterContext, FilterProvider, HeaderFooterContext, HeaderFooterProvider, HomeConfigContext, HomeConfigHeroSliderContext, HomeConfigHeroSliderProvider, HomeConfigProvider, LiveSupportWidgetProvider, MenuCartContext, MenuCartProvider, MenuFilterContext, MenuFilterProvider, ModalProvider, ProductConfigContext, ProductConfigProvider, ProductDetailContext, ProductDetailProvider, ReferralCodeProvider, StorageContext, StorageProvider, ThemeEditContext, ThemeEditProvider, type ToastSupportApi, type ToastSupportOptions, ToastSupportProvider, WishlistContext, WishlistProvider, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSlider, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist };
556
+ export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomerConfigContext, CustomerConfigProvider, FilterContext, FilterProvider, HERO_SECTION_SLUG, HeaderFooterContext, HeaderFooterProvider, type HeroSectionState, HomeConfigContext, HomeConfigHeroSectionContext, HomeConfigHeroSectionProvider, HomeConfigProvider, LiveSupportWidgetProvider, MenuCartContext, MenuCartProvider, MenuFilterContext, MenuFilterProvider, ModalProvider, ProductConfigContext, ProductConfigProvider, ProductDetailContext, ProductDetailProvider, ReferralCodeProvider, StorageContext, StorageProvider, ThemeEditContext, ThemeEditProvider, type ToastSupportApi, type ToastSupportOptions, ToastSupportProvider, WishlistContext, WishlistProvider, resolveHeroSection, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSection, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist };
package/dist/index.d.ts CHANGED
@@ -95,6 +95,7 @@ declare const FilterContext: React__default.Context<{
95
95
  selectedCategoryId: number[];
96
96
  addCategoryFilterId: (id: number) => void;
97
97
  removeCategoryFilterId: (id: number) => void;
98
+ replaceCategoryFilterIds: (ids: number[]) => void;
98
99
  menuList: any[];
99
100
  productLoading: boolean;
100
101
  currentPage: number;
@@ -136,6 +137,7 @@ declare const useFilter: () => {
136
137
  selectedCategoryId: number[];
137
138
  addCategoryFilterId: (id: number) => void;
138
139
  removeCategoryFilterId: (id: number) => void;
140
+ replaceCategoryFilterIds: (ids: number[]) => void;
139
141
  menuList: any[];
140
142
  productLoading: boolean;
141
143
  currentPage: number;
@@ -278,8 +280,6 @@ declare const CustomPageConfigContext: React__default.Context<{
278
280
  updateConfig: (config: any, index: number) => void;
279
281
  removeConfig: (index: number) => void;
280
282
  moveConfig: (fromIndex: number, toIndex: number) => void;
281
- heroSliderConfigData: any[];
282
- onUpdateHeroSlider: (slides: any[]) => Promise<void>;
283
283
  loading: boolean;
284
284
  }>;
285
285
  declare const CustomPageConfigProvider: (props: {
@@ -293,8 +293,6 @@ declare const useCustomPageConfig: () => {
293
293
  updateConfig: (config: any, index: number) => void;
294
294
  removeConfig: (index: number) => void;
295
295
  moveConfig: (fromIndex: number, toIndex: number) => void;
296
- heroSliderConfigData: any[];
297
- onUpdateHeroSlider: (slides: any[]) => Promise<void>;
298
296
  loading: boolean;
299
297
  };
300
298
 
@@ -397,20 +395,29 @@ declare const ModalProvider: ({ children }: {
397
395
  }) => react_jsx_runtime.JSX.Element;
398
396
  declare const useModal: () => ModalContextType;
399
397
 
400
- declare const HomeConfigHeroSliderContext: React__default.Context<{
398
+ declare const HERO_SECTION_SLUG = "hero_section";
399
+ type HeroSectionState = {
400
+ type: string;
401
+ data: any;
402
+ } | null;
403
+ /** Read a `hero_section` theme row. Empty or missing type means no hero. */
404
+ declare function resolveHeroSection(sectionRow: any): HeroSectionState;
405
+ declare const HomeConfigHeroSectionContext: React__default.Context<{
401
406
  loading: boolean;
402
- heroSliderConfigData: any;
403
- onUpdateHeroSlider: (updatedSlides: any) => void;
407
+ heroSection: HeroSectionState;
408
+ onUpdateHeroSection: (next: HeroSectionState) => Promise<void>;
404
409
  }>;
405
- declare const HomeConfigHeroSliderProvider: (props: {
410
+ declare const HomeConfigHeroSectionProvider: (props: {
406
411
  children: React__default.ReactNode;
407
- /** Server-fetched theme content for SSR / first paint (crawlers). */
408
- initialThemeContent?: any;
412
+ /** `hero_section` theme row from the server. Null when the slug is missing. */
413
+ initialHeroSection?: any;
414
+ /** True after the server asked for `hero_section`, even if it is null. */
415
+ heroContentFetched?: boolean;
409
416
  }) => react_jsx_runtime.JSX.Element;
410
- declare const useHomeConfigHeroSlider: () => {
417
+ declare const useHomeConfigHeroSection: () => {
411
418
  loading: boolean;
412
- heroSliderConfigData: any;
413
- onUpdateHeroSlider: (updatedSlides: any) => void;
419
+ heroSection: HeroSectionState;
420
+ onUpdateHeroSection: (next: HeroSectionState) => Promise<void>;
414
421
  };
415
422
 
416
423
  declare const HeaderFooterContext: React__default.Context<{
@@ -546,4 +553,4 @@ type Props = {
546
553
  declare const LiveSupportWidgetProvider: React__default.FC<Props>;
547
554
  declare const useLiveSupportWidget: () => LiveSupportWidgetContextValue;
548
555
 
549
- export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomerConfigContext, CustomerConfigProvider, FilterContext, FilterProvider, HeaderFooterContext, HeaderFooterProvider, HomeConfigContext, HomeConfigHeroSliderContext, HomeConfigHeroSliderProvider, HomeConfigProvider, LiveSupportWidgetProvider, MenuCartContext, MenuCartProvider, MenuFilterContext, MenuFilterProvider, ModalProvider, ProductConfigContext, ProductConfigProvider, ProductDetailContext, ProductDetailProvider, ReferralCodeProvider, StorageContext, StorageProvider, ThemeEditContext, ThemeEditProvider, type ToastSupportApi, type ToastSupportOptions, ToastSupportProvider, WishlistContext, WishlistProvider, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSlider, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist };
556
+ export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomerConfigContext, CustomerConfigProvider, FilterContext, FilterProvider, HERO_SECTION_SLUG, HeaderFooterContext, HeaderFooterProvider, type HeroSectionState, HomeConfigContext, HomeConfigHeroSectionContext, HomeConfigHeroSectionProvider, HomeConfigProvider, LiveSupportWidgetProvider, MenuCartContext, MenuCartProvider, MenuFilterContext, MenuFilterProvider, ModalProvider, ProductConfigContext, ProductConfigProvider, ProductDetailContext, ProductDetailProvider, ReferralCodeProvider, StorageContext, StorageProvider, ThemeEditContext, ThemeEditProvider, type ToastSupportApi, type ToastSupportOptions, ToastSupportProvider, WishlistContext, WishlistProvider, resolveHeroSection, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSection, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomerConfigContext, CustomerConfigProvider, FilterContext, FilterProvider, HeaderFooterContext, HeaderFooterProvider, HomeConfigContext, HomeConfigHeroSliderContext, HomeConfigHeroSliderProvider, HomeConfigProvider, LiveSupportWidgetProvider, MenuCartContext, MenuCartProvider, MenuFilterContext, MenuFilterProvider, ModalProvider, ProductConfigContext, ProductConfigProvider, ProductDetailContext, ProductDetailProvider, ReferralCodeProvider, StorageContext, StorageProvider, ThemeEditContext, ThemeEditProvider, ToastSupportProvider, WishlistContext, WishlistProvider, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSlider, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist } from './chunk-D24PXFD3.js';
1
+ export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomerConfigContext, CustomerConfigProvider, FilterContext, FilterProvider, HERO_SECTION_SLUG, HeaderFooterContext, HeaderFooterProvider, HomeConfigContext, HomeConfigHeroSectionContext, HomeConfigHeroSectionProvider, HomeConfigProvider, LiveSupportWidgetProvider, MenuCartContext, MenuCartProvider, MenuFilterContext, MenuFilterProvider, ModalProvider, ProductConfigContext, ProductConfigProvider, ProductDetailContext, ProductDetailProvider, ReferralCodeProvider, StorageContext, StorageProvider, ThemeEditContext, ThemeEditProvider, ToastSupportProvider, WishlistContext, WishlistProvider, resolveHeroSection, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSection, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist } from './chunk-FOGKAOV4.js';
2
2
  export { BusinessConfigContext } from './chunk-SP77KIKJ.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/dist/provider.cjs CHANGED
@@ -561,10 +561,18 @@ var CartProvider = (props) => {
561
561
  );
562
562
  };
563
563
  var useCart = () => react.useContext(CartContext);
564
+ var getRouteCategoryId = () => {
565
+ if (typeof window === "undefined") return null;
566
+ const match = window.location.pathname.match(/\/products\/[^/]+\/(\d+)\/?$/);
567
+ if (!match) return null;
568
+ const id = Number(match[1]);
569
+ return Number.isFinite(id) ? id : null;
570
+ };
564
571
  var FilterContext = react.createContext({
565
572
  selectedCategoryId: [],
566
573
  addCategoryFilterId: () => null,
567
574
  removeCategoryFilterId: () => null,
575
+ replaceCategoryFilterIds: () => null,
568
576
  menuList: [],
569
577
  productLoading: true,
570
578
  currentPage: 1,
@@ -621,6 +629,7 @@ var FilterProvider = (props) => {
621
629
  const [limit, setLimit] = react.useState(10);
622
630
  const [offset, setOffset] = react.useState(0);
623
631
  const [total, setTotal] = react.useState(0);
632
+ const waitingForRouteCategory = react.useRef(getRouteCategoryId() != null);
624
633
  const fetchBrandList = async () => {
625
634
  setBrandLoading(true);
626
635
  let body = {
@@ -644,6 +653,15 @@ var FilterProvider = (props) => {
644
653
  });
645
654
  setCurrentPage(1);
646
655
  };
656
+ const replaceCategoryFilterIds = (ids) => {
657
+ const unique = Array.from(new Set(ids.filter((id) => Number.isFinite(id))));
658
+ setSelectedCategoryId(unique);
659
+ setCurrentPage(1);
660
+ setOffset(0);
661
+ setMenuList([]);
662
+ setProductLoading(true);
663
+ waitingForRouteCategory.current = false;
664
+ };
647
665
  const categoryFilterKey = selectedCategoryId.length === 1 ? selectedCategoryId[0] : void 0;
648
666
  react.useEffect(() => {
649
667
  let active = true;
@@ -740,9 +758,10 @@ var FilterProvider = (props) => {
740
758
  setVariantLoading(false);
741
759
  };
742
760
  react.useEffect(() => {
743
- if (!filterConfigLoading) {
744
- fetchProductList();
745
- }
761
+ if (filterConfigLoading) return;
762
+ if (waitingForRouteCategory.current && selectedCategoryId.length === 0) return;
763
+ waitingForRouteCategory.current = false;
764
+ fetchProductList();
746
765
  }, [
747
766
  selectedCategoryId,
748
767
  currentPage,
@@ -795,6 +814,7 @@ var FilterProvider = (props) => {
795
814
  setMenuList,
796
815
  addCategoryFilterId,
797
816
  removeCategoryFilterId,
817
+ replaceCategoryFilterIds,
798
818
  menuList,
799
819
  productLoading,
800
820
  currentPage,
@@ -1004,6 +1024,7 @@ var HomeConfigProvider = (props) => {
1004
1024
  });
1005
1025
  const { token } = useThemeEdit();
1006
1026
  const themeConfig = react.useContext(BusinessConfigContext);
1027
+ const themeId = themeConfig.theme.id;
1007
1028
  const [themeConfigData, setThemeConfigData] = react.useState(
1008
1029
  props.initialThemeContent ?? {}
1009
1030
  );
@@ -1011,16 +1032,13 @@ var HomeConfigProvider = (props) => {
1011
1032
  const updateRef = react.useRef(false);
1012
1033
  const [loading, setLoading] = react.useState(!hasInitial);
1013
1034
  const getThemeConfig = react.useCallback(async () => {
1014
- if (!hasInitial) {
1015
- setLoading(true);
1016
- } else {
1035
+ if (hasInitial || !themeId) {
1036
+ if (!themeId) setLoading(false);
1017
1037
  return;
1018
1038
  }
1039
+ setLoading(true);
1019
1040
  try {
1020
- const response = await api$1.retrieveThemeContent(
1021
- themeConfig.theme.id,
1022
- props.page
1023
- );
1041
+ const response = await api$1.retrieveThemeContent(themeId, props.page);
1024
1042
  setThemeConfigData(response);
1025
1043
  if (response?.data && Array.isArray(response.data)) {
1026
1044
  setSelectedConfig(
@@ -1035,7 +1053,7 @@ var HomeConfigProvider = (props) => {
1035
1053
  } finally {
1036
1054
  setLoading(false);
1037
1055
  }
1038
- }, [themeConfig.theme.id, hasInitial, props.page]);
1056
+ }, [themeId, hasInitial, props.page]);
1039
1057
  const onUpdateThemeContent = react.useCallback(
1040
1058
  async (configToUpdate = selectedConfig) => {
1041
1059
  try {
@@ -1046,16 +1064,9 @@ var HomeConfigProvider = (props) => {
1046
1064
  };
1047
1065
  if (updateRef.current) return;
1048
1066
  updateRef.current = true;
1049
- await api$1.updateThemeContent(
1050
- body,
1051
- themeConfig?.theme?.id,
1052
- props.page,
1053
- token
1054
- );
1055
- const updatedResponse = await api$1.retrieveThemeContent(
1056
- themeConfig.theme.id,
1057
- props.page
1058
- );
1067
+ if (!themeId) return;
1068
+ await api$1.updateThemeContent(body, themeId, props.page, token);
1069
+ const updatedResponse = await api$1.retrieveThemeContent(themeId, props.page);
1059
1070
  setThemeConfigData(updatedResponse);
1060
1071
  } catch (error) {
1061
1072
  console.error("Error updating theme content:", error);
@@ -1063,7 +1074,7 @@ var HomeConfigProvider = (props) => {
1063
1074
  updateRef.current = false;
1064
1075
  }
1065
1076
  },
1066
- [isInitialized, token, themeConfig?.theme?.id, selectedConfig]
1077
+ [isInitialized, token, themeId, selectedConfig]
1067
1078
  );
1068
1079
  const addConfig = react.useCallback(
1069
1080
  async (config) => {
@@ -1129,73 +1140,76 @@ var HomeConfigProvider = (props) => {
1129
1140
  );
1130
1141
  };
1131
1142
  var useHomeConfig = () => react.useContext(HomeConfigContext);
1132
- var HomeConfigHeroSliderContext = react.createContext({
1143
+ var HERO_SECTION_SLUG = "hero_section";
1144
+ function resolveHeroSection(sectionRow) {
1145
+ if (sectionRow == null) return null;
1146
+ const data = sectionRow.data !== void 0 ? sectionRow.data : sectionRow;
1147
+ if (!data || typeof data !== "object" || Array.isArray(data)) return null;
1148
+ if (typeof data.type !== "string" || !data.type) return null;
1149
+ return { type: data.type, data: data.data };
1150
+ }
1151
+ var HomeConfigHeroSectionContext = react.createContext({
1133
1152
  loading: true,
1134
- heroSliderConfigData: [],
1135
- onUpdateHeroSlider: () => null
1153
+ heroSection: null,
1154
+ onUpdateHeroSection: async () => void 0
1136
1155
  });
1137
- var HomeConfigHeroSliderProvider = (props) => {
1138
- const hasInitial = Array.isArray(props.initialThemeContent?.data);
1139
- const [loading, setLoading] = react.useState(!hasInitial);
1140
- const [heroSliderConfigData, setHeroSliderConfigData] = react.useState(
1141
- () => hasInitial ? props.initialThemeContent.data : []
1156
+ var HomeConfigHeroSectionProvider = (props) => {
1157
+ const [heroSection, setHeroSection] = react.useState(
1158
+ () => props.heroContentFetched ? resolveHeroSection(props.initialHeroSection) : null
1142
1159
  );
1160
+ const [loading, setLoading] = react.useState(!props.heroContentFetched);
1143
1161
  const { token } = useThemeEdit();
1144
1162
  const themeConfig = react.useContext(BusinessConfigContext);
1145
- const getHeroSliderConfig = react.useCallback(async () => {
1146
- if (hasInitial) {
1163
+ const themeId = themeConfig.theme.id;
1164
+ const loadHeroSection = react.useCallback(async () => {
1165
+ if (props.heroContentFetched || !themeId) {
1166
+ if (!themeId) setLoading(false);
1147
1167
  return;
1148
1168
  }
1149
1169
  setLoading(true);
1150
1170
  try {
1151
- const response = await api$1.retrieveThemeContent(
1152
- themeConfig.theme.id,
1153
- "hero_slider"
1154
- );
1155
- setHeroSliderConfigData(response.data);
1171
+ let sectionRow = null;
1172
+ try {
1173
+ sectionRow = await api$1.retrieveThemeContent(themeId, HERO_SECTION_SLUG);
1174
+ } catch {
1175
+ sectionRow = null;
1176
+ }
1177
+ setHeroSection(resolveHeroSection(sectionRow));
1156
1178
  } catch (error) {
1157
- console.error("Error fetching hero slider content:", error);
1179
+ console.error("Error fetching hero section:", error);
1158
1180
  } finally {
1159
1181
  setLoading(false);
1160
1182
  }
1161
- }, [themeConfig.theme.id, hasInitial]);
1183
+ }, [props.heroContentFetched, themeId]);
1162
1184
  react.useEffect(() => {
1163
- getHeroSliderConfig();
1164
- }, [getHeroSliderConfig]);
1165
- const onUpdateHeroSlider = async (configToUpdate) => {
1185
+ loadHeroSection();
1186
+ }, [loadHeroSection]);
1187
+ const onUpdateHeroSection = async (next) => {
1166
1188
  setLoading(true);
1167
1189
  try {
1168
1190
  const body = {
1169
- data: configToUpdate,
1170
- slug: "hero_slider",
1191
+ data: next ? { type: next.type, data: next.data } : { type: null, data: null },
1192
+ slug: HERO_SECTION_SLUG,
1171
1193
  platform: typeof window !== "undefined" ? "website" : "app"
1172
1194
  };
1173
- await api$1.updateThemeContent(
1174
- body,
1175
- themeConfig?.theme?.id,
1176
- "hero_slider",
1177
- token
1178
- );
1179
- const updatedResponse = await api$1.retrieveThemeContent(
1180
- themeConfig.theme.id,
1181
- "hero_slider"
1182
- );
1183
- setHeroSliderConfigData(updatedResponse.data);
1195
+ await api$1.updateThemeContent(body, themeId, HERO_SECTION_SLUG, token);
1196
+ setHeroSection(next);
1184
1197
  } catch (error) {
1185
- console.error("Error updating theme content:", error);
1198
+ console.error("Error updating hero section:", error);
1199
+ throw error;
1186
1200
  } finally {
1187
1201
  setLoading(false);
1188
1202
  }
1189
1203
  };
1190
1204
  return /* @__PURE__ */ jsxRuntime.jsx(
1191
- HomeConfigHeroSliderContext.Provider,
1205
+ HomeConfigHeroSectionContext.Provider,
1192
1206
  {
1193
- value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1207
+ value: { loading, heroSection, onUpdateHeroSection },
1194
1208
  children: props.children
1195
1209
  }
1196
1210
  );
1197
1211
  };
1198
- var useHomeConfigHeroSlider = () => react.useContext(HomeConfigHeroSliderContext);
1212
+ var useHomeConfigHeroSection = () => react.useContext(HomeConfigHeroSectionContext);
1199
1213
  var CustomPageConfigContext = react.createContext({
1200
1214
  selectedConfig: [],
1201
1215
  setSelectedConfig: () => null,
@@ -1203,28 +1217,26 @@ var CustomPageConfigContext = react.createContext({
1203
1217
  updateConfig: () => null,
1204
1218
  removeConfig: () => null,
1205
1219
  moveConfig: () => null,
1206
- heroSliderConfigData: [],
1207
- onUpdateHeroSlider: async () => void 0,
1208
1220
  loading: true
1209
1221
  });
1210
1222
  var CustomPageConfigProvider = (props) => {
1211
1223
  const { token } = useThemeEdit();
1212
1224
  const [selectedConfig, setSelectedConfig] = react.useState([]);
1213
- const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
1225
+ const [heroSection, setHeroSection] = react.useState(null);
1214
1226
  const [loading, setLoading] = react.useState(true);
1215
1227
  const selectedConfigRef = react.useRef([]);
1216
- const heroSlidesRef = react.useRef([]);
1228
+ const heroSectionRef = react.useRef(null);
1217
1229
  const saveQueueRef = react.useRef(Promise.resolve());
1218
1230
  const load = react.useCallback(async () => {
1219
1231
  setLoading(true);
1220
1232
  try {
1221
1233
  const row = await api$1.getCustomPageContent(props.pageId, token);
1222
1234
  const fromContent = api$1.splitCustomPageContent(row?.content);
1223
- const slides = Array.isArray(row?.hero_content) ? row.hero_content : fromContent.heroSlides;
1235
+ const hero = row?.hero_content !== void 0 && row?.hero_content !== null ? api$1.readHeroSectionValue(row.hero_content) : fromContent.heroSection;
1224
1236
  selectedConfigRef.current = fromContent.blocks;
1225
- heroSlidesRef.current = slides;
1237
+ heroSectionRef.current = hero;
1226
1238
  setSelectedConfig(fromContent.blocks);
1227
- setHeroSliderConfigData(slides);
1239
+ setHeroSection(hero);
1228
1240
  } catch (e) {
1229
1241
  console.error("Error loading custom page content:", e);
1230
1242
  } finally {
@@ -1232,16 +1244,16 @@ var CustomPageConfigProvider = (props) => {
1232
1244
  }
1233
1245
  }, [props.pageId, token]);
1234
1246
  const persistLatest = react.useCallback(
1235
- (writeHeroField = false) => {
1247
+ () => {
1236
1248
  const run = async () => {
1237
1249
  try {
1238
1250
  const blocks = selectedConfigRef.current;
1239
- const slides = heroSlidesRef.current;
1251
+ const hero = heroSectionRef.current;
1240
1252
  await api$1.updateCustomPageContent(
1241
1253
  props.pageId,
1242
1254
  {
1243
- content: api$1.mergeCustomPageContent(blocks, slides),
1244
- ...writeHeroField ? { hero_content: slides } : {}
1255
+ content: api$1.mergeCustomPageContent(blocks, hero),
1256
+ hero_content: hero ? { type: hero.type, data: hero.data } : { type: null, data: null }
1245
1257
  },
1246
1258
  token
1247
1259
  );
@@ -1300,12 +1312,11 @@ var CustomPageConfigProvider = (props) => {
1300
1312
  },
1301
1313
  [persistLatest]
1302
1314
  );
1303
- const onUpdateHeroSlider = react.useCallback(
1304
- async (slidesToSave) => {
1305
- const slides = Array.isArray(slidesToSave) ? slidesToSave : [];
1306
- heroSlidesRef.current = slides;
1307
- setHeroSliderConfigData(slides);
1308
- await persistLatest(true);
1315
+ const onUpdateHeroSection = react.useCallback(
1316
+ async (next) => {
1317
+ heroSectionRef.current = next;
1318
+ setHeroSection(next);
1319
+ await persistLatest();
1309
1320
  },
1310
1321
  [persistLatest]
1311
1322
  );
@@ -1322,14 +1333,12 @@ var CustomPageConfigProvider = (props) => {
1322
1333
  updateConfig,
1323
1334
  removeConfig,
1324
1335
  moveConfig,
1325
- heroSliderConfigData,
1326
- onUpdateHeroSlider,
1327
1336
  loading
1328
1337
  },
1329
1338
  children: /* @__PURE__ */ jsxRuntime.jsx(
1330
- HomeConfigHeroSliderContext.Provider,
1339
+ HomeConfigHeroSectionContext.Provider,
1331
1340
  {
1332
- value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1341
+ value: { loading, heroSection, onUpdateHeroSection },
1333
1342
  children: props.children
1334
1343
  }
1335
1344
  )
@@ -1505,17 +1514,16 @@ var HeaderFooterProvider = (props) => {
1505
1514
  );
1506
1515
  const { token } = useThemeEdit();
1507
1516
  const themeConfig = useBusiness();
1517
+ const themeId = themeConfig.theme.id;
1508
1518
  const [loading, setLoading] = react.useState(!hasInitial);
1509
1519
  const getThemeConfig = react.useCallback(async () => {
1510
- if (hasInitial) {
1520
+ if (hasInitial || !themeId) {
1521
+ if (!themeId) setLoading(false);
1511
1522
  return;
1512
1523
  }
1513
1524
  setLoading(true);
1514
1525
  try {
1515
- const response = await api.api.retrieveThemeContent(
1516
- themeConfig.theme.id,
1517
- props.page
1518
- );
1526
+ const response = await api.api.retrieveThemeContent(themeId, props.page);
1519
1527
  response.slug === "header" && setHeaderConfig(response.data);
1520
1528
  response.slug === "footer" && setFooterConfig(response.data);
1521
1529
  response.slug === "announcement" && setAnnouncementConfig(response.data);
@@ -1524,7 +1532,7 @@ var HeaderFooterProvider = (props) => {
1524
1532
  } finally {
1525
1533
  setLoading(false);
1526
1534
  }
1527
- }, [themeConfig.theme.id, hasInitial, props.page]);
1535
+ }, [themeId, hasInitial, props.page]);
1528
1536
  const onUpdateThemeContent = react.useCallback(
1529
1537
  async (configToUpdate) => {
1530
1538
  try {
@@ -1533,14 +1541,10 @@ var HeaderFooterProvider = (props) => {
1533
1541
  slug: props.page,
1534
1542
  platform: typeof window !== "undefined" ? "website" : "app"
1535
1543
  };
1536
- await api.api.updateThemeContent(
1537
- body,
1538
- themeConfig.theme.id,
1539
- props.page,
1540
- token
1541
- );
1544
+ if (!themeId) return;
1545
+ await api.api.updateThemeContent(body, themeId, props.page, token);
1542
1546
  const updatedResponse = await api.api.retrieveThemeContent(
1543
- themeConfig.theme.id,
1547
+ themeId,
1544
1548
  props.page
1545
1549
  );
1546
1550
  updatedResponse.slug === "header" && setHeaderConfig(updatedResponse.data);
@@ -1552,7 +1556,7 @@ var HeaderFooterProvider = (props) => {
1552
1556
  setLoading(false);
1553
1557
  }
1554
1558
  },
1555
- [props.page, themeConfig.theme.id, token]
1559
+ [props.page, themeId, token]
1556
1560
  );
1557
1561
  react.useEffect(() => {
1558
1562
  getThemeConfig();
@@ -2027,11 +2031,12 @@ exports.CustomerConfigContext = CustomerConfigContext;
2027
2031
  exports.CustomerConfigProvider = CustomerConfigProvider;
2028
2032
  exports.FilterContext = FilterContext;
2029
2033
  exports.FilterProvider = FilterProvider;
2034
+ exports.HERO_SECTION_SLUG = HERO_SECTION_SLUG;
2030
2035
  exports.HeaderFooterContext = HeaderFooterContext;
2031
2036
  exports.HeaderFooterProvider = HeaderFooterProvider;
2032
2037
  exports.HomeConfigContext = HomeConfigContext;
2033
- exports.HomeConfigHeroSliderContext = HomeConfigHeroSliderContext;
2034
- exports.HomeConfigHeroSliderProvider = HomeConfigHeroSliderProvider;
2038
+ exports.HomeConfigHeroSectionContext = HomeConfigHeroSectionContext;
2039
+ exports.HomeConfigHeroSectionProvider = HomeConfigHeroSectionProvider;
2035
2040
  exports.HomeConfigProvider = HomeConfigProvider;
2036
2041
  exports.LiveSupportWidgetProvider = LiveSupportWidgetProvider;
2037
2042
  exports.MenuCartContext = MenuCartContext;
@@ -2051,6 +2056,7 @@ exports.ThemeEditProvider = ThemeEditProvider;
2051
2056
  exports.ToastSupportProvider = ToastSupportProvider;
2052
2057
  exports.WishlistContext = WishlistContext;
2053
2058
  exports.WishlistProvider = WishlistProvider;
2059
+ exports.resolveHeroSection = resolveHeroSection;
2054
2060
  exports.useAuth = useAuth;
2055
2061
  exports.useBusiness = useBusiness;
2056
2062
  exports.useBusinessContext = useBusinessContext;
@@ -2062,7 +2068,7 @@ exports.useCustomer = useCustomer;
2062
2068
  exports.useFilter = useFilter;
2063
2069
  exports.useHeaderFooter = useHeaderFooter;
2064
2070
  exports.useHomeConfig = useHomeConfig;
2065
- exports.useHomeConfigHeroSlider = useHomeConfigHeroSlider;
2071
+ exports.useHomeConfigHeroSection = useHomeConfigHeroSection;
2066
2072
  exports.useLiveSupportWidget = useLiveSupportWidget;
2067
2073
  exports.useMenuCart = useMenuCart;
2068
2074
  exports.useMenuFilter = useMenuFilter;