@growupsell/react-ecommerce-core 2.0.10 → 2.0.13

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.
@@ -2,7 +2,7 @@ import { BusinessConfigContext } from './chunk-SP77KIKJ.js';
2
2
  import { createContext, useState, useContext, useEffect, useMemo, useRef, useCallback } from 'react';
3
3
  import { jsx, Fragment } from 'react/jsx-runtime';
4
4
  import { WAApi, api } from '@growupsell/api';
5
- import { retrieveThemeContent, updateThemeContent, getCustomPageContent, updateCustomPageContent, createCustomerSession, getBusinessSetting, getRewardPointBusinessConfig, getOrderBusinessConfig } from '@growupsell/api/api';
5
+ import { retrieveThemeContent, updateThemeContent, getCustomPageContent, splitCustomPageContent, createCustomerSession, getBusinessSetting, getRewardPointBusinessConfig, getOrderBusinessConfig, updateCustomPageContent, mergeCustomPageContent } from '@growupsell/api/api';
6
6
  import 'lodash';
7
7
 
8
8
  var StorageContext = createContext({
@@ -241,7 +241,7 @@ var CartWishlistRefreshProvider = (props) => {
241
241
  var useCartWishlistRefresh = () => useContext(CartWishlistRefreshContext);
242
242
  var CartContext = createContext({
243
243
  cartItems: [],
244
- addToCart: () => null,
244
+ addToCart: async () => false,
245
245
  addToCartLoading: false,
246
246
  addToCartError: null,
247
247
  clearCart: () => null,
@@ -443,11 +443,12 @@ var CartProvider = (props) => {
443
443
  });
444
444
  toast.info("Offer removed");
445
445
  };
446
- const addToCart = async (sku, quantity) => {
446
+ const addToCart = async (sku, quantity, customData) => {
447
447
  setAddToCartLoading(true);
448
448
  setAddToCartError(null);
449
449
  setOrderFetchLoading(true);
450
- let isItemInCart = cartItems?.find((item) => item.sku.id == sku);
450
+ const hasCustomData = customData != null && Object.keys(customData).length > 0;
451
+ let isItemInCart = hasCustomData ? null : cartItems?.find((item) => item.sku.id == sku);
451
452
  try {
452
453
  if (quantity === 0) {
453
454
  if (isItemInCart) {
@@ -460,7 +461,7 @@ var CartProvider = (props) => {
460
461
  );
461
462
  await fetchOrderDetail();
462
463
  }
463
- return;
464
+ return true;
464
465
  }
465
466
  if (isItemInCart) {
466
467
  await api.updateCartItem(isItemInCart.id, {
@@ -474,17 +475,22 @@ var CartProvider = (props) => {
474
475
  qty: quantity,
475
476
  sku
476
477
  };
478
+ if (hasCustomData) {
479
+ body.custom_data = customData;
480
+ }
477
481
  await api.addProductToCart(body);
478
482
  console.log("New item added to cart.");
479
483
  toast.success("Item added to cart");
480
484
  await fetchOrderDetail();
481
485
  }
486
+ return true;
482
487
  } catch (error) {
483
488
  setOrderFetchLoading(false);
484
489
  console.log("Error---->", error);
485
490
  const message = error?.response?.message || error?.response?.data?.message || error?.message || "Unable to add to cart. Please try again.";
486
491
  setAddToCartError(message);
487
492
  toast.error(message);
493
+ return false;
488
494
  } finally {
489
495
  setAddToCartLoading(false);
490
496
  }
@@ -1042,82 +1048,111 @@ var CustomPageConfigContext = createContext({
1042
1048
  updateConfig: () => null,
1043
1049
  removeConfig: () => null,
1044
1050
  moveConfig: () => null,
1051
+ heroSliderConfigData: [],
1052
+ onUpdateHeroSlider: async () => void 0,
1045
1053
  loading: true
1046
1054
  });
1047
1055
  var CustomPageConfigProvider = (props) => {
1048
1056
  const { token } = useThemeEdit();
1049
1057
  const [selectedConfig, setSelectedConfig] = useState([]);
1058
+ const [heroSliderConfigData, setHeroSliderConfigData] = useState([]);
1050
1059
  const [loading, setLoading] = useState(true);
1051
- const updateRef = useRef(false);
1060
+ const selectedConfigRef = useRef([]);
1061
+ const heroSlidesRef = useRef([]);
1062
+ const saveQueueRef = useRef(Promise.resolve());
1052
1063
  const load = useCallback(async () => {
1053
1064
  setLoading(true);
1054
1065
  try {
1055
1066
  const row = await getCustomPageContent(props.pageId, token);
1056
- const data = row?.content;
1057
- setSelectedConfig(Array.isArray(data) ? data.filter((x) => x != null) : []);
1067
+ const fromContent = splitCustomPageContent(row?.content);
1068
+ const slides = Array.isArray(row?.hero_content) ? row.hero_content : fromContent.heroSlides;
1069
+ selectedConfigRef.current = fromContent.blocks;
1070
+ heroSlidesRef.current = slides;
1071
+ setSelectedConfig(fromContent.blocks);
1072
+ setHeroSliderConfigData(slides);
1058
1073
  } catch (e) {
1059
1074
  console.error("Error loading custom page content:", e);
1060
1075
  } finally {
1061
1076
  setLoading(false);
1062
1077
  }
1063
1078
  }, [props.pageId, token]);
1064
- const persist = useCallback(
1065
- async (configToSave) => {
1066
- try {
1067
- if (updateRef.current) return;
1068
- updateRef.current = true;
1069
- await updateCustomPageContent(props.pageId, configToSave, token);
1070
- await load();
1071
- } catch (e) {
1072
- console.error("Error saving custom page content:", e);
1073
- } finally {
1074
- updateRef.current = false;
1075
- }
1079
+ const persistLatest = useCallback(
1080
+ (writeHeroField = false) => {
1081
+ const run = async () => {
1082
+ try {
1083
+ const blocks = selectedConfigRef.current;
1084
+ const slides = heroSlidesRef.current;
1085
+ await updateCustomPageContent(
1086
+ props.pageId,
1087
+ {
1088
+ content: mergeCustomPageContent(blocks, slides),
1089
+ ...writeHeroField ? { hero_content: slides } : {}
1090
+ },
1091
+ token
1092
+ );
1093
+ } catch (e) {
1094
+ console.error("Error saving custom page content:", e);
1095
+ }
1096
+ };
1097
+ const queued = saveQueueRef.current.then(run, run);
1098
+ saveQueueRef.current = queued;
1099
+ return queued;
1076
1100
  },
1077
- [props.pageId, token, load]
1101
+ [props.pageId, token]
1078
1102
  );
1103
+ const replaceSelectedConfig = useCallback((value) => {
1104
+ const next = typeof value === "function" ? value(selectedConfigRef.current) : value;
1105
+ const normalized = Array.isArray(next) ? next : [];
1106
+ selectedConfigRef.current = normalized;
1107
+ setSelectedConfig(normalized);
1108
+ }, []);
1079
1109
  const addConfig = useCallback(
1080
- async (config) => {
1081
- setSelectedConfig((prev) => {
1082
- const next = [...prev, config];
1083
- persist(next);
1084
- return next;
1085
- });
1110
+ (config) => {
1111
+ const next = [...selectedConfigRef.current, config];
1112
+ selectedConfigRef.current = next;
1113
+ setSelectedConfig(next);
1114
+ void persistLatest();
1086
1115
  },
1087
- [persist]
1116
+ [persistLatest]
1088
1117
  );
1089
1118
  const updateConfig = useCallback(
1090
- async (config, index) => {
1091
- setSelectedConfig((prev) => {
1092
- const next = [...prev];
1093
- next[index] = config;
1094
- persist(next);
1095
- return next;
1096
- });
1119
+ (config, index) => {
1120
+ const next = [...selectedConfigRef.current];
1121
+ next[index] = config;
1122
+ selectedConfigRef.current = next;
1123
+ setSelectedConfig(next);
1124
+ void persistLatest();
1097
1125
  },
1098
- [persist]
1126
+ [persistLatest]
1099
1127
  );
1100
1128
  const moveConfig = useCallback(
1101
1129
  (fromIndex, toIndex) => {
1102
- setSelectedConfig((prev) => {
1103
- const next = [...prev];
1104
- const [moved] = next.splice(fromIndex, 1);
1105
- next.splice(toIndex, 0, moved);
1106
- persist(next);
1107
- return next;
1108
- });
1130
+ const next = [...selectedConfigRef.current];
1131
+ const [moved] = next.splice(fromIndex, 1);
1132
+ next.splice(toIndex, 0, moved);
1133
+ selectedConfigRef.current = next;
1134
+ setSelectedConfig(next);
1135
+ void persistLatest();
1109
1136
  },
1110
- [persist]
1137
+ [persistLatest]
1111
1138
  );
1112
1139
  const removeConfig = useCallback(
1113
- async (index) => {
1114
- setSelectedConfig((prev) => {
1115
- const next = prev.filter((_2, i) => i !== index);
1116
- persist(next);
1117
- return next;
1118
- });
1140
+ (index) => {
1141
+ const next = selectedConfigRef.current.filter((_2, i) => i !== index);
1142
+ selectedConfigRef.current = next;
1143
+ setSelectedConfig(next);
1144
+ void persistLatest();
1145
+ },
1146
+ [persistLatest]
1147
+ );
1148
+ const onUpdateHeroSlider = useCallback(
1149
+ async (slidesToSave) => {
1150
+ const slides = Array.isArray(slidesToSave) ? slidesToSave : [];
1151
+ heroSlidesRef.current = slides;
1152
+ setHeroSliderConfigData(slides);
1153
+ await persistLatest(true);
1119
1154
  },
1120
- [persist]
1155
+ [persistLatest]
1121
1156
  );
1122
1157
  useEffect(() => {
1123
1158
  load();
@@ -1127,11 +1162,13 @@ var CustomPageConfigProvider = (props) => {
1127
1162
  {
1128
1163
  value: {
1129
1164
  selectedConfig,
1130
- setSelectedConfig,
1165
+ setSelectedConfig: replaceSelectedConfig,
1131
1166
  addConfig,
1132
1167
  updateConfig,
1133
1168
  removeConfig,
1134
1169
  moveConfig,
1170
+ heroSliderConfigData,
1171
+ onUpdateHeroSlider,
1135
1172
  loading
1136
1173
  },
1137
1174
  children: props.children
@@ -1139,6 +1176,75 @@ var CustomPageConfigProvider = (props) => {
1139
1176
  );
1140
1177
  };
1141
1178
  var useCustomPageConfig = () => useContext(CustomPageConfigContext);
1179
+ var HomeConfigHeroSliderContext = createContext({
1180
+ loading: true,
1181
+ heroSliderConfigData: [],
1182
+ onUpdateHeroSlider: () => null
1183
+ });
1184
+ var HomeConfigHeroSliderProvider = (props) => {
1185
+ const [loading, setLoading] = useState(true);
1186
+ const [heroSliderConfigData, setHeroSliderConfigData] = useState([]);
1187
+ const { token } = useThemeEdit();
1188
+ const themeConfig = useContext(BusinessConfigContext);
1189
+ const getHeroSliderConfig = async () => {
1190
+ setLoading(true);
1191
+ try {
1192
+ const response = await retrieveThemeContent(
1193
+ themeConfig.theme.id,
1194
+ "hero_slider"
1195
+ );
1196
+ setHeroSliderConfigData(response.data);
1197
+ } finally {
1198
+ setLoading(false);
1199
+ }
1200
+ };
1201
+ useEffect(() => {
1202
+ getHeroSliderConfig();
1203
+ }, []);
1204
+ const onUpdateHeroSlider = async (configToUpdate) => {
1205
+ setLoading(true);
1206
+ try {
1207
+ const body = {
1208
+ data: configToUpdate,
1209
+ slug: "hero_slider",
1210
+ platform: typeof window !== "undefined" ? "website" : "app"
1211
+ };
1212
+ await updateThemeContent(
1213
+ body,
1214
+ themeConfig?.theme?.id,
1215
+ "hero_slider",
1216
+ token
1217
+ );
1218
+ const updatedResponse = await retrieveThemeContent(
1219
+ themeConfig.theme.id,
1220
+ "hero_slider"
1221
+ );
1222
+ setHeroSliderConfigData(updatedResponse.data);
1223
+ } catch (error) {
1224
+ console.error("Error updating theme content:", error);
1225
+ } finally {
1226
+ setLoading(false);
1227
+ }
1228
+ };
1229
+ return /* @__PURE__ */ jsx(
1230
+ HomeConfigHeroSliderContext.Provider,
1231
+ {
1232
+ value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1233
+ children: props.children
1234
+ }
1235
+ );
1236
+ };
1237
+ var useHomeConfigHeroSlider = () => useContext(HomeConfigHeroSliderContext);
1238
+ var CustomPageHeroSliderProvider = (props) => {
1239
+ const { loading, heroSliderConfigData, onUpdateHeroSlider } = useCustomPageConfig();
1240
+ return /* @__PURE__ */ jsx(
1241
+ HomeConfigHeroSliderContext.Provider,
1242
+ {
1243
+ value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1244
+ children: props.children
1245
+ }
1246
+ );
1247
+ };
1142
1248
  var WishlistContext = createContext({
1143
1249
  wishlistItems: [],
1144
1250
  addToWishlist: () => null,
@@ -1271,65 +1377,6 @@ var useModal = () => {
1271
1377
  }
1272
1378
  return context;
1273
1379
  };
1274
- var HomeConfigHeroSliderContext = createContext({
1275
- loading: true,
1276
- heroSliderConfigData: [],
1277
- onUpdateHeroSlider: () => null
1278
- });
1279
- var HomeConfigHeroSliderProvider = (props) => {
1280
- const [loading, setLoading] = useState(true);
1281
- const [heroSliderConfigData, setHeroSliderConfigData] = useState([]);
1282
- const { token } = useThemeEdit();
1283
- const themeConfig = useContext(BusinessConfigContext);
1284
- const getHeroSliderConfig = async () => {
1285
- setLoading(true);
1286
- try {
1287
- const response = await retrieveThemeContent(
1288
- themeConfig.theme.id,
1289
- "hero_slider"
1290
- );
1291
- setHeroSliderConfigData(response.data);
1292
- } finally {
1293
- setLoading(false);
1294
- }
1295
- };
1296
- useEffect(() => {
1297
- getHeroSliderConfig();
1298
- }, []);
1299
- const onUpdateHeroSlider = async (configToUpdate) => {
1300
- setLoading(true);
1301
- try {
1302
- const body = {
1303
- data: configToUpdate,
1304
- slug: "hero_slider",
1305
- platform: typeof window !== "undefined" ? "website" : "app"
1306
- };
1307
- await updateThemeContent(
1308
- body,
1309
- themeConfig?.theme?.id,
1310
- "hero_slider",
1311
- token
1312
- );
1313
- const updatedResponse = await retrieveThemeContent(
1314
- themeConfig.theme.id,
1315
- "hero_slider"
1316
- );
1317
- setHeroSliderConfigData(updatedResponse.data);
1318
- } catch (error) {
1319
- console.error("Error updating theme content:", error);
1320
- } finally {
1321
- setLoading(false);
1322
- }
1323
- };
1324
- return /* @__PURE__ */ jsx(
1325
- HomeConfigHeroSliderContext.Provider,
1326
- {
1327
- value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1328
- children: props.children
1329
- }
1330
- );
1331
- };
1332
- var useHomeConfigHeroSlider = () => useContext(HomeConfigHeroSliderContext);
1333
1380
  var HeaderFooterContext = createContext({
1334
1381
  headerConfig: {},
1335
1382
  footerConfig: {},
@@ -1854,6 +1901,6 @@ var BaseProvider = ({
1854
1901
  return /* @__PURE__ */ jsx(StorageProvider, { storage, children: /* @__PURE__ */ jsx(ToastSupportProvider, { value: toast, children: /* @__PURE__ */ jsx(BusinessConfigProvider, { data: businessConfig, baseURL, children: /* @__PURE__ */ jsx(ReferralCodeProvider, { referralCodeFromUrl, children: /* @__PURE__ */ jsx(ThemeEditProvider, { isThemeEdit: isEdit, token, isHeader, isFooter, isAnnouncementBar, children: /* @__PURE__ */ jsx(BusinessMediaProvider, { children: /* @__PURE__ */ jsx(CustomerConfigProvider, { children: /* @__PURE__ */ jsx(AuthProvider, { children: /* @__PURE__ */ jsx(ModalProvider, { children: /* @__PURE__ */ jsx(LiveSupportWidgetProvider, { children: businessConfig.category.type == "retail" ? /* @__PURE__ */ jsx(ProductConfigProvider, { children: /* @__PURE__ */ jsx(CartWishlistRefreshProvider, { children: /* @__PURE__ */ jsx(CartProvider, { children: /* @__PURE__ */ jsx(WishlistProvider, { children: /* @__PURE__ */ jsx(FilterProvider, { children: /* @__PURE__ */ jsx(Fragment, { children }) }) }) }) }) }) : /* @__PURE__ */ jsx(MenuCartProvider, { children: /* @__PURE__ */ jsx(MenuFilterProvider, { children: /* @__PURE__ */ jsx(Fragment, { children }) }) }) }) }) }) }) }) }) }) }) }) });
1855
1902
  };
1856
1903
 
1857
- 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 };
1858
- //# sourceMappingURL=chunk-OJFAUMZC.js.map
1859
- //# sourceMappingURL=chunk-OJFAUMZC.js.map
1904
+ export { AuthContext, AuthProvider, BaseProvider, BusinessConfigProvider, BusinessMediaContext, BusinessMediaProvider, CartContext, CartProvider, CartWishlistRefreshContext, CartWishlistRefreshProvider, CustomPageConfigContext, CustomPageConfigProvider, CustomPageHeroSliderProvider, 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 };
1905
+ //# sourceMappingURL=chunk-VK7BF3ES.js.map
1906
+ //# sourceMappingURL=chunk-VK7BF3ES.js.map