@growupsell/react-ecommerce-core 2.0.2 → 2.0.12

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({
@@ -35,7 +35,8 @@ var AuthContext = createContext({
35
35
  customerSession: null,
36
36
  loadingToken: null,
37
37
  loadingUser: null,
38
- token: null
38
+ token: null,
39
+ userDataStoredLocation: null
39
40
  });
40
41
  var AuthProvider = (props) => {
41
42
  const [user, setUser] = useState(null);
@@ -45,6 +46,7 @@ var AuthProvider = (props) => {
45
46
  const [loadingToken, setLoadingToken] = useState(false);
46
47
  const storage = useStorage();
47
48
  const [token, setToken] = useState();
49
+ const [userDataStoredLocation, setUserDataStoredLocation] = useState(null);
48
50
  const signIn = (data, rememberMe) => {
49
51
  if (data.is_active) {
50
52
  WAApi.defaults.headers.common["x-customer-token"] = `${data.token}`;
@@ -52,9 +54,11 @@ var AuthProvider = (props) => {
52
54
  const type = rememberMe ? "local" : "session";
53
55
  storage.setItem("user", JSON.stringify(data), type);
54
56
  setUser(data);
57
+ setUserDataStoredLocation(type);
55
58
  };
56
59
  const signOut = () => {
57
60
  setUser(null);
61
+ setUserDataStoredLocation(null);
58
62
  storage.clearAll();
59
63
  delete WAApi.defaults.headers.common["x-customer-token"];
60
64
  };
@@ -96,10 +100,12 @@ var AuthProvider = (props) => {
96
100
  let customer = JSON.parse(local_user);
97
101
  WAApi.defaults.headers.common["x-customer-token"] = customer.token;
98
102
  setUser(customer);
103
+ setUserDataStoredLocation("local");
99
104
  } else if (session_user) {
100
105
  let session_customer = JSON.parse(session_user);
101
106
  WAApi.defaults.headers.common["x-customer-token"] = session_customer.token;
102
107
  setUser(session_customer);
108
+ setUserDataStoredLocation("session");
103
109
  }
104
110
  setLoadingUser(false);
105
111
  }, []);
@@ -129,7 +135,8 @@ var AuthProvider = (props) => {
129
135
  customerSession,
130
136
  loadingToken,
131
137
  loadingUser,
132
- token
138
+ token,
139
+ userDataStoredLocation
133
140
  },
134
141
  children: loading ? null : props.children
135
142
  }
@@ -214,11 +221,11 @@ function createNoopToastSupport() {
214
221
  }
215
222
  var ToastSupportContext = createContext(createNoopToastSupport());
216
223
  function ToastSupportProvider({ children, value }) {
217
- const api13 = useMemo(() => {
224
+ const api12 = useMemo(() => {
218
225
  if (!value) return createNoopToastSupport();
219
226
  return { ...createNoopToastSupport(), ...value };
220
227
  }, [value]);
221
- return /* @__PURE__ */ jsx(ToastSupportContext.Provider, { value: api13, children });
228
+ return /* @__PURE__ */ jsx(ToastSupportContext.Provider, { value: api12, children });
222
229
  }
223
230
  function useToastSupport() {
224
231
  return useContext(ToastSupportContext);
@@ -234,7 +241,7 @@ var CartWishlistRefreshProvider = (props) => {
234
241
  var useCartWishlistRefresh = () => useContext(CartWishlistRefreshContext);
235
242
  var CartContext = createContext({
236
243
  cartItems: [],
237
- addToCart: () => null,
244
+ addToCart: async () => false,
238
245
  addToCartLoading: false,
239
246
  addToCartError: null,
240
247
  clearCart: () => null,
@@ -436,11 +443,12 @@ var CartProvider = (props) => {
436
443
  });
437
444
  toast.info("Offer removed");
438
445
  };
439
- const addToCart = async (sku, quantity) => {
446
+ const addToCart = async (sku, quantity, customData) => {
440
447
  setAddToCartLoading(true);
441
448
  setAddToCartError(null);
442
449
  setOrderFetchLoading(true);
443
- 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);
444
452
  try {
445
453
  if (quantity === 0) {
446
454
  if (isItemInCart) {
@@ -453,7 +461,7 @@ var CartProvider = (props) => {
453
461
  );
454
462
  await fetchOrderDetail();
455
463
  }
456
- return;
464
+ return true;
457
465
  }
458
466
  if (isItemInCart) {
459
467
  await api.updateCartItem(isItemInCart.id, {
@@ -467,17 +475,22 @@ var CartProvider = (props) => {
467
475
  qty: quantity,
468
476
  sku
469
477
  };
478
+ if (hasCustomData) {
479
+ body.custom_data = customData;
480
+ }
470
481
  await api.addProductToCart(body);
471
482
  console.log("New item added to cart.");
472
483
  toast.success("Item added to cart");
473
484
  await fetchOrderDetail();
474
485
  }
486
+ return true;
475
487
  } catch (error) {
476
488
  setOrderFetchLoading(false);
477
489
  console.log("Error---->", error);
478
490
  const message = error?.response?.message || error?.response?.data?.message || error?.message || "Unable to add to cart. Please try again.";
479
491
  setAddToCartError(message);
480
492
  toast.error(message);
493
+ return false;
481
494
  } finally {
482
495
  setAddToCartLoading(false);
483
496
  }
@@ -1035,82 +1048,111 @@ var CustomPageConfigContext = createContext({
1035
1048
  updateConfig: () => null,
1036
1049
  removeConfig: () => null,
1037
1050
  moveConfig: () => null,
1051
+ heroSliderConfigData: [],
1052
+ onUpdateHeroSlider: async () => void 0,
1038
1053
  loading: true
1039
1054
  });
1040
1055
  var CustomPageConfigProvider = (props) => {
1041
1056
  const { token } = useThemeEdit();
1042
1057
  const [selectedConfig, setSelectedConfig] = useState([]);
1058
+ const [heroSliderConfigData, setHeroSliderConfigData] = useState([]);
1043
1059
  const [loading, setLoading] = useState(true);
1044
- const updateRef = useRef(false);
1060
+ const selectedConfigRef = useRef([]);
1061
+ const heroSlidesRef = useRef([]);
1062
+ const saveQueueRef = useRef(Promise.resolve());
1045
1063
  const load = useCallback(async () => {
1046
1064
  setLoading(true);
1047
1065
  try {
1048
1066
  const row = await getCustomPageContent(props.pageId, token);
1049
- const data = row?.content;
1050
- 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);
1051
1073
  } catch (e) {
1052
1074
  console.error("Error loading custom page content:", e);
1053
1075
  } finally {
1054
1076
  setLoading(false);
1055
1077
  }
1056
1078
  }, [props.pageId, token]);
1057
- const persist = useCallback(
1058
- async (configToSave) => {
1059
- try {
1060
- if (updateRef.current) return;
1061
- updateRef.current = true;
1062
- await updateCustomPageContent(props.pageId, configToSave, token);
1063
- await load();
1064
- } catch (e) {
1065
- console.error("Error saving custom page content:", e);
1066
- } finally {
1067
- updateRef.current = false;
1068
- }
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;
1069
1100
  },
1070
- [props.pageId, token, load]
1101
+ [props.pageId, token]
1071
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
+ }, []);
1072
1109
  const addConfig = useCallback(
1073
- async (config) => {
1074
- setSelectedConfig((prev) => {
1075
- const next = [...prev, config];
1076
- persist(next);
1077
- return next;
1078
- });
1110
+ (config) => {
1111
+ const next = [...selectedConfigRef.current, config];
1112
+ selectedConfigRef.current = next;
1113
+ setSelectedConfig(next);
1114
+ void persistLatest();
1079
1115
  },
1080
- [persist]
1116
+ [persistLatest]
1081
1117
  );
1082
1118
  const updateConfig = useCallback(
1083
- async (config, index) => {
1084
- setSelectedConfig((prev) => {
1085
- const next = [...prev];
1086
- next[index] = config;
1087
- persist(next);
1088
- return next;
1089
- });
1119
+ (config, index) => {
1120
+ const next = [...selectedConfigRef.current];
1121
+ next[index] = config;
1122
+ selectedConfigRef.current = next;
1123
+ setSelectedConfig(next);
1124
+ void persistLatest();
1090
1125
  },
1091
- [persist]
1126
+ [persistLatest]
1092
1127
  );
1093
1128
  const moveConfig = useCallback(
1094
1129
  (fromIndex, toIndex) => {
1095
- setSelectedConfig((prev) => {
1096
- const next = [...prev];
1097
- const [moved] = next.splice(fromIndex, 1);
1098
- next.splice(toIndex, 0, moved);
1099
- persist(next);
1100
- return next;
1101
- });
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();
1102
1136
  },
1103
- [persist]
1137
+ [persistLatest]
1104
1138
  );
1105
1139
  const removeConfig = useCallback(
1106
- async (index) => {
1107
- setSelectedConfig((prev) => {
1108
- const next = prev.filter((_2, i) => i !== index);
1109
- persist(next);
1110
- return next;
1111
- });
1140
+ (index) => {
1141
+ const next = selectedConfigRef.current.filter((_2, i) => i !== index);
1142
+ selectedConfigRef.current = next;
1143
+ setSelectedConfig(next);
1144
+ void persistLatest();
1112
1145
  },
1113
- [persist]
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);
1154
+ },
1155
+ [persistLatest]
1114
1156
  );
1115
1157
  useEffect(() => {
1116
1158
  load();
@@ -1120,11 +1162,13 @@ var CustomPageConfigProvider = (props) => {
1120
1162
  {
1121
1163
  value: {
1122
1164
  selectedConfig,
1123
- setSelectedConfig,
1165
+ setSelectedConfig: replaceSelectedConfig,
1124
1166
  addConfig,
1125
1167
  updateConfig,
1126
1168
  removeConfig,
1127
1169
  moveConfig,
1170
+ heroSliderConfigData,
1171
+ onUpdateHeroSlider,
1128
1172
  loading
1129
1173
  },
1130
1174
  children: props.children
@@ -1132,6 +1176,75 @@ var CustomPageConfigProvider = (props) => {
1132
1176
  );
1133
1177
  };
1134
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
+ };
1135
1248
  var WishlistContext = createContext({
1136
1249
  wishlistItems: [],
1137
1250
  addToWishlist: () => null,
@@ -1264,65 +1377,6 @@ var useModal = () => {
1264
1377
  }
1265
1378
  return context;
1266
1379
  };
1267
- var HomeConfigHeroSliderContext = createContext({
1268
- loading: true,
1269
- heroSliderConfigData: [],
1270
- onUpdateHeroSlider: () => null
1271
- });
1272
- var HomeConfigHeroSliderProvider = (props) => {
1273
- const [loading, setLoading] = useState(true);
1274
- const [heroSliderConfigData, setHeroSliderConfigData] = useState([]);
1275
- const { token } = useThemeEdit();
1276
- const themeConfig = useContext(BusinessConfigContext);
1277
- const getHeroSliderConfig = async () => {
1278
- setLoading(true);
1279
- try {
1280
- const response = await retrieveThemeContent(
1281
- themeConfig.theme.id,
1282
- "hero_slider"
1283
- );
1284
- setHeroSliderConfigData(response.data);
1285
- } finally {
1286
- setLoading(false);
1287
- }
1288
- };
1289
- useEffect(() => {
1290
- getHeroSliderConfig();
1291
- }, []);
1292
- const onUpdateHeroSlider = async (configToUpdate) => {
1293
- setLoading(true);
1294
- try {
1295
- const body = {
1296
- data: configToUpdate,
1297
- slug: "hero_slider",
1298
- platform: typeof window !== "undefined" ? "website" : "app"
1299
- };
1300
- await updateThemeContent(
1301
- body,
1302
- themeConfig?.theme?.id,
1303
- "hero_slider",
1304
- token
1305
- );
1306
- const updatedResponse = await retrieveThemeContent(
1307
- themeConfig.theme.id,
1308
- "hero_slider"
1309
- );
1310
- setHeroSliderConfigData(updatedResponse.data);
1311
- } catch (error) {
1312
- console.error("Error updating theme content:", error);
1313
- } finally {
1314
- setLoading(false);
1315
- }
1316
- };
1317
- return /* @__PURE__ */ jsx(
1318
- HomeConfigHeroSliderContext.Provider,
1319
- {
1320
- value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1321
- children: props.children
1322
- }
1323
- );
1324
- };
1325
- var useHomeConfigHeroSlider = () => useContext(HomeConfigHeroSliderContext);
1326
1380
  var HeaderFooterContext = createContext({
1327
1381
  headerConfig: {},
1328
1382
  footerConfig: {},
@@ -1847,6 +1901,6 @@ var BaseProvider = ({
1847
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 }) }) }) }) }) }) }) }) }) }) }) }) });
1848
1902
  };
1849
1903
 
1850
- 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 };
1851
- //# sourceMappingURL=chunk-XL2AT5BD.js.map
1852
- //# sourceMappingURL=chunk-XL2AT5BD.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