@growupsell/react-ecommerce-core 2.0.14 → 2.0.17

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
@@ -118,6 +118,15 @@ declare const FilterContext: React__default.Context<{
118
118
  selectedVariants: any[];
119
119
  updateSelectedVariants: (x: any) => void;
120
120
  variantLoading: boolean;
121
+ selectedSpecifications: {
122
+ id: number;
123
+ values: string[];
124
+ }[];
125
+ updateSpecificationOption: (keyId: number, option: string) => void;
126
+ setSelectedSpecifications: (value: {
127
+ id: number;
128
+ values: string[];
129
+ }[]) => void;
121
130
  total: number;
122
131
  limit: number;
123
132
  offset: number;
@@ -150,6 +159,15 @@ declare const useFilter: () => {
150
159
  selectedVariants: any[];
151
160
  updateSelectedVariants: (x: any) => void;
152
161
  variantLoading: boolean;
162
+ selectedSpecifications: {
163
+ id: number;
164
+ values: string[];
165
+ }[];
166
+ updateSpecificationOption: (keyId: number, option: string) => void;
167
+ setSelectedSpecifications: (value: {
168
+ id: number;
169
+ values: string[];
170
+ }[]) => void;
153
171
  total: number;
154
172
  limit: number;
155
173
  offset: number;
@@ -386,6 +404,8 @@ declare const HomeConfigHeroSliderContext: React__default.Context<{
386
404
  }>;
387
405
  declare const HomeConfigHeroSliderProvider: (props: {
388
406
  children: React__default.ReactNode;
407
+ /** Server-fetched theme content for SSR / first paint (crawlers). */
408
+ initialThemeContent?: any;
389
409
  }) => react_jsx_runtime.JSX.Element;
390
410
  declare const useHomeConfigHeroSlider: () => {
391
411
  loading: boolean;
@@ -403,6 +423,8 @@ declare const HeaderFooterContext: React__default.Context<{
403
423
  declare const HeaderFooterProvider: (props: {
404
424
  page: string;
405
425
  children: React__default.ReactNode;
426
+ /** Server-fetched theme content for SSR / first paint (crawlers). */
427
+ initialThemeContent?: any;
406
428
  }) => react_jsx_runtime.JSX.Element;
407
429
  declare const useHeaderFooter: () => {
408
430
  headerConfig: any;
package/dist/index.d.ts CHANGED
@@ -118,6 +118,15 @@ declare const FilterContext: React__default.Context<{
118
118
  selectedVariants: any[];
119
119
  updateSelectedVariants: (x: any) => void;
120
120
  variantLoading: boolean;
121
+ selectedSpecifications: {
122
+ id: number;
123
+ values: string[];
124
+ }[];
125
+ updateSpecificationOption: (keyId: number, option: string) => void;
126
+ setSelectedSpecifications: (value: {
127
+ id: number;
128
+ values: string[];
129
+ }[]) => void;
121
130
  total: number;
122
131
  limit: number;
123
132
  offset: number;
@@ -150,6 +159,15 @@ declare const useFilter: () => {
150
159
  selectedVariants: any[];
151
160
  updateSelectedVariants: (x: any) => void;
152
161
  variantLoading: boolean;
162
+ selectedSpecifications: {
163
+ id: number;
164
+ values: string[];
165
+ }[];
166
+ updateSpecificationOption: (keyId: number, option: string) => void;
167
+ setSelectedSpecifications: (value: {
168
+ id: number;
169
+ values: string[];
170
+ }[]) => void;
153
171
  total: number;
154
172
  limit: number;
155
173
  offset: number;
@@ -386,6 +404,8 @@ declare const HomeConfigHeroSliderContext: React__default.Context<{
386
404
  }>;
387
405
  declare const HomeConfigHeroSliderProvider: (props: {
388
406
  children: React__default.ReactNode;
407
+ /** Server-fetched theme content for SSR / first paint (crawlers). */
408
+ initialThemeContent?: any;
389
409
  }) => react_jsx_runtime.JSX.Element;
390
410
  declare const useHomeConfigHeroSlider: () => {
391
411
  loading: boolean;
@@ -403,6 +423,8 @@ declare const HeaderFooterContext: React__default.Context<{
403
423
  declare const HeaderFooterProvider: (props: {
404
424
  page: string;
405
425
  children: React__default.ReactNode;
426
+ /** Server-fetched theme content for SSR / first paint (crawlers). */
427
+ initialThemeContent?: any;
406
428
  }) => react_jsx_runtime.JSX.Element;
407
429
  declare const useHeaderFooter: () => {
408
430
  headerConfig: any;
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-E66B7ABK.js';
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';
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
@@ -588,6 +588,9 @@ var FilterContext = react.createContext({
588
588
  selectedVariants: [],
589
589
  updateSelectedVariants: () => null,
590
590
  variantLoading: false,
591
+ selectedSpecifications: [],
592
+ updateSpecificationOption: () => null,
593
+ setSelectedSpecifications: () => null,
591
594
  total: 0,
592
595
  limit: 10,
593
596
  offset: 0
@@ -614,6 +617,7 @@ var FilterProvider = (props) => {
614
617
  const [variantList, setVariantList] = react.useState([]);
615
618
  const [selectedVariants, setSelectedVariants] = react.useState([]);
616
619
  const [variantLoading, setVariantLoading] = react.useState(false);
620
+ const [selectedSpecifications, setSelectedSpecifications] = react.useState([]);
617
621
  const [limit, setLimit] = react.useState(10);
618
622
  const [offset, setOffset] = react.useState(0);
619
623
  const [total, setTotal] = react.useState(0);
@@ -640,15 +644,30 @@ var FilterProvider = (props) => {
640
644
  });
641
645
  setCurrentPage(1);
642
646
  };
643
- const fetchFilterConfig = async () => {
644
- setFilterConfigLoading(true);
645
- const response = await api.api.getProductFilterConfig();
646
- setFilterConfig(response);
647
- setFilterConfigLoading(false);
648
- };
647
+ const categoryFilterKey = selectedCategoryId.length === 1 ? selectedCategoryId[0] : void 0;
649
648
  react.useEffect(() => {
650
- fetchFilterConfig();
651
- }, []);
649
+ let active = true;
650
+ (async () => {
651
+ if (!filterConfig) {
652
+ setFilterConfigLoading(true);
653
+ }
654
+ try {
655
+ const response = await api.api.getProductFilterConfig(categoryFilterKey);
656
+ if (active) {
657
+ setFilterConfig(response);
658
+ }
659
+ } catch (error) {
660
+ console.log(error);
661
+ } finally {
662
+ if (active) {
663
+ setFilterConfigLoading(false);
664
+ }
665
+ }
666
+ })();
667
+ return () => {
668
+ active = false;
669
+ };
670
+ }, [categoryFilterKey]);
652
671
  const removeCategoryFilterId = (id) => {
653
672
  setSelectedCategoryId((x) => {
654
673
  return x.filter((o) => o !== id);
@@ -666,6 +685,7 @@ var FilterProvider = (props) => {
666
685
  max_price: selectedMaxPrice,
667
686
  brand_ids: selectedCategoryId.length > 0 ? selectedBrandId : null,
668
687
  variants: selectedCategoryId.length > 0 ? selectedVariants : null,
688
+ specifications: selectedSpecifications,
669
689
  limit,
670
690
  offset
671
691
  };
@@ -687,6 +707,21 @@ var FilterProvider = (props) => {
687
707
  return [...prevIds, id];
688
708
  });
689
709
  };
710
+ const updateSpecificationOption = (keyId, option) => {
711
+ setSelectedSpecifications((prev) => {
712
+ const current = prev.find((item) => item.id === keyId);
713
+ if (!current) {
714
+ return [...prev, { id: keyId, values: [option] }];
715
+ }
716
+ const values = current.values.includes(option) ? current.values.filter((value) => value !== option) : [...current.values, option];
717
+ if (values.length === 0) {
718
+ return prev.filter((item) => item.id !== keyId);
719
+ }
720
+ return prev.map(
721
+ (item) => item.id === keyId ? { ...item, values } : item
722
+ );
723
+ });
724
+ };
690
725
  const updateSelectedVariants = (label) => {
691
726
  setSelectedVariants((prevVariants) => {
692
727
  if (prevVariants.includes(label)) {
@@ -718,9 +753,31 @@ var FilterProvider = (props) => {
718
753
  selectedMaxPrice,
719
754
  selectedBrandId,
720
755
  selectedVariants,
756
+ selectedSpecifications,
721
757
  limit,
722
758
  offset
723
759
  ]);
760
+ react.useEffect(() => {
761
+ const keys = filterConfig?.specifications ?? [];
762
+ const allowed = new Map(
763
+ keys.map((key) => [
764
+ key.id,
765
+ new Set(key.options ?? [])
766
+ ])
767
+ );
768
+ setSelectedSpecifications((prev) => {
769
+ const next = prev.map((item) => ({
770
+ ...item,
771
+ values: item.values.filter((value) => allowed.get(item.id)?.has(value))
772
+ })).filter((item) => item.values.length > 0 && allowed.has(item.id));
773
+ if (next.length === prev.length && next.every(
774
+ (item, index) => item.id === prev[index].id && item.values.length === prev[index].values.length && item.values.every((value, valueIndex) => value === prev[index].values[valueIndex])
775
+ )) {
776
+ return prev;
777
+ }
778
+ return next;
779
+ });
780
+ }, [filterConfig]);
724
781
  const handlePageChange = (newOffset) => {
725
782
  setOffset(newOffset);
726
783
  };
@@ -760,6 +817,9 @@ var FilterProvider = (props) => {
760
817
  selectedVariants,
761
818
  updateSelectedVariants,
762
819
  variantLoading,
820
+ selectedSpecifications,
821
+ updateSpecificationOption,
822
+ setSelectedSpecifications,
763
823
  total,
764
824
  limit,
765
825
  offset
@@ -953,6 +1013,8 @@ var HomeConfigProvider = (props) => {
953
1013
  const getThemeConfig = react.useCallback(async () => {
954
1014
  if (!hasInitial) {
955
1015
  setLoading(true);
1016
+ } else {
1017
+ return;
956
1018
  }
957
1019
  try {
958
1020
  const response = await api$1.retrieveThemeContent(
@@ -969,7 +1031,7 @@ var HomeConfigProvider = (props) => {
969
1031
  }
970
1032
  setIsInitialized(true);
971
1033
  } catch (error) {
972
- console.error("Error fetching theme content:", error);
1034
+ console.log("Error fetching theme content:", error);
973
1035
  } finally {
974
1036
  setLoading(false);
975
1037
  }
@@ -1073,11 +1135,17 @@ var HomeConfigHeroSliderContext = react.createContext({
1073
1135
  onUpdateHeroSlider: () => null
1074
1136
  });
1075
1137
  var HomeConfigHeroSliderProvider = (props) => {
1076
- const [loading, setLoading] = react.useState(true);
1077
- const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
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 : []
1142
+ );
1078
1143
  const { token } = useThemeEdit();
1079
1144
  const themeConfig = react.useContext(BusinessConfigContext);
1080
- const getHeroSliderConfig = async () => {
1145
+ const getHeroSliderConfig = react.useCallback(async () => {
1146
+ if (hasInitial) {
1147
+ return;
1148
+ }
1081
1149
  setLoading(true);
1082
1150
  try {
1083
1151
  const response = await api$1.retrieveThemeContent(
@@ -1085,13 +1153,15 @@ var HomeConfigHeroSliderProvider = (props) => {
1085
1153
  "hero_slider"
1086
1154
  );
1087
1155
  setHeroSliderConfigData(response.data);
1156
+ } catch (error) {
1157
+ console.error("Error fetching hero slider content:", error);
1088
1158
  } finally {
1089
1159
  setLoading(false);
1090
1160
  }
1091
- };
1161
+ }, [themeConfig.theme.id, hasInitial]);
1092
1162
  react.useEffect(() => {
1093
1163
  getHeroSliderConfig();
1094
- }, []);
1164
+ }, [getHeroSliderConfig]);
1095
1165
  const onUpdateHeroSlider = async (configToUpdate) => {
1096
1166
  setLoading(true);
1097
1167
  try {
@@ -1422,13 +1492,24 @@ var HeaderFooterContext = react.createContext({
1422
1492
  announcementConfig: {}
1423
1493
  });
1424
1494
  var HeaderFooterProvider = (props) => {
1425
- const [headerConfig, setHeaderConfig] = react.useState({});
1426
- const [footerConfig, setFooterConfig] = react.useState({});
1427
- const [announcementConfig, setAnnouncementConfig] = react.useState({});
1495
+ const hasInitial = props.initialThemeContent != null && "data" in props.initialThemeContent;
1496
+ const initialData = hasInitial ? props.initialThemeContent.data ?? {} : {};
1497
+ const [headerConfig, setHeaderConfig] = react.useState(
1498
+ () => props.page === "header" ? initialData : {}
1499
+ );
1500
+ const [footerConfig, setFooterConfig] = react.useState(
1501
+ () => props.page === "footer" ? initialData : {}
1502
+ );
1503
+ const [announcementConfig, setAnnouncementConfig] = react.useState(
1504
+ () => props.page === "announcement" ? initialData : {}
1505
+ );
1428
1506
  const { token } = useThemeEdit();
1429
1507
  const themeConfig = useBusiness();
1430
- const [loading, setLoading] = react.useState(true);
1508
+ const [loading, setLoading] = react.useState(!hasInitial);
1431
1509
  const getThemeConfig = react.useCallback(async () => {
1510
+ if (hasInitial) {
1511
+ return;
1512
+ }
1432
1513
  setLoading(true);
1433
1514
  try {
1434
1515
  const response = await api.api.retrieveThemeContent(
@@ -1443,7 +1524,7 @@ var HeaderFooterProvider = (props) => {
1443
1524
  } finally {
1444
1525
  setLoading(false);
1445
1526
  }
1446
- }, [themeConfig.theme.id]);
1527
+ }, [themeConfig.theme.id, hasInitial, props.page]);
1447
1528
  const onUpdateThemeContent = react.useCallback(
1448
1529
  async (configToUpdate) => {
1449
1530
  try {
@@ -1471,7 +1552,7 @@ var HeaderFooterProvider = (props) => {
1471
1552
  setLoading(false);
1472
1553
  }
1473
1554
  },
1474
- [props.page]
1555
+ [props.page, themeConfig.theme.id, token]
1475
1556
  );
1476
1557
  react.useEffect(() => {
1477
1558
  getThemeConfig();
@@ -1479,7 +1560,13 @@ var HeaderFooterProvider = (props) => {
1479
1560
  return /* @__PURE__ */ jsxRuntime.jsx(
1480
1561
  HeaderFooterContext.Provider,
1481
1562
  {
1482
- value: { headerConfig, footerConfig, onUpdateThemeContent, loading, announcementConfig },
1563
+ value: {
1564
+ headerConfig,
1565
+ footerConfig,
1566
+ onUpdateThemeContent,
1567
+ loading,
1568
+ announcementConfig
1569
+ },
1483
1570
  children: loading ? null : props.children
1484
1571
  }
1485
1572
  );