@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.
package/dist/index.cjs CHANGED
@@ -37,7 +37,8 @@ var AuthContext = react.createContext({
37
37
  customerSession: null,
38
38
  loadingToken: null,
39
39
  loadingUser: null,
40
- token: null
40
+ token: null,
41
+ userDataStoredLocation: null
41
42
  });
42
43
  var AuthProvider = (props) => {
43
44
  const [user, setUser] = react.useState(null);
@@ -47,6 +48,7 @@ var AuthProvider = (props) => {
47
48
  const [loadingToken, setLoadingToken] = react.useState(false);
48
49
  const storage = useStorage();
49
50
  const [token, setToken] = react.useState();
51
+ const [userDataStoredLocation, setUserDataStoredLocation] = react.useState(null);
50
52
  const signIn = (data, rememberMe) => {
51
53
  if (data.is_active) {
52
54
  api.WAApi.defaults.headers.common["x-customer-token"] = `${data.token}`;
@@ -54,9 +56,11 @@ var AuthProvider = (props) => {
54
56
  const type = rememberMe ? "local" : "session";
55
57
  storage.setItem("user", JSON.stringify(data), type);
56
58
  setUser(data);
59
+ setUserDataStoredLocation(type);
57
60
  };
58
61
  const signOut = () => {
59
62
  setUser(null);
63
+ setUserDataStoredLocation(null);
60
64
  storage.clearAll();
61
65
  delete api.WAApi.defaults.headers.common["x-customer-token"];
62
66
  };
@@ -98,10 +102,12 @@ var AuthProvider = (props) => {
98
102
  let customer = JSON.parse(local_user);
99
103
  api.WAApi.defaults.headers.common["x-customer-token"] = customer.token;
100
104
  setUser(customer);
105
+ setUserDataStoredLocation("local");
101
106
  } else if (session_user) {
102
107
  let session_customer = JSON.parse(session_user);
103
108
  api.WAApi.defaults.headers.common["x-customer-token"] = session_customer.token;
104
109
  setUser(session_customer);
110
+ setUserDataStoredLocation("session");
105
111
  }
106
112
  setLoadingUser(false);
107
113
  }, []);
@@ -131,7 +137,8 @@ var AuthProvider = (props) => {
131
137
  customerSession,
132
138
  loadingToken,
133
139
  loadingUser,
134
- token
140
+ token,
141
+ userDataStoredLocation
135
142
  },
136
143
  children: loading ? null : props.children
137
144
  }
@@ -221,11 +228,11 @@ function createNoopToastSupport() {
221
228
  }
222
229
  var ToastSupportContext = react.createContext(createNoopToastSupport());
223
230
  function ToastSupportProvider({ children, value }) {
224
- const api13 = react.useMemo(() => {
231
+ const api12 = react.useMemo(() => {
225
232
  if (!value) return createNoopToastSupport();
226
233
  return { ...createNoopToastSupport(), ...value };
227
234
  }, [value]);
228
- return /* @__PURE__ */ jsxRuntime.jsx(ToastSupportContext.Provider, { value: api13, children });
235
+ return /* @__PURE__ */ jsxRuntime.jsx(ToastSupportContext.Provider, { value: api12, children });
229
236
  }
230
237
  function useToastSupport() {
231
238
  return react.useContext(ToastSupportContext);
@@ -241,7 +248,7 @@ var CartWishlistRefreshProvider = (props) => {
241
248
  var useCartWishlistRefresh = () => react.useContext(CartWishlistRefreshContext);
242
249
  var CartContext = react.createContext({
243
250
  cartItems: [],
244
- addToCart: () => null,
251
+ addToCart: async () => false,
245
252
  addToCartLoading: false,
246
253
  addToCartError: null,
247
254
  clearCart: () => null,
@@ -443,11 +450,12 @@ var CartProvider = (props) => {
443
450
  });
444
451
  toast.info("Offer removed");
445
452
  };
446
- const addToCart = async (sku, quantity) => {
453
+ const addToCart = async (sku, quantity, customData) => {
447
454
  setAddToCartLoading(true);
448
455
  setAddToCartError(null);
449
456
  setOrderFetchLoading(true);
450
- 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);
451
459
  try {
452
460
  if (quantity === 0) {
453
461
  if (isItemInCart) {
@@ -460,7 +468,7 @@ var CartProvider = (props) => {
460
468
  );
461
469
  await fetchOrderDetail();
462
470
  }
463
- return;
471
+ return true;
464
472
  }
465
473
  if (isItemInCart) {
466
474
  await api.api.updateCartItem(isItemInCart.id, {
@@ -474,17 +482,22 @@ var CartProvider = (props) => {
474
482
  qty: quantity,
475
483
  sku
476
484
  };
485
+ if (hasCustomData) {
486
+ body.custom_data = customData;
487
+ }
477
488
  await api.api.addProductToCart(body);
478
489
  console.log("New item added to cart.");
479
490
  toast.success("Item added to cart");
480
491
  await fetchOrderDetail();
481
492
  }
493
+ return true;
482
494
  } catch (error) {
483
495
  setOrderFetchLoading(false);
484
496
  console.log("Error---->", error);
485
497
  const message = error?.response?.message || error?.response?.data?.message || error?.message || "Unable to add to cart. Please try again.";
486
498
  setAddToCartError(message);
487
499
  toast.error(message);
500
+ return false;
488
501
  } finally {
489
502
  setAddToCartLoading(false);
490
503
  }
@@ -1042,82 +1055,111 @@ var CustomPageConfigContext = react.createContext({
1042
1055
  updateConfig: () => null,
1043
1056
  removeConfig: () => null,
1044
1057
  moveConfig: () => null,
1058
+ heroSliderConfigData: [],
1059
+ onUpdateHeroSlider: async () => void 0,
1045
1060
  loading: true
1046
1061
  });
1047
1062
  var CustomPageConfigProvider = (props) => {
1048
1063
  const { token } = useThemeEdit();
1049
1064
  const [selectedConfig, setSelectedConfig] = react.useState([]);
1065
+ const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
1050
1066
  const [loading, setLoading] = react.useState(true);
1051
- const updateRef = react.useRef(false);
1067
+ const selectedConfigRef = react.useRef([]);
1068
+ const heroSlidesRef = react.useRef([]);
1069
+ const saveQueueRef = react.useRef(Promise.resolve());
1052
1070
  const load = react.useCallback(async () => {
1053
1071
  setLoading(true);
1054
1072
  try {
1055
1073
  const row = await api$1.getCustomPageContent(props.pageId, token);
1056
- const data = row?.content;
1057
- 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);
1058
1080
  } catch (e) {
1059
1081
  console.error("Error loading custom page content:", e);
1060
1082
  } finally {
1061
1083
  setLoading(false);
1062
1084
  }
1063
1085
  }, [props.pageId, token]);
1064
- const persist = react.useCallback(
1065
- async (configToSave) => {
1066
- try {
1067
- if (updateRef.current) return;
1068
- updateRef.current = true;
1069
- await api$1.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
- }
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;
1076
1107
  },
1077
- [props.pageId, token, load]
1108
+ [props.pageId, token]
1078
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
+ }, []);
1079
1116
  const addConfig = react.useCallback(
1080
- async (config) => {
1081
- setSelectedConfig((prev) => {
1082
- const next = [...prev, config];
1083
- persist(next);
1084
- return next;
1085
- });
1117
+ (config) => {
1118
+ const next = [...selectedConfigRef.current, config];
1119
+ selectedConfigRef.current = next;
1120
+ setSelectedConfig(next);
1121
+ void persistLatest();
1086
1122
  },
1087
- [persist]
1123
+ [persistLatest]
1088
1124
  );
1089
1125
  const updateConfig = react.useCallback(
1090
- async (config, index) => {
1091
- setSelectedConfig((prev) => {
1092
- const next = [...prev];
1093
- next[index] = config;
1094
- persist(next);
1095
- return next;
1096
- });
1126
+ (config, index) => {
1127
+ const next = [...selectedConfigRef.current];
1128
+ next[index] = config;
1129
+ selectedConfigRef.current = next;
1130
+ setSelectedConfig(next);
1131
+ void persistLatest();
1097
1132
  },
1098
- [persist]
1133
+ [persistLatest]
1099
1134
  );
1100
1135
  const moveConfig = react.useCallback(
1101
1136
  (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
- });
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();
1109
1143
  },
1110
- [persist]
1144
+ [persistLatest]
1111
1145
  );
1112
1146
  const removeConfig = react.useCallback(
1113
- async (index) => {
1114
- setSelectedConfig((prev) => {
1115
- const next = prev.filter((_2, i) => i !== index);
1116
- persist(next);
1117
- return next;
1118
- });
1147
+ (index) => {
1148
+ const next = selectedConfigRef.current.filter((_2, i) => i !== index);
1149
+ selectedConfigRef.current = next;
1150
+ setSelectedConfig(next);
1151
+ void persistLatest();
1119
1152
  },
1120
- [persist]
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);
1161
+ },
1162
+ [persistLatest]
1121
1163
  );
1122
1164
  react.useEffect(() => {
1123
1165
  load();
@@ -1127,11 +1169,13 @@ var CustomPageConfigProvider = (props) => {
1127
1169
  {
1128
1170
  value: {
1129
1171
  selectedConfig,
1130
- setSelectedConfig,
1172
+ setSelectedConfig: replaceSelectedConfig,
1131
1173
  addConfig,
1132
1174
  updateConfig,
1133
1175
  removeConfig,
1134
1176
  moveConfig,
1177
+ heroSliderConfigData,
1178
+ onUpdateHeroSlider,
1135
1179
  loading
1136
1180
  },
1137
1181
  children: props.children
@@ -1139,6 +1183,75 @@ var CustomPageConfigProvider = (props) => {
1139
1183
  );
1140
1184
  };
1141
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
+ };
1142
1255
  var WishlistContext = react.createContext({
1143
1256
  wishlistItems: [],
1144
1257
  addToWishlist: () => null,
@@ -1286,65 +1399,6 @@ var useModal = () => {
1286
1399
  }
1287
1400
  return context;
1288
1401
  };
1289
- var HomeConfigHeroSliderContext = react.createContext({
1290
- loading: true,
1291
- heroSliderConfigData: [],
1292
- onUpdateHeroSlider: () => null
1293
- });
1294
- var HomeConfigHeroSliderProvider = (props) => {
1295
- const [loading, setLoading] = react.useState(true);
1296
- const [heroSliderConfigData, setHeroSliderConfigData] = react.useState([]);
1297
- const { token } = useThemeEdit();
1298
- const themeConfig = react.useContext(BusinessConfigContext);
1299
- const getHeroSliderConfig = async () => {
1300
- setLoading(true);
1301
- try {
1302
- const response = await api$1.retrieveThemeContent(
1303
- themeConfig.theme.id,
1304
- "hero_slider"
1305
- );
1306
- setHeroSliderConfigData(response.data);
1307
- } finally {
1308
- setLoading(false);
1309
- }
1310
- };
1311
- react.useEffect(() => {
1312
- getHeroSliderConfig();
1313
- }, []);
1314
- const onUpdateHeroSlider = async (configToUpdate) => {
1315
- setLoading(true);
1316
- try {
1317
- const body = {
1318
- data: configToUpdate,
1319
- slug: "hero_slider",
1320
- platform: typeof window !== "undefined" ? "website" : "app"
1321
- };
1322
- await api$1.updateThemeContent(
1323
- body,
1324
- themeConfig?.theme?.id,
1325
- "hero_slider",
1326
- token
1327
- );
1328
- const updatedResponse = await api$1.retrieveThemeContent(
1329
- themeConfig.theme.id,
1330
- "hero_slider"
1331
- );
1332
- setHeroSliderConfigData(updatedResponse.data);
1333
- } catch (error) {
1334
- console.error("Error updating theme content:", error);
1335
- } finally {
1336
- setLoading(false);
1337
- }
1338
- };
1339
- return /* @__PURE__ */ jsxRuntime.jsx(
1340
- HomeConfigHeroSliderContext.Provider,
1341
- {
1342
- value: { loading, heroSliderConfigData, onUpdateHeroSlider },
1343
- children: props.children
1344
- }
1345
- );
1346
- };
1347
- var useHomeConfigHeroSlider = () => react.useContext(HomeConfigHeroSliderContext);
1348
1402
  var HeaderFooterContext = react.createContext({
1349
1403
  headerConfig: {},
1350
1404
  footerConfig: {},
@@ -1867,6 +1921,7 @@ exports.CartWishlistRefreshContext = CartWishlistRefreshContext;
1867
1921
  exports.CartWishlistRefreshProvider = CartWishlistRefreshProvider;
1868
1922
  exports.CustomPageConfigContext = CustomPageConfigContext;
1869
1923
  exports.CustomPageConfigProvider = CustomPageConfigProvider;
1924
+ exports.CustomPageHeroSliderProvider = CustomPageHeroSliderProvider;
1870
1925
  exports.CustomerConfigContext = CustomerConfigContext;
1871
1926
  exports.CustomerConfigProvider = CustomerConfigProvider;
1872
1927
  exports.FilterContext = FilterContext;