@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/{chunk-E66B7ABK.js → chunk-D24PXFD3.js} +110 -23
- package/dist/chunk-D24PXFD3.js.map +1 -0
- package/dist/index.cjs +108 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +1 -1
- package/dist/provider.cjs +108 -21
- package/dist/provider.cjs.map +1 -1
- package/dist/provider.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-E66B7ABK.js.map +0 -1
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-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
1077
|
-
const [
|
|
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
|
|
1426
|
-
const
|
|
1427
|
-
const [
|
|
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(
|
|
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: {
|
|
1563
|
+
value: {
|
|
1564
|
+
headerConfig,
|
|
1565
|
+
footerConfig,
|
|
1566
|
+
onUpdateThemeContent,
|
|
1567
|
+
loading,
|
|
1568
|
+
announcementConfig
|
|
1569
|
+
},
|
|
1483
1570
|
children: loading ? null : props.children
|
|
1484
1571
|
}
|
|
1485
1572
|
);
|