@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.
package/dist/index.cjs CHANGED
@@ -248,7 +248,7 @@ var CartWishlistRefreshProvider = (props) => {
248
248
  var useCartWishlistRefresh = () => react.useContext(CartWishlistRefreshContext);
249
249
  var CartContext = react.createContext({
250
250
  cartItems: [],
251
- addToCart: () => null,
251
+ addToCart: async () => false,
252
252
  addToCartLoading: false,
253
253
  addToCartError: null,
254
254
  clearCart: () => null,
@@ -450,11 +450,12 @@ var CartProvider = (props) => {
450
450
  });
451
451
  toast.info("Offer removed");
452
452
  };
453
- const addToCart = async (sku, quantity) => {
453
+ const addToCart = async (sku, quantity, customData) => {
454
454
  setAddToCartLoading(true);
455
455
  setAddToCartError(null);
456
456
  setOrderFetchLoading(true);
457
- let isItemInCart = cartItems?.find((item) => item.sku.id == sku);
457
+ const hasCustomData = customData != null && Object.keys(customData).length > 0;
458
+ let isItemInCart = hasCustomData ? null : cartItems?.find((item) => item.sku.id == sku);
458
459
  try {
459
460
  if (quantity === 0) {
460
461
  if (isItemInCart) {
@@ -467,7 +468,7 @@ var CartProvider = (props) => {
467
468
  );
468
469
  await fetchOrderDetail();
469
470
  }
470
- return;
471
+ return true;
471
472
  }
472
473
  if (isItemInCart) {
473
474
  await api.api.updateCartItem(isItemInCart.id, {
@@ -481,17 +482,22 @@ var CartProvider = (props) => {
481
482
  qty: quantity,
482
483
  sku
483
484
  };
485
+ if (hasCustomData) {
486
+ body.custom_data = customData;
487
+ }
484
488
  await api.api.addProductToCart(body);
485
489
  console.log("New item added to cart.");
486
490
  toast.success("Item added to cart");
487
491
  await fetchOrderDetail();
488
492
  }
493
+ return true;
489
494
  } catch (error) {
490
495
  setOrderFetchLoading(false);
491
496
  console.log("Error---->", error);
492
497
  const message = error?.response?.message || error?.response?.data?.message || error?.message || "Unable to add to cart. Please try again.";
493
498
  setAddToCartError(message);
494
499
  toast.error(message);
500
+ return false;
495
501
  } finally {
496
502
  setAddToCartLoading(false);
497
503
  }
@@ -1049,82 +1055,111 @@ var CustomPageConfigContext = react.createContext({
1049
1055
  updateConfig: () => null,
1050
1056
  removeConfig: () => null,
1051
1057
  moveConfig: () => null,
1058
+ heroSliderConfigData: [],
1059
+ onUpdateHeroSlider: async () => void 0,
1052
1060
  loading: true
1053
1061
  });
1054
1062
  var CustomPageConfigProvider = (props) => {
1055
1063
  const { token } = useThemeEdit();
1056
1064
  const [selectedConfig, setSelectedConfig] = react.useState([]);
1065
+ const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
1057
1066
  const [loading, setLoading] = react.useState(true);
1058
- const updateRef = react.useRef(false);
1067
+ const selectedConfigRef = react.useRef([]);
1068
+ const heroSlidesRef = react.useRef([]);
1069
+ const saveQueueRef = react.useRef(Promise.resolve());
1059
1070
  const load = react.useCallback(async () => {
1060
1071
  setLoading(true);
1061
1072
  try {
1062
1073
  const row = await api$1.getCustomPageContent(props.pageId, token);
1063
- const data = row?.content;
1064
- setSelectedConfig(Array.isArray(data) ? data.filter((x) => x != null) : []);
1074
+ const fromContent = api$1.splitCustomPageContent(row?.content);
1075
+ const slides = Array.isArray(row?.hero_content) ? row.hero_content : fromContent.heroSlides;
1076
+ selectedConfigRef.current = fromContent.blocks;
1077
+ heroSlidesRef.current = slides;
1078
+ setSelectedConfig(fromContent.blocks);
1079
+ setHeroSliderConfigData(slides);
1065
1080
  } catch (e) {
1066
1081
  console.error("Error loading custom page content:", e);
1067
1082
  } finally {
1068
1083
  setLoading(false);
1069
1084
  }
1070
1085
  }, [props.pageId, token]);
1071
- const persist = react.useCallback(
1072
- async (configToSave) => {
1073
- try {
1074
- if (updateRef.current) return;
1075
- updateRef.current = true;
1076
- await api$1.updateCustomPageContent(props.pageId, configToSave, token);
1077
- await load();
1078
- } catch (e) {
1079
- console.error("Error saving custom page content:", e);
1080
- } finally {
1081
- updateRef.current = false;
1082
- }
1086
+ const persistLatest = react.useCallback(
1087
+ (writeHeroField = false) => {
1088
+ const run = async () => {
1089
+ try {
1090
+ const blocks = selectedConfigRef.current;
1091
+ const slides = heroSlidesRef.current;
1092
+ await api$1.updateCustomPageContent(
1093
+ props.pageId,
1094
+ {
1095
+ content: api$1.mergeCustomPageContent(blocks, slides),
1096
+ ...writeHeroField ? { hero_content: slides } : {}
1097
+ },
1098
+ token
1099
+ );
1100
+ } catch (e) {
1101
+ console.error("Error saving custom page content:", e);
1102
+ }
1103
+ };
1104
+ const queued = saveQueueRef.current.then(run, run);
1105
+ saveQueueRef.current = queued;
1106
+ return queued;
1083
1107
  },
1084
- [props.pageId, token, load]
1108
+ [props.pageId, token]
1085
1109
  );
1110
+ const replaceSelectedConfig = react.useCallback((value) => {
1111
+ const next = typeof value === "function" ? value(selectedConfigRef.current) : value;
1112
+ const normalized = Array.isArray(next) ? next : [];
1113
+ selectedConfigRef.current = normalized;
1114
+ setSelectedConfig(normalized);
1115
+ }, []);
1086
1116
  const addConfig = react.useCallback(
1087
- async (config) => {
1088
- setSelectedConfig((prev) => {
1089
- const next = [...prev, config];
1090
- persist(next);
1091
- return next;
1092
- });
1117
+ (config) => {
1118
+ const next = [...selectedConfigRef.current, config];
1119
+ selectedConfigRef.current = next;
1120
+ setSelectedConfig(next);
1121
+ void persistLatest();
1093
1122
  },
1094
- [persist]
1123
+ [persistLatest]
1095
1124
  );
1096
1125
  const updateConfig = react.useCallback(
1097
- async (config, index) => {
1098
- setSelectedConfig((prev) => {
1099
- const next = [...prev];
1100
- next[index] = config;
1101
- persist(next);
1102
- return next;
1103
- });
1126
+ (config, index) => {
1127
+ const next = [...selectedConfigRef.current];
1128
+ next[index] = config;
1129
+ selectedConfigRef.current = next;
1130
+ setSelectedConfig(next);
1131
+ void persistLatest();
1104
1132
  },
1105
- [persist]
1133
+ [persistLatest]
1106
1134
  );
1107
1135
  const moveConfig = react.useCallback(
1108
1136
  (fromIndex, toIndex) => {
1109
- setSelectedConfig((prev) => {
1110
- const next = [...prev];
1111
- const [moved] = next.splice(fromIndex, 1);
1112
- next.splice(toIndex, 0, moved);
1113
- persist(next);
1114
- return next;
1115
- });
1137
+ const next = [...selectedConfigRef.current];
1138
+ const [moved] = next.splice(fromIndex, 1);
1139
+ next.splice(toIndex, 0, moved);
1140
+ selectedConfigRef.current = next;
1141
+ setSelectedConfig(next);
1142
+ void persistLatest();
1116
1143
  },
1117
- [persist]
1144
+ [persistLatest]
1118
1145
  );
1119
1146
  const removeConfig = react.useCallback(
1120
- async (index) => {
1121
- setSelectedConfig((prev) => {
1122
- const next = prev.filter((_2, i) => i !== index);
1123
- persist(next);
1124
- return next;
1125
- });
1147
+ (index) => {
1148
+ const next = selectedConfigRef.current.filter((_2, i) => i !== index);
1149
+ selectedConfigRef.current = next;
1150
+ setSelectedConfig(next);
1151
+ void persistLatest();
1152
+ },
1153
+ [persistLatest]
1154
+ );
1155
+ const onUpdateHeroSlider = react.useCallback(
1156
+ async (slidesToSave) => {
1157
+ const slides = Array.isArray(slidesToSave) ? slidesToSave : [];
1158
+ heroSlidesRef.current = slides;
1159
+ setHeroSliderConfigData(slides);
1160
+ await persistLatest(true);
1126
1161
  },
1127
- [persist]
1162
+ [persistLatest]
1128
1163
  );
1129
1164
  react.useEffect(() => {
1130
1165
  load();
@@ -1134,11 +1169,13 @@ var CustomPageConfigProvider = (props) => {
1134
1169
  {
1135
1170
  value: {
1136
1171
  selectedConfig,
1137
- setSelectedConfig,
1172
+ setSelectedConfig: replaceSelectedConfig,
1138
1173
  addConfig,
1139
1174
  updateConfig,
1140
1175
  removeConfig,
1141
1176
  moveConfig,
1177
+ heroSliderConfigData,
1178
+ onUpdateHeroSlider,
1142
1179
  loading
1143
1180
  },
1144
1181
  children: props.children
@@ -1146,6 +1183,75 @@ var CustomPageConfigProvider = (props) => {
1146
1183
  );
1147
1184
  };
1148
1185
  var useCustomPageConfig = () => react.useContext(CustomPageConfigContext);
1186
+ var HomeConfigHeroSliderContext = react.createContext({
1187
+ loading: true,
1188
+ heroSliderConfigData: [],
1189
+ onUpdateHeroSlider: () => null
1190
+ });
1191
+ var HomeConfigHeroSliderProvider = (props) => {
1192
+ const [loading, setLoading] = react.useState(true);
1193
+ const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
1194
+ const { token } = useThemeEdit();
1195
+ const themeConfig = react.useContext(BusinessConfigContext);
1196
+ const getHeroSliderConfig = async () => {
1197
+ setLoading(true);
1198
+ try {
1199
+ const response = await api$1.retrieveThemeContent(
1200
+ themeConfig.theme.id,
1201
+ "hero_slider"
1202
+ );
1203
+ setHeroSliderConfigData(response.data);
1204
+ } finally {
1205
+ setLoading(false);
1206
+ }
1207
+ };
1208
+ react.useEffect(() => {
1209
+ getHeroSliderConfig();
1210
+ }, []);
1211
+ const onUpdateHeroSlider = async (configToUpdate) => {
1212
+ setLoading(true);
1213
+ try {
1214
+ const body = {
1215
+ data: configToUpdate,
1216
+ slug: "hero_slider",
1217
+ platform: typeof window !== "undefined" ? "website" : "app"
1218
+ };
1219
+ await api$1.updateThemeContent(
1220
+ body,
1221
+ themeConfig?.theme?.id,
1222
+ "hero_slider",
1223
+ token
1224
+ );
1225
+ const updatedResponse = await api$1.retrieveThemeContent(
1226
+ themeConfig.theme.id,
1227
+ "hero_slider"
1228
+ );
1229
+ setHeroSliderConfigData(updatedResponse.data);
1230
+ } catch (error) {
1231
+ console.error("Error updating theme content:", error);
1232
+ } finally {
1233
+ setLoading(false);
1234
+ }
1235
+ };
1236
+ return /* @__PURE__ */ jsxRuntime.jsx(
1237
+ HomeConfigHeroSliderContext.Provider,
1238
+ {
1239
+ value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1240
+ children: props.children
1241
+ }
1242
+ );
1243
+ };
1244
+ var useHomeConfigHeroSlider = () => react.useContext(HomeConfigHeroSliderContext);
1245
+ var CustomPageHeroSliderProvider = (props) => {
1246
+ const { loading, heroSliderConfigData, onUpdateHeroSlider } = useCustomPageConfig();
1247
+ return /* @__PURE__ */ jsxRuntime.jsx(
1248
+ HomeConfigHeroSliderContext.Provider,
1249
+ {
1250
+ value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1251
+ children: props.children
1252
+ }
1253
+ );
1254
+ };
1149
1255
  var WishlistContext = react.createContext({
1150
1256
  wishlistItems: [],
1151
1257
  addToWishlist: () => null,
@@ -1293,65 +1399,6 @@ var useModal = () => {
1293
1399
  }
1294
1400
  return context;
1295
1401
  };
1296
- var HomeConfigHeroSliderContext = react.createContext({
1297
- loading: true,
1298
- heroSliderConfigData: [],
1299
- onUpdateHeroSlider: () => null
1300
- });
1301
- var HomeConfigHeroSliderProvider = (props) => {
1302
- const [loading, setLoading] = react.useState(true);
1303
- const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
1304
- const { token } = useThemeEdit();
1305
- const themeConfig = react.useContext(BusinessConfigContext);
1306
- const getHeroSliderConfig = async () => {
1307
- setLoading(true);
1308
- try {
1309
- const response = await api$1.retrieveThemeContent(
1310
- themeConfig.theme.id,
1311
- "hero_slider"
1312
- );
1313
- setHeroSliderConfigData(response.data);
1314
- } finally {
1315
- setLoading(false);
1316
- }
1317
- };
1318
- react.useEffect(() => {
1319
- getHeroSliderConfig();
1320
- }, []);
1321
- const onUpdateHeroSlider = async (configToUpdate) => {
1322
- setLoading(true);
1323
- try {
1324
- const body = {
1325
- data: configToUpdate,
1326
- slug: "hero_slider",
1327
- platform: typeof window !== "undefined" ? "website" : "app"
1328
- };
1329
- await api$1.updateThemeContent(
1330
- body,
1331
- themeConfig?.theme?.id,
1332
- "hero_slider",
1333
- token
1334
- );
1335
- const updatedResponse = await api$1.retrieveThemeContent(
1336
- themeConfig.theme.id,
1337
- "hero_slider"
1338
- );
1339
- setHeroSliderConfigData(updatedResponse.data);
1340
- } catch (error) {
1341
- console.error("Error updating theme content:", error);
1342
- } finally {
1343
- setLoading(false);
1344
- }
1345
- };
1346
- return /* @__PURE__ */ jsxRuntime.jsx(
1347
- HomeConfigHeroSliderContext.Provider,
1348
- {
1349
- value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1350
- children: props.children
1351
- }
1352
- );
1353
- };
1354
- var useHomeConfigHeroSlider = () => react.useContext(HomeConfigHeroSliderContext);
1355
1402
  var HeaderFooterContext = react.createContext({
1356
1403
  headerConfig: {},
1357
1404
  footerConfig: {},
@@ -1874,6 +1921,7 @@ exports.CartWishlistRefreshContext = CartWishlistRefreshContext;
1874
1921
  exports.CartWishlistRefreshProvider = CartWishlistRefreshProvider;
1875
1922
  exports.CustomPageConfigContext = CustomPageConfigContext;
1876
1923
  exports.CustomPageConfigProvider = CustomPageConfigProvider;
1924
+ exports.CustomPageHeroSliderProvider = CustomPageHeroSliderProvider;
1877
1925
  exports.CustomerConfigContext = CustomerConfigContext;
1878
1926
  exports.CustomerConfigProvider = CustomerConfigProvider;
1879
1927
  exports.FilterContext = FilterContext;