@growupsell/react-ecommerce-core 0.0.2
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-D52TP6ZA.js +1967 -0
- package/dist/chunk-D52TP6ZA.js.map +1 -0
- package/dist/index.cjs +2035 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.cjs +2034 -0
- package/dist/provider.cjs.map +1 -0
- package/dist/provider.d.cts +504 -0
- package/dist/provider.d.ts +504 -0
- package/dist/provider.js +3 -0
- package/dist/provider.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,1967 @@
|
|
|
1
|
+
import { createContext, useState, useContext, useEffect, useMemo, useRef, useCallback } from 'react';
|
|
2
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { WAApi, api } from '@growupsell/api';
|
|
4
|
+
import { retrieveThemeContent, updateThemeContent, getCustomPageContent, updateCustomPageContent, createCustomerSession, getBusinessSetting, getRewardPointBusinessConfig, getOrderBusinessConfig } from '@growupsell/api/api';
|
|
5
|
+
import { ToastContainer, toast as toast$1 } from 'react-toastify';
|
|
6
|
+
import 'lodash';
|
|
7
|
+
import { FaWhatsapp } from 'react-icons/fa';
|
|
8
|
+
|
|
9
|
+
// src/provider/StorageProvider.tsx
|
|
10
|
+
var StorageContext = createContext({
|
|
11
|
+
setItem: (key, data, type) => null,
|
|
12
|
+
getItem: (key) => null,
|
|
13
|
+
clearAll: () => null,
|
|
14
|
+
removeItem: (key) => null
|
|
15
|
+
});
|
|
16
|
+
var StorageProvider = (props) => {
|
|
17
|
+
const [loading, setLoading] = useState(false);
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
StorageContext.Provider,
|
|
20
|
+
{
|
|
21
|
+
value: {
|
|
22
|
+
setItem: props.storage.setItem,
|
|
23
|
+
getItem: props.storage.getItem,
|
|
24
|
+
clearAll: props.storage.clearAll,
|
|
25
|
+
removeItem: props.storage.removeItem
|
|
26
|
+
},
|
|
27
|
+
children: loading ? null : props.children
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
var useStorage = () => useContext(StorageContext);
|
|
32
|
+
var AuthContext = createContext({
|
|
33
|
+
signIn: () => null,
|
|
34
|
+
signOut: () => null,
|
|
35
|
+
user: null,
|
|
36
|
+
setUser: (o) => null,
|
|
37
|
+
customerSession: null,
|
|
38
|
+
loadingToken: null,
|
|
39
|
+
loadingUser: null,
|
|
40
|
+
token: null
|
|
41
|
+
});
|
|
42
|
+
var AuthProvider = (props) => {
|
|
43
|
+
const [user, setUser] = useState(null);
|
|
44
|
+
const [loading, setLoading] = useState(true);
|
|
45
|
+
const [customerSession, setCustomerSession] = useState();
|
|
46
|
+
const [loadingUser, setLoadingUser] = useState(true);
|
|
47
|
+
const [loadingToken, setLoadingToken] = useState(false);
|
|
48
|
+
const storage = useStorage();
|
|
49
|
+
const [token, setToken] = useState();
|
|
50
|
+
const signIn = (data, rememberMe) => {
|
|
51
|
+
if (data.is_active) {
|
|
52
|
+
WAApi.defaults.headers.common["x-customer-token"] = `${data.token}`;
|
|
53
|
+
}
|
|
54
|
+
const type = rememberMe ? "local" : "session";
|
|
55
|
+
storage.setItem("user", JSON.stringify(data), type);
|
|
56
|
+
setUser(data);
|
|
57
|
+
};
|
|
58
|
+
const signOut = () => {
|
|
59
|
+
setUser(null);
|
|
60
|
+
storage.clearAll();
|
|
61
|
+
delete WAApi.defaults.headers.common["x-customer-token"];
|
|
62
|
+
};
|
|
63
|
+
let sessionCreationInProgress = false;
|
|
64
|
+
const initializedCustomerSession = async () => {
|
|
65
|
+
setLoading(true);
|
|
66
|
+
if (sessionCreationInProgress) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
sessionCreationInProgress = true;
|
|
70
|
+
let savedSession = storage.getItem("session", "session") ? JSON.parse(storage.getItem("session", "session")) : null;
|
|
71
|
+
if (savedSession) {
|
|
72
|
+
setCustomerSession(savedSession);
|
|
73
|
+
WAApi.defaults.headers.common["x-session-token"] = savedSession?.session_token;
|
|
74
|
+
} else {
|
|
75
|
+
try {
|
|
76
|
+
let body = {
|
|
77
|
+
customer: user?.id
|
|
78
|
+
};
|
|
79
|
+
const response = await createCustomerSession(body);
|
|
80
|
+
setCustomerSession(response);
|
|
81
|
+
WAApi.defaults.headers.common["x-session-token"] = response?.session_token;
|
|
82
|
+
storage.setItem("session", JSON.stringify(response), "session");
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.log("Error--->", error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
setLoading(false);
|
|
88
|
+
sessionCreationInProgress = false;
|
|
89
|
+
};
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
!loadingUser && initializedCustomerSession();
|
|
92
|
+
}, [loadingUser]);
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
setLoadingUser(true);
|
|
95
|
+
let local_user = storage.getItem("user", "local");
|
|
96
|
+
let session_user = storage.getItem("user", "session");
|
|
97
|
+
if (local_user) {
|
|
98
|
+
let customer = JSON.parse(local_user);
|
|
99
|
+
WAApi.defaults.headers.common["x-customer-token"] = customer.token;
|
|
100
|
+
setUser(customer);
|
|
101
|
+
} else if (session_user) {
|
|
102
|
+
let session_customer = JSON.parse(session_user);
|
|
103
|
+
WAApi.defaults.headers.common["x-customer-token"] = session_customer.token;
|
|
104
|
+
setUser(session_customer);
|
|
105
|
+
}
|
|
106
|
+
setLoadingUser(false);
|
|
107
|
+
}, []);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (user) {
|
|
110
|
+
setLoadingToken(true);
|
|
111
|
+
try {
|
|
112
|
+
if (user?.token) {
|
|
113
|
+
WAApi.defaults.headers.common["x-customer-token"] = user.token;
|
|
114
|
+
setToken(user.token);
|
|
115
|
+
}
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.log("User not available");
|
|
118
|
+
} finally {
|
|
119
|
+
setLoadingToken(false);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}, [user]);
|
|
123
|
+
return /* @__PURE__ */ jsx(
|
|
124
|
+
AuthContext.Provider,
|
|
125
|
+
{
|
|
126
|
+
value: {
|
|
127
|
+
signIn,
|
|
128
|
+
signOut,
|
|
129
|
+
user,
|
|
130
|
+
setUser,
|
|
131
|
+
customerSession,
|
|
132
|
+
loadingToken,
|
|
133
|
+
loadingUser,
|
|
134
|
+
token
|
|
135
|
+
},
|
|
136
|
+
children: loading ? null : props.children
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
};
|
|
140
|
+
var useAuth = () => useContext(AuthContext);
|
|
141
|
+
var BusinessMediaContext = createContext({});
|
|
142
|
+
var BusinessMediaProvider = (props) => {
|
|
143
|
+
const [businessMedia, setBusinessMeadia] = useState({});
|
|
144
|
+
const fetchBusinessMedia = async () => {
|
|
145
|
+
const response = await api.getBusinessMedia();
|
|
146
|
+
setBusinessMeadia({ ...response });
|
|
147
|
+
};
|
|
148
|
+
const updateBusinessMedia = (data) => {
|
|
149
|
+
setBusinessMeadia({ ...data });
|
|
150
|
+
};
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
fetchBusinessMedia();
|
|
153
|
+
}, []);
|
|
154
|
+
return /* @__PURE__ */ jsx(BusinessMediaContext.Provider, { value: { businessMedia, updateBusinessMedia }, children: props.children });
|
|
155
|
+
};
|
|
156
|
+
var useBusinessMedia = () => useContext(BusinessMediaContext);
|
|
157
|
+
var BusinessConfigContext = createContext({
|
|
158
|
+
currency: null,
|
|
159
|
+
reward_point_config: null,
|
|
160
|
+
orderConfig: null
|
|
161
|
+
});
|
|
162
|
+
var BusinessConfigProvider = ({
|
|
163
|
+
children,
|
|
164
|
+
data,
|
|
165
|
+
baseURL
|
|
166
|
+
}) => {
|
|
167
|
+
WAApi.defaults.headers.common["business"] = data?.id;
|
|
168
|
+
WAApi.defaults.baseURL = baseURL;
|
|
169
|
+
const [loading, setLoading] = useState(true);
|
|
170
|
+
const { user } = useAuth();
|
|
171
|
+
const [currency, setCurrency] = useState({});
|
|
172
|
+
const [rewardPoint, setRewardPoint] = useState({});
|
|
173
|
+
const [orderConfig, setOrderConfig] = useState({});
|
|
174
|
+
const [domain, setDomain] = useState("");
|
|
175
|
+
const fetchData = async () => {
|
|
176
|
+
try {
|
|
177
|
+
const [business_setting, rewardPoint2, order_business_config] = await Promise.all([
|
|
178
|
+
getBusinessSetting(),
|
|
179
|
+
getRewardPointBusinessConfig(),
|
|
180
|
+
getOrderBusinessConfig()
|
|
181
|
+
]);
|
|
182
|
+
setCurrency(business_setting.currency);
|
|
183
|
+
setDomain(business_setting.domain);
|
|
184
|
+
setRewardPoint(rewardPoint2);
|
|
185
|
+
setOrderConfig(order_business_config);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
console.log("error in fetching data-->", error);
|
|
188
|
+
} finally {
|
|
189
|
+
setLoading(false);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
useEffect(() => {
|
|
193
|
+
fetchData();
|
|
194
|
+
}, []);
|
|
195
|
+
return /* @__PURE__ */ jsx(
|
|
196
|
+
BusinessConfigContext.Provider,
|
|
197
|
+
{
|
|
198
|
+
value: {
|
|
199
|
+
...data,
|
|
200
|
+
currency,
|
|
201
|
+
reward_point_config: rewardPoint,
|
|
202
|
+
domain,
|
|
203
|
+
orderConfig
|
|
204
|
+
},
|
|
205
|
+
children: loading ? null : children
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
};
|
|
209
|
+
var useBusinessContext = () => useContext(BusinessConfigContext);
|
|
210
|
+
var useBusiness = () => useContext(BusinessConfigContext);
|
|
211
|
+
var show = (type, message, options) => {
|
|
212
|
+
const defaultOptions = {
|
|
213
|
+
position: "top-right",
|
|
214
|
+
autoClose: 3e3
|
|
215
|
+
};
|
|
216
|
+
switch (type) {
|
|
217
|
+
case "success":
|
|
218
|
+
toast$1.success(message, {
|
|
219
|
+
...defaultOptions,
|
|
220
|
+
...options
|
|
221
|
+
});
|
|
222
|
+
break;
|
|
223
|
+
case "error":
|
|
224
|
+
toast$1.error(message, {
|
|
225
|
+
...defaultOptions,
|
|
226
|
+
...options
|
|
227
|
+
});
|
|
228
|
+
break;
|
|
229
|
+
case "info":
|
|
230
|
+
toast$1.info(message, {
|
|
231
|
+
...defaultOptions,
|
|
232
|
+
...options
|
|
233
|
+
});
|
|
234
|
+
break;
|
|
235
|
+
case "warning":
|
|
236
|
+
toast$1.warning(message, {
|
|
237
|
+
...defaultOptions,
|
|
238
|
+
...options
|
|
239
|
+
});
|
|
240
|
+
break;
|
|
241
|
+
case "default":
|
|
242
|
+
toast$1(message, {
|
|
243
|
+
...defaultOptions,
|
|
244
|
+
...options
|
|
245
|
+
});
|
|
246
|
+
break;
|
|
247
|
+
default:
|
|
248
|
+
toast$1(message, {
|
|
249
|
+
...defaultOptions,
|
|
250
|
+
...options
|
|
251
|
+
});
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
var toast = {
|
|
256
|
+
success: (message, options) => show("success", message, options),
|
|
257
|
+
error: (message, options) => show("error", message, options),
|
|
258
|
+
info: (message, options) => show("info", message, options),
|
|
259
|
+
warning: (message, options) => show("warning", message, options),
|
|
260
|
+
default: (message, options) => show("default", message, options)
|
|
261
|
+
};
|
|
262
|
+
var CartWishlistRefreshContext = createContext({
|
|
263
|
+
refreshType: null,
|
|
264
|
+
setRefreshType: () => null
|
|
265
|
+
});
|
|
266
|
+
var CartWishlistRefreshProvider = (props) => {
|
|
267
|
+
const [refreshType, setRefreshType] = useState(null);
|
|
268
|
+
return /* @__PURE__ */ jsx(CartWishlistRefreshContext.Provider, { value: { refreshType, setRefreshType }, children: props.children });
|
|
269
|
+
};
|
|
270
|
+
var useCartWishlistRefresh = () => useContext(CartWishlistRefreshContext);
|
|
271
|
+
var CartContext = createContext({
|
|
272
|
+
cartItems: [],
|
|
273
|
+
addToCart: () => null,
|
|
274
|
+
addToCartLoading: false,
|
|
275
|
+
addToCartError: null,
|
|
276
|
+
clearCart: () => null,
|
|
277
|
+
onChangeAddress: () => null,
|
|
278
|
+
onChangeTax: () => null,
|
|
279
|
+
onChangeOffer: () => null,
|
|
280
|
+
onChangeOrderType: () => null,
|
|
281
|
+
session: {},
|
|
282
|
+
removeAppliedOffer: () => null,
|
|
283
|
+
moveToWishlist: () => null,
|
|
284
|
+
moveToWishlistLoading: false,
|
|
285
|
+
orderFetchLoading: true,
|
|
286
|
+
onChangePromoCode: () => null,
|
|
287
|
+
onChangeGiftCard: () => null,
|
|
288
|
+
errorMessage: null
|
|
289
|
+
});
|
|
290
|
+
var CartProvider = (props) => {
|
|
291
|
+
const [cartItems, setCartItems] = useState([]);
|
|
292
|
+
const [orderFetchLoading, setOrderFetchLoading] = useState(true);
|
|
293
|
+
const [addToCartLoading, setAddToCartLoading] = useState(false);
|
|
294
|
+
const [addToCartError, setAddToCartError] = useState(null);
|
|
295
|
+
const [moveToWishlistLoading, setMoveToWishlistLoading] = useState(false);
|
|
296
|
+
const [session, setSession] = useState(null);
|
|
297
|
+
const [errorMessage, setErrorMessage] = useState(null);
|
|
298
|
+
const { user } = useAuth();
|
|
299
|
+
const storage = useStorage();
|
|
300
|
+
const { refreshType, setRefreshType } = useCartWishlistRefresh();
|
|
301
|
+
useEffect(() => {
|
|
302
|
+
if (refreshType == "cart") {
|
|
303
|
+
fetchOrderDetail();
|
|
304
|
+
setRefreshType(null);
|
|
305
|
+
}
|
|
306
|
+
}, [refreshType]);
|
|
307
|
+
const onChangeAddress = async (addressId, addressType) => {
|
|
308
|
+
let body = {};
|
|
309
|
+
if (addressType === "shipping") {
|
|
310
|
+
body = {
|
|
311
|
+
shipping_address: addressId
|
|
312
|
+
};
|
|
313
|
+
} else if (addressType === "billing") {
|
|
314
|
+
body = {
|
|
315
|
+
billing_address: addressId
|
|
316
|
+
};
|
|
317
|
+
} else {
|
|
318
|
+
body = {
|
|
319
|
+
shipping_address: addressId,
|
|
320
|
+
billing_address: addressId
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
if (!orderFetchLoading && session && user) {
|
|
325
|
+
const response = await api.updateAddressCartOrder(body);
|
|
326
|
+
setSession({
|
|
327
|
+
...session,
|
|
328
|
+
shipping_address: response.shipping_address,
|
|
329
|
+
billing_address: response.billing_address
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
} catch (error) {
|
|
333
|
+
console.log("Error---->", error);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
const onChangePromoCode = async (promoCodeID) => {
|
|
337
|
+
let body = {
|
|
338
|
+
promo: promoCodeID
|
|
339
|
+
};
|
|
340
|
+
try {
|
|
341
|
+
if (!orderFetchLoading && session && user) {
|
|
342
|
+
const response = await api.updateCartPromoCode(body);
|
|
343
|
+
setSession({
|
|
344
|
+
...session,
|
|
345
|
+
promo: response.promo,
|
|
346
|
+
promo_redeem_amount: Number(response.promo_redeem_amount),
|
|
347
|
+
final_payable_amount: Number(response.final_payable_amount)
|
|
348
|
+
});
|
|
349
|
+
if (promoCodeID) {
|
|
350
|
+
toast.success("Promo code applied successfully");
|
|
351
|
+
} else {
|
|
352
|
+
toast.info("Promo code removed");
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
} catch (error) {
|
|
356
|
+
setErrorMessage(error?.response?.message);
|
|
357
|
+
console.log("Error---->", error);
|
|
358
|
+
const errorMsg = error?.response?.message || "Failed to apply promo code";
|
|
359
|
+
toast.error(errorMsg);
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
const onChangeGiftCard = async (pin, code) => {
|
|
363
|
+
let body = {
|
|
364
|
+
pin,
|
|
365
|
+
code
|
|
366
|
+
};
|
|
367
|
+
try {
|
|
368
|
+
if (!orderFetchLoading && session && user) {
|
|
369
|
+
const response = await api.updateCartGiftCard(body);
|
|
370
|
+
setSession({
|
|
371
|
+
...session,
|
|
372
|
+
giftcard: response.giftcard,
|
|
373
|
+
giftcard_redeem_amount: Number(response.giftcard_redeem_amount),
|
|
374
|
+
final_payable_amount: Number(response.final_payable_amount)
|
|
375
|
+
});
|
|
376
|
+
setErrorMessage(null);
|
|
377
|
+
fetchOrderDetail();
|
|
378
|
+
}
|
|
379
|
+
} catch (error) {
|
|
380
|
+
setErrorMessage(error?.response?.message);
|
|
381
|
+
console.log("Error---->", error);
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
const onChangeOffer = async (offers) => {
|
|
385
|
+
let body = {
|
|
386
|
+
offer: offers
|
|
387
|
+
};
|
|
388
|
+
try {
|
|
389
|
+
if (!orderFetchLoading && session && user) {
|
|
390
|
+
const response = await api.updateOfferCartOrder(body);
|
|
391
|
+
const orderData = await api.getOrderCartDetail();
|
|
392
|
+
setSession({
|
|
393
|
+
...session,
|
|
394
|
+
offers: response.offers,
|
|
395
|
+
final_payable_amount: Number(orderData.final_payable_amount),
|
|
396
|
+
offer_redeem_amount: Number(orderData.offer_redeem_amount)
|
|
397
|
+
});
|
|
398
|
+
if (offers) {
|
|
399
|
+
toast.success("Offer applied successfully");
|
|
400
|
+
} else {
|
|
401
|
+
toast.info("Offer removed");
|
|
402
|
+
}
|
|
403
|
+
fetchOrderDetail();
|
|
404
|
+
}
|
|
405
|
+
} catch (error) {
|
|
406
|
+
console.log("Error---->", error);
|
|
407
|
+
toast.error("Failed to apply offer");
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
const onChangeOrderType = async (type) => {
|
|
411
|
+
const prevType = session?.type;
|
|
412
|
+
setSession((prev) => ({
|
|
413
|
+
...prev,
|
|
414
|
+
type
|
|
415
|
+
}));
|
|
416
|
+
let body = { type };
|
|
417
|
+
try {
|
|
418
|
+
const response = await api.updateCartOrderType(body);
|
|
419
|
+
setSession((prev) => ({
|
|
420
|
+
...prev,
|
|
421
|
+
type: response?.type ?? type
|
|
422
|
+
}));
|
|
423
|
+
} catch (error) {
|
|
424
|
+
console.log("Error---->", error);
|
|
425
|
+
setSession((prev) => ({
|
|
426
|
+
...prev,
|
|
427
|
+
type: prevType
|
|
428
|
+
}));
|
|
429
|
+
toast.error("Something went wrong! Please try again.");
|
|
430
|
+
}
|
|
431
|
+
};
|
|
432
|
+
const onChangeTax = async (legal_name, tax_number) => {
|
|
433
|
+
let body = {
|
|
434
|
+
tax_number,
|
|
435
|
+
legal_name
|
|
436
|
+
};
|
|
437
|
+
try {
|
|
438
|
+
if (!orderFetchLoading && session && user) {
|
|
439
|
+
const response = await api.updateTaxCartOrder(body);
|
|
440
|
+
setSession({
|
|
441
|
+
...session,
|
|
442
|
+
tax: response
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
} catch (error) {
|
|
446
|
+
console.log("Error---->", error);
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
useEffect(() => {
|
|
450
|
+
session && storage.setItem("cart", JSON.stringify(session), "local");
|
|
451
|
+
}, [session]);
|
|
452
|
+
const fetchOrderDetail = async () => {
|
|
453
|
+
setOrderFetchLoading(true);
|
|
454
|
+
const response = await api.getOrderCartDetail();
|
|
455
|
+
setSession({
|
|
456
|
+
...session,
|
|
457
|
+
...response
|
|
458
|
+
});
|
|
459
|
+
setCartItems(response.products);
|
|
460
|
+
setOrderFetchLoading(false);
|
|
461
|
+
};
|
|
462
|
+
useEffect(() => {
|
|
463
|
+
fetchOrderDetail();
|
|
464
|
+
}, [user]);
|
|
465
|
+
const removeAppliedOffer = async () => {
|
|
466
|
+
setSession({
|
|
467
|
+
...session,
|
|
468
|
+
offers: null,
|
|
469
|
+
offer_redeem_amount: 0
|
|
470
|
+
});
|
|
471
|
+
toast.info("Offer removed");
|
|
472
|
+
};
|
|
473
|
+
const addToCart = async (sku, quantity) => {
|
|
474
|
+
setAddToCartLoading(true);
|
|
475
|
+
setAddToCartError(null);
|
|
476
|
+
setOrderFetchLoading(true);
|
|
477
|
+
let isItemInCart = cartItems?.find((item) => item.sku.id == sku);
|
|
478
|
+
try {
|
|
479
|
+
if (quantity === 0) {
|
|
480
|
+
if (isItemInCart) {
|
|
481
|
+
await api.deleteCartItem(isItemInCart.id);
|
|
482
|
+
console.log("Item removed from cart");
|
|
483
|
+
setCartItems(
|
|
484
|
+
cartItems?.filter(
|
|
485
|
+
(cartItem) => cartItem.id !== isItemInCart.id
|
|
486
|
+
)
|
|
487
|
+
);
|
|
488
|
+
await fetchOrderDetail();
|
|
489
|
+
}
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
if (isItemInCart) {
|
|
493
|
+
await api.updateCartItem(isItemInCart.id, {
|
|
494
|
+
sku: isItemInCart.sku.id,
|
|
495
|
+
qty: isItemInCart.qty + quantity
|
|
496
|
+
});
|
|
497
|
+
await fetchOrderDetail();
|
|
498
|
+
console.log("Cart item updated successfully");
|
|
499
|
+
} else {
|
|
500
|
+
let body = {
|
|
501
|
+
qty: quantity,
|
|
502
|
+
sku
|
|
503
|
+
};
|
|
504
|
+
await api.addProductToCart(body);
|
|
505
|
+
console.log("New item added to cart.");
|
|
506
|
+
toast.success("Item added to cart");
|
|
507
|
+
await fetchOrderDetail();
|
|
508
|
+
}
|
|
509
|
+
} catch (error) {
|
|
510
|
+
setOrderFetchLoading(false);
|
|
511
|
+
console.log("Error---->", error);
|
|
512
|
+
const message = error?.response?.message || error?.response?.data?.message || error?.message || "Unable to add to cart. Please try again.";
|
|
513
|
+
setAddToCartError(message);
|
|
514
|
+
toast.error(message);
|
|
515
|
+
} finally {
|
|
516
|
+
setAddToCartLoading(false);
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
const clearCart = () => {
|
|
520
|
+
setCartItems([]);
|
|
521
|
+
setSession(null);
|
|
522
|
+
storage.removeItem("cart");
|
|
523
|
+
fetchOrderDetail();
|
|
524
|
+
};
|
|
525
|
+
const moveToWishlist = async (id) => {
|
|
526
|
+
let isItemInCart = cartItems?.find((item) => item.id === id);
|
|
527
|
+
if (!isItemInCart) {
|
|
528
|
+
console.log("Item not found in cart.");
|
|
529
|
+
toast.warning("Item not found in cart");
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
try {
|
|
533
|
+
setMoveToWishlistLoading(true);
|
|
534
|
+
let body = { sku: isItemInCart.sku.id };
|
|
535
|
+
await api.addProductToWishlist(body);
|
|
536
|
+
await api.deleteCartItem(isItemInCart.id);
|
|
537
|
+
setCartItems(
|
|
538
|
+
(prevCartItems) => prevCartItems.filter((cartItem) => cartItem.id !== isItemInCart.id)
|
|
539
|
+
);
|
|
540
|
+
toast.success("Item moved to wishlist");
|
|
541
|
+
setRefreshType("wishlist");
|
|
542
|
+
} catch (error) {
|
|
543
|
+
console.error("Error moving item to wishlist:", error);
|
|
544
|
+
const errorMessage2 = error?.response?.data?.message || error?.response?.message || "Something went wrong! Please try again.";
|
|
545
|
+
toast.error(errorMessage2);
|
|
546
|
+
} finally {
|
|
547
|
+
setMoveToWishlistLoading(false);
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
return /* @__PURE__ */ jsx(
|
|
551
|
+
CartContext.Provider,
|
|
552
|
+
{
|
|
553
|
+
value: {
|
|
554
|
+
cartItems,
|
|
555
|
+
addToCart,
|
|
556
|
+
addToCartLoading,
|
|
557
|
+
addToCartError,
|
|
558
|
+
clearCart,
|
|
559
|
+
onChangeAddress,
|
|
560
|
+
onChangeTax,
|
|
561
|
+
onChangeOffer,
|
|
562
|
+
onChangeOrderType,
|
|
563
|
+
session,
|
|
564
|
+
removeAppliedOffer,
|
|
565
|
+
moveToWishlist,
|
|
566
|
+
moveToWishlistLoading,
|
|
567
|
+
orderFetchLoading,
|
|
568
|
+
onChangePromoCode,
|
|
569
|
+
onChangeGiftCard,
|
|
570
|
+
errorMessage
|
|
571
|
+
},
|
|
572
|
+
children: props.children
|
|
573
|
+
}
|
|
574
|
+
);
|
|
575
|
+
};
|
|
576
|
+
var useCart = () => useContext(CartContext);
|
|
577
|
+
var FilterContext = createContext({
|
|
578
|
+
selectedCategoryId: [],
|
|
579
|
+
addCategoryFilterId: () => null,
|
|
580
|
+
removeCategoryFilterId: () => null,
|
|
581
|
+
menuList: [],
|
|
582
|
+
productLoading: true,
|
|
583
|
+
currentPage: 1,
|
|
584
|
+
handlePageChange: () => null,
|
|
585
|
+
setMenuList: () => null,
|
|
586
|
+
filterConfig: null,
|
|
587
|
+
setSelectedSortOption: () => null,
|
|
588
|
+
seletedRattingNumber: 0,
|
|
589
|
+
setSelectedRattingNumber: () => null,
|
|
590
|
+
selectedDiscountOff: 0,
|
|
591
|
+
setSelectedDiscountOff: () => null,
|
|
592
|
+
selectedMinPrice: 0,
|
|
593
|
+
selectedMaxPrice: 0,
|
|
594
|
+
setSelectedMinPrice: () => null,
|
|
595
|
+
setSelectedMaxPrice: () => null,
|
|
596
|
+
brandList: [],
|
|
597
|
+
selectedBrandId: [],
|
|
598
|
+
updateBrandIds: () => null,
|
|
599
|
+
brandLoading: false,
|
|
600
|
+
variantList: [],
|
|
601
|
+
selectedVariants: [],
|
|
602
|
+
updateSelectedVariants: () => null,
|
|
603
|
+
variantLoading: false,
|
|
604
|
+
total: 0,
|
|
605
|
+
limit: 10,
|
|
606
|
+
offset: 0
|
|
607
|
+
});
|
|
608
|
+
var FilterProvider = (props) => {
|
|
609
|
+
const [filterConfig, setFilterConfig] = useState();
|
|
610
|
+
const [selectedCategoryId, setSelectedCategoryId] = useState([]);
|
|
611
|
+
const [selectedSortOption, setSelectedSortOption] = useState("newest_first");
|
|
612
|
+
const [seletedRattingNumber, setSelectedRattingNumber] = useState();
|
|
613
|
+
const [selectedDiscountOff, setSelectedDiscountOff] = useState();
|
|
614
|
+
const [selectedMinPrice, setSelectedMinPrice] = useState(
|
|
615
|
+
filterConfig?.price?.min
|
|
616
|
+
);
|
|
617
|
+
const [selectedMaxPrice, setSelectedMaxPrice] = useState(
|
|
618
|
+
filterConfig?.price?.max
|
|
619
|
+
);
|
|
620
|
+
const [menuList, setMenuList] = useState([]);
|
|
621
|
+
const [productLoading, setProductLoading] = useState(true);
|
|
622
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
623
|
+
const [filterConfigLoading, setFilterConfigLoading] = useState(false);
|
|
624
|
+
const [brandList, setBrandList] = useState([]);
|
|
625
|
+
const [selectedBrandId, setSelectedBrandId] = useState([]);
|
|
626
|
+
const [brandLoading, setBrandLoading] = useState(false);
|
|
627
|
+
const [variantList, setVariantList] = useState([]);
|
|
628
|
+
const [selectedVariants, setSelectedVariants] = useState([]);
|
|
629
|
+
const [variantLoading, setVariantLoading] = useState(false);
|
|
630
|
+
const [limit, setLimit] = useState(10);
|
|
631
|
+
const [offset, setOffset] = useState(0);
|
|
632
|
+
const [total, setTotal] = useState(0);
|
|
633
|
+
const fetchBrandList = async () => {
|
|
634
|
+
setBrandLoading(true);
|
|
635
|
+
let body = {
|
|
636
|
+
category_ids: selectedCategoryId
|
|
637
|
+
};
|
|
638
|
+
try {
|
|
639
|
+
const brands = await api.getBrandList(body);
|
|
640
|
+
setBrandList(brands);
|
|
641
|
+
} catch (error) {
|
|
642
|
+
console.log(error);
|
|
643
|
+
} finally {
|
|
644
|
+
setBrandLoading(false);
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
const addCategoryFilterId = (id) => {
|
|
648
|
+
setSelectedCategoryId((prevIds) => {
|
|
649
|
+
if (prevIds.includes(id)) {
|
|
650
|
+
return prevIds;
|
|
651
|
+
}
|
|
652
|
+
return [...prevIds, id];
|
|
653
|
+
});
|
|
654
|
+
setCurrentPage(1);
|
|
655
|
+
};
|
|
656
|
+
const fetchFilterConfig = async () => {
|
|
657
|
+
setFilterConfigLoading(true);
|
|
658
|
+
const response = await api.getProductFilterConfig();
|
|
659
|
+
setFilterConfig(response);
|
|
660
|
+
setFilterConfigLoading(false);
|
|
661
|
+
};
|
|
662
|
+
useEffect(() => {
|
|
663
|
+
fetchFilterConfig();
|
|
664
|
+
}, []);
|
|
665
|
+
const removeCategoryFilterId = (id) => {
|
|
666
|
+
setSelectedCategoryId((x) => {
|
|
667
|
+
return x.filter((o) => o !== id);
|
|
668
|
+
});
|
|
669
|
+
setCurrentPage(1);
|
|
670
|
+
};
|
|
671
|
+
const fetchProductList = async () => {
|
|
672
|
+
setProductLoading(true);
|
|
673
|
+
let body = {
|
|
674
|
+
category_id: selectedCategoryId,
|
|
675
|
+
sort_by: selectedSortOption,
|
|
676
|
+
min_rating: seletedRattingNumber,
|
|
677
|
+
min_discount: selectedDiscountOff,
|
|
678
|
+
min_price: selectedMinPrice,
|
|
679
|
+
max_price: selectedMaxPrice,
|
|
680
|
+
brand_ids: selectedCategoryId.length > 0 ? selectedBrandId : null,
|
|
681
|
+
variants: selectedCategoryId.length > 0 ? selectedVariants : null,
|
|
682
|
+
limit,
|
|
683
|
+
offset
|
|
684
|
+
};
|
|
685
|
+
try {
|
|
686
|
+
const productSearch = await api.getProductSearch(body);
|
|
687
|
+
setTotal(productSearch.count);
|
|
688
|
+
setMenuList(productSearch.results);
|
|
689
|
+
} catch (error) {
|
|
690
|
+
console.log(error);
|
|
691
|
+
} finally {
|
|
692
|
+
setProductLoading(false);
|
|
693
|
+
}
|
|
694
|
+
};
|
|
695
|
+
const updateBrandIds = (id) => {
|
|
696
|
+
setSelectedBrandId((prevIds) => {
|
|
697
|
+
if (prevIds.includes(id)) {
|
|
698
|
+
return prevIds.filter((x) => x !== id);
|
|
699
|
+
}
|
|
700
|
+
return [...prevIds, id];
|
|
701
|
+
});
|
|
702
|
+
};
|
|
703
|
+
const updateSelectedVariants = (label) => {
|
|
704
|
+
setSelectedVariants((prevVariants) => {
|
|
705
|
+
if (prevVariants.includes(label)) {
|
|
706
|
+
return prevVariants.filter((x) => x !== label);
|
|
707
|
+
}
|
|
708
|
+
return [...prevVariants, label];
|
|
709
|
+
});
|
|
710
|
+
};
|
|
711
|
+
const fetchVariantList = async () => {
|
|
712
|
+
setVariantLoading(true);
|
|
713
|
+
let body = {
|
|
714
|
+
category_ids: selectedCategoryId
|
|
715
|
+
};
|
|
716
|
+
const response = await api.getProductVariantByCategory(body);
|
|
717
|
+
setVariantList(response);
|
|
718
|
+
setVariantLoading(false);
|
|
719
|
+
};
|
|
720
|
+
useEffect(() => {
|
|
721
|
+
if (!filterConfigLoading) {
|
|
722
|
+
fetchProductList();
|
|
723
|
+
}
|
|
724
|
+
}, [
|
|
725
|
+
selectedCategoryId,
|
|
726
|
+
currentPage,
|
|
727
|
+
selectedSortOption,
|
|
728
|
+
seletedRattingNumber,
|
|
729
|
+
selectedDiscountOff,
|
|
730
|
+
selectedMinPrice,
|
|
731
|
+
selectedMaxPrice,
|
|
732
|
+
selectedBrandId,
|
|
733
|
+
selectedVariants,
|
|
734
|
+
limit,
|
|
735
|
+
offset
|
|
736
|
+
]);
|
|
737
|
+
const handlePageChange = (newOffset) => {
|
|
738
|
+
setOffset(newOffset);
|
|
739
|
+
};
|
|
740
|
+
useEffect(() => {
|
|
741
|
+
if (selectedCategoryId.length > 0) {
|
|
742
|
+
fetchBrandList();
|
|
743
|
+
fetchVariantList();
|
|
744
|
+
}
|
|
745
|
+
}, [selectedCategoryId]);
|
|
746
|
+
return /* @__PURE__ */ jsx(
|
|
747
|
+
FilterContext.Provider,
|
|
748
|
+
{
|
|
749
|
+
value: {
|
|
750
|
+
selectedCategoryId,
|
|
751
|
+
setMenuList,
|
|
752
|
+
addCategoryFilterId,
|
|
753
|
+
removeCategoryFilterId,
|
|
754
|
+
menuList,
|
|
755
|
+
productLoading,
|
|
756
|
+
currentPage,
|
|
757
|
+
handlePageChange,
|
|
758
|
+
filterConfig,
|
|
759
|
+
setSelectedSortOption,
|
|
760
|
+
seletedRattingNumber,
|
|
761
|
+
setSelectedRattingNumber,
|
|
762
|
+
selectedDiscountOff,
|
|
763
|
+
setSelectedDiscountOff,
|
|
764
|
+
selectedMinPrice,
|
|
765
|
+
selectedMaxPrice,
|
|
766
|
+
setSelectedMinPrice,
|
|
767
|
+
setSelectedMaxPrice,
|
|
768
|
+
brandList,
|
|
769
|
+
selectedBrandId,
|
|
770
|
+
updateBrandIds,
|
|
771
|
+
brandLoading,
|
|
772
|
+
variantList,
|
|
773
|
+
selectedVariants,
|
|
774
|
+
updateSelectedVariants,
|
|
775
|
+
variantLoading,
|
|
776
|
+
total,
|
|
777
|
+
limit,
|
|
778
|
+
offset
|
|
779
|
+
},
|
|
780
|
+
children: !filterConfigLoading && props.children
|
|
781
|
+
}
|
|
782
|
+
);
|
|
783
|
+
};
|
|
784
|
+
var useFilter = () => useContext(FilterContext);
|
|
785
|
+
var ProductDetailContext = createContext({
|
|
786
|
+
selectedVariants: [],
|
|
787
|
+
selectUnselectVariants: () => null,
|
|
788
|
+
productDetail: [],
|
|
789
|
+
waitProductLoading: true,
|
|
790
|
+
setSelectedVariants: () => null
|
|
791
|
+
});
|
|
792
|
+
var ProductDetailProvider = (props) => {
|
|
793
|
+
const [selectedVariants, setSelectedVariants] = useState([]);
|
|
794
|
+
const [productDetail, setProductDetail] = useState([]);
|
|
795
|
+
const [waitProductLoading, setWaitProductLoading] = useState(true);
|
|
796
|
+
const selectedIds = props?.selected_variants?.split(",").map(Number);
|
|
797
|
+
const selectUnselectVariants = (type, value, id) => {
|
|
798
|
+
setWaitProductLoading(true);
|
|
799
|
+
setSelectedVariants((prev) => {
|
|
800
|
+
const existingIndex = prev.findIndex((item) => item.type === type);
|
|
801
|
+
if (existingIndex > -1) {
|
|
802
|
+
const updatedVariants = [...prev];
|
|
803
|
+
updatedVariants[existingIndex] = { type, value, id };
|
|
804
|
+
return updatedVariants;
|
|
805
|
+
} else {
|
|
806
|
+
const newVariants = [...prev, { type, value, id }];
|
|
807
|
+
return newVariants;
|
|
808
|
+
}
|
|
809
|
+
});
|
|
810
|
+
setTimeout(() => {
|
|
811
|
+
setWaitProductLoading(false);
|
|
812
|
+
}, 1e3);
|
|
813
|
+
};
|
|
814
|
+
useEffect(() => {
|
|
815
|
+
(async () => {
|
|
816
|
+
setWaitProductLoading(true);
|
|
817
|
+
try {
|
|
818
|
+
const productDetail2 = await api.getProductDetail(props.productId);
|
|
819
|
+
setProductDetail(productDetail2);
|
|
820
|
+
if (props.selected_variants !== null) {
|
|
821
|
+
const initialV = productDetail2?.variant?.map((vType) => {
|
|
822
|
+
const matchedVariant = vType.variants.find(
|
|
823
|
+
(variant) => selectedIds.includes(variant.id)
|
|
824
|
+
);
|
|
825
|
+
if (matchedVariant) {
|
|
826
|
+
return {
|
|
827
|
+
id: matchedVariant.id,
|
|
828
|
+
type: vType.variant_type.type,
|
|
829
|
+
value: matchedVariant.label
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
return null;
|
|
833
|
+
}).filter(Boolean);
|
|
834
|
+
setSelectedVariants(initialV || []);
|
|
835
|
+
} else {
|
|
836
|
+
let initialV = productDetail2.variant.map((vType) => {
|
|
837
|
+
return {
|
|
838
|
+
id: vType.variants[0].id,
|
|
839
|
+
type: vType.variant_type.type,
|
|
840
|
+
value: vType.variants[0].label
|
|
841
|
+
};
|
|
842
|
+
});
|
|
843
|
+
setSelectedVariants(initialV || []);
|
|
844
|
+
}
|
|
845
|
+
} catch (error) {
|
|
846
|
+
console.error("Error loading product details:", error);
|
|
847
|
+
} finally {
|
|
848
|
+
setWaitProductLoading(false);
|
|
849
|
+
}
|
|
850
|
+
})();
|
|
851
|
+
}, [props.productId]);
|
|
852
|
+
return /* @__PURE__ */ jsx(
|
|
853
|
+
ProductDetailContext.Provider,
|
|
854
|
+
{
|
|
855
|
+
value: {
|
|
856
|
+
selectedVariants,
|
|
857
|
+
setSelectedVariants,
|
|
858
|
+
selectUnselectVariants,
|
|
859
|
+
productDetail,
|
|
860
|
+
waitProductLoading
|
|
861
|
+
},
|
|
862
|
+
children: props.children
|
|
863
|
+
}
|
|
864
|
+
);
|
|
865
|
+
};
|
|
866
|
+
var useProductDetail = () => useContext(ProductDetailContext);
|
|
867
|
+
|
|
868
|
+
// src/tailwind/applyTheme.ts
|
|
869
|
+
function applyTheme(themeRGB) {
|
|
870
|
+
const themeObject = mapTheme(themeRGB);
|
|
871
|
+
const root = document.documentElement;
|
|
872
|
+
Object.keys(themeObject).forEach((v) => {
|
|
873
|
+
const propertyVal = themeObject[v];
|
|
874
|
+
const validation = validateRGB(propertyVal);
|
|
875
|
+
if (!validation) {
|
|
876
|
+
throw new Error(`Invalid RGB value for ${v}: ${propertyVal}`);
|
|
877
|
+
}
|
|
878
|
+
root.style.setProperty(v, propertyVal);
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
function mapTheme(rgb) {
|
|
882
|
+
return {
|
|
883
|
+
"--color-primary": rgb["primary"] ?? ""
|
|
884
|
+
};
|
|
885
|
+
}
|
|
886
|
+
function validateRGB(rgb) {
|
|
887
|
+
if (!rgb) return true;
|
|
888
|
+
const rgbRegex = /^(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})$/;
|
|
889
|
+
return rgbRegex.test(rgb);
|
|
890
|
+
}
|
|
891
|
+
function hexToRgb(hex) {
|
|
892
|
+
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
893
|
+
return result ? `${parseInt(result[1], 16).toString()},${parseInt(result[2], 16).toString()},${parseInt(result[3], 16).toString()}` : null;
|
|
894
|
+
}
|
|
895
|
+
var ThemeContext = createContext({
|
|
896
|
+
themeRGB: {}
|
|
897
|
+
});
|
|
898
|
+
function ThemeProvider(props) {
|
|
899
|
+
const config = useContext(BusinessConfigContext);
|
|
900
|
+
const { theme } = config;
|
|
901
|
+
const pcolor = hexToRgb(theme?.primary_color);
|
|
902
|
+
const primaryColor = !!pcolor ? pcolor : "0, 72, 76";
|
|
903
|
+
useEffect(() => {
|
|
904
|
+
applyTheme({ primary: primaryColor });
|
|
905
|
+
}, []);
|
|
906
|
+
const value = useMemo(() => {
|
|
907
|
+
return { themeRGB: { primary: primaryColor } };
|
|
908
|
+
}, [primaryColor]);
|
|
909
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children: props.children });
|
|
910
|
+
}
|
|
911
|
+
var useTheme = () => useContext(ThemeContext);
|
|
912
|
+
var ProductConfigContext = createContext({});
|
|
913
|
+
var ProductConfigProvider = (props) => {
|
|
914
|
+
const [productConfig, setProductConfig] = useState({});
|
|
915
|
+
const fetchProductConfig = async () => {
|
|
916
|
+
const response = await api.getProductConfig();
|
|
917
|
+
setProductConfig({ ...response });
|
|
918
|
+
};
|
|
919
|
+
const updateProductConfig = (data) => {
|
|
920
|
+
setProductConfig({ ...data });
|
|
921
|
+
};
|
|
922
|
+
useEffect(() => {
|
|
923
|
+
fetchProductConfig();
|
|
924
|
+
}, []);
|
|
925
|
+
return /* @__PURE__ */ jsx(
|
|
926
|
+
ProductConfigContext.Provider,
|
|
927
|
+
{
|
|
928
|
+
value: { productConfig, updateProductConfig },
|
|
929
|
+
children: props.children
|
|
930
|
+
}
|
|
931
|
+
);
|
|
932
|
+
};
|
|
933
|
+
var useProductConfig = () => useContext(ProductConfigContext);
|
|
934
|
+
var CustomerConfigContext = createContext({ customerConfig: null });
|
|
935
|
+
var CustomerConfigProvider = (props) => {
|
|
936
|
+
const [customerConfig, setCustomerConfig] = useState();
|
|
937
|
+
const [loading, setLoading] = useState(false);
|
|
938
|
+
const fetchCustomerConfig = async () => {
|
|
939
|
+
setLoading(true);
|
|
940
|
+
try {
|
|
941
|
+
const response = await api.getCustomerBusinessConfig();
|
|
942
|
+
setCustomerConfig(response);
|
|
943
|
+
} catch (error) {
|
|
944
|
+
console.log("Error in fetching customer config---->", error);
|
|
945
|
+
}
|
|
946
|
+
setLoading(false);
|
|
947
|
+
};
|
|
948
|
+
useEffect(() => {
|
|
949
|
+
fetchCustomerConfig();
|
|
950
|
+
}, []);
|
|
951
|
+
return /* @__PURE__ */ jsx(CustomerConfigContext.Provider, { value: { customerConfig }, children: loading ? null : props.children });
|
|
952
|
+
};
|
|
953
|
+
var useCustomer = () => useContext(CustomerConfigContext);
|
|
954
|
+
var ThemeEditContext = createContext({
|
|
955
|
+
token: "",
|
|
956
|
+
isThemeEdit: false,
|
|
957
|
+
isHeader: false,
|
|
958
|
+
isFooter: false,
|
|
959
|
+
isAnnouncementBar: false
|
|
960
|
+
});
|
|
961
|
+
var ThemeEditProvider = (props) => {
|
|
962
|
+
const [isThemeEdit, setIsThemeEdit] = useState(props.isThemeEdit);
|
|
963
|
+
const [token, setToken] = useState(props.token);
|
|
964
|
+
const [isHeader, setIsHeader] = useState(props.isHeader);
|
|
965
|
+
const [isFooter, setIsFooter] = useState(props.isFooter);
|
|
966
|
+
const [isAnnouncementBar, setIsAnnouncementBar] = useState(props.isAnnouncementBar);
|
|
967
|
+
return /* @__PURE__ */ jsx(
|
|
968
|
+
ThemeEditContext.Provider,
|
|
969
|
+
{
|
|
970
|
+
value: { token, isThemeEdit, isHeader, isFooter, isAnnouncementBar },
|
|
971
|
+
children: props.children
|
|
972
|
+
}
|
|
973
|
+
);
|
|
974
|
+
};
|
|
975
|
+
var useThemeEdit = () => useContext(ThemeEditContext);
|
|
976
|
+
var HomeConfigContext = createContext({
|
|
977
|
+
selectedConfig: [],
|
|
978
|
+
setSelectedConfig: () => null,
|
|
979
|
+
addConfig: () => null,
|
|
980
|
+
updateConfig: () => null,
|
|
981
|
+
removeConfig: () => null,
|
|
982
|
+
moveConfig: () => null,
|
|
983
|
+
themeConfigData: {},
|
|
984
|
+
loading: true
|
|
985
|
+
});
|
|
986
|
+
var HomeConfigProvider = (props) => {
|
|
987
|
+
const [selectedConfig, setSelectedConfig] = useState([]);
|
|
988
|
+
const { token } = useThemeEdit();
|
|
989
|
+
const themeConfig = useContext(BusinessConfigContext);
|
|
990
|
+
const [themeConfigData, setThemeConfigData] = useState({});
|
|
991
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
992
|
+
const updateRef = useRef(false);
|
|
993
|
+
const [loading, setLoading] = useState(true);
|
|
994
|
+
const getThemeConfig = useCallback(async () => {
|
|
995
|
+
setLoading(true);
|
|
996
|
+
try {
|
|
997
|
+
const response = await retrieveThemeContent(
|
|
998
|
+
themeConfig.theme.id,
|
|
999
|
+
props.page
|
|
1000
|
+
);
|
|
1001
|
+
setThemeConfigData(response);
|
|
1002
|
+
if (response?.data && Array.isArray(response.data)) {
|
|
1003
|
+
setSelectedConfig(
|
|
1004
|
+
response.data.filter(
|
|
1005
|
+
(item) => item !== null && item !== void 0
|
|
1006
|
+
)
|
|
1007
|
+
);
|
|
1008
|
+
}
|
|
1009
|
+
setIsInitialized(true);
|
|
1010
|
+
} catch (error) {
|
|
1011
|
+
console.error("Error fetching theme content:", error);
|
|
1012
|
+
} finally {
|
|
1013
|
+
setLoading(false);
|
|
1014
|
+
}
|
|
1015
|
+
}, [themeConfig.theme.id]);
|
|
1016
|
+
const onUpdateThemeContent = useCallback(
|
|
1017
|
+
async (configToUpdate = selectedConfig) => {
|
|
1018
|
+
try {
|
|
1019
|
+
const body = {
|
|
1020
|
+
data: configToUpdate,
|
|
1021
|
+
slug: props.page,
|
|
1022
|
+
platform: typeof window !== "undefined" ? "website" : "app"
|
|
1023
|
+
};
|
|
1024
|
+
if (updateRef.current) return;
|
|
1025
|
+
updateRef.current = true;
|
|
1026
|
+
await updateThemeContent(
|
|
1027
|
+
body,
|
|
1028
|
+
themeConfig?.theme?.id,
|
|
1029
|
+
props.page,
|
|
1030
|
+
token
|
|
1031
|
+
);
|
|
1032
|
+
const updatedResponse = await retrieveThemeContent(
|
|
1033
|
+
themeConfig.theme.id,
|
|
1034
|
+
props.page
|
|
1035
|
+
);
|
|
1036
|
+
setThemeConfigData(updatedResponse);
|
|
1037
|
+
} catch (error) {
|
|
1038
|
+
console.error("Error updating theme content:", error);
|
|
1039
|
+
} finally {
|
|
1040
|
+
updateRef.current = false;
|
|
1041
|
+
}
|
|
1042
|
+
},
|
|
1043
|
+
[isInitialized, token, themeConfig?.theme?.id, selectedConfig]
|
|
1044
|
+
);
|
|
1045
|
+
const addConfig = useCallback(
|
|
1046
|
+
async (config) => {
|
|
1047
|
+
setSelectedConfig((prev) => {
|
|
1048
|
+
const newConfig = [...prev, config];
|
|
1049
|
+
onUpdateThemeContent(newConfig);
|
|
1050
|
+
return newConfig;
|
|
1051
|
+
});
|
|
1052
|
+
},
|
|
1053
|
+
[onUpdateThemeContent]
|
|
1054
|
+
);
|
|
1055
|
+
const updateConfig = useCallback(
|
|
1056
|
+
async (config, index) => {
|
|
1057
|
+
setSelectedConfig((prev) => {
|
|
1058
|
+
const newConfig = [...prev];
|
|
1059
|
+
newConfig[index] = config;
|
|
1060
|
+
onUpdateThemeContent(newConfig);
|
|
1061
|
+
return newConfig;
|
|
1062
|
+
});
|
|
1063
|
+
},
|
|
1064
|
+
[onUpdateThemeContent]
|
|
1065
|
+
);
|
|
1066
|
+
const moveConfig = useCallback(
|
|
1067
|
+
(fromIndex, toIndex) => {
|
|
1068
|
+
setSelectedConfig((prev) => {
|
|
1069
|
+
const newConfig = [...prev];
|
|
1070
|
+
const [movedItem] = newConfig.splice(fromIndex, 1);
|
|
1071
|
+
newConfig.splice(toIndex, 0, movedItem);
|
|
1072
|
+
onUpdateThemeContent(newConfig);
|
|
1073
|
+
return newConfig;
|
|
1074
|
+
});
|
|
1075
|
+
},
|
|
1076
|
+
[onUpdateThemeContent]
|
|
1077
|
+
);
|
|
1078
|
+
const removeConfig = useCallback(
|
|
1079
|
+
async (index) => {
|
|
1080
|
+
setSelectedConfig((prev) => {
|
|
1081
|
+
const newConfig = prev.filter((_2, i) => i !== index);
|
|
1082
|
+
onUpdateThemeContent(newConfig);
|
|
1083
|
+
return newConfig;
|
|
1084
|
+
});
|
|
1085
|
+
},
|
|
1086
|
+
[onUpdateThemeContent]
|
|
1087
|
+
);
|
|
1088
|
+
useEffect(() => {
|
|
1089
|
+
getThemeConfig();
|
|
1090
|
+
}, [getThemeConfig]);
|
|
1091
|
+
return /* @__PURE__ */ jsx(
|
|
1092
|
+
HomeConfigContext.Provider,
|
|
1093
|
+
{
|
|
1094
|
+
value: {
|
|
1095
|
+
selectedConfig,
|
|
1096
|
+
setSelectedConfig,
|
|
1097
|
+
addConfig,
|
|
1098
|
+
updateConfig,
|
|
1099
|
+
removeConfig,
|
|
1100
|
+
moveConfig,
|
|
1101
|
+
themeConfigData,
|
|
1102
|
+
loading
|
|
1103
|
+
},
|
|
1104
|
+
children: props.children
|
|
1105
|
+
}
|
|
1106
|
+
);
|
|
1107
|
+
};
|
|
1108
|
+
var useHomeConfig = () => useContext(HomeConfigContext);
|
|
1109
|
+
var CustomPageConfigContext = createContext({
|
|
1110
|
+
selectedConfig: [],
|
|
1111
|
+
setSelectedConfig: () => null,
|
|
1112
|
+
addConfig: () => null,
|
|
1113
|
+
updateConfig: () => null,
|
|
1114
|
+
removeConfig: () => null,
|
|
1115
|
+
moveConfig: () => null,
|
|
1116
|
+
loading: true
|
|
1117
|
+
});
|
|
1118
|
+
var CustomPageConfigProvider = (props) => {
|
|
1119
|
+
const { token } = useThemeEdit();
|
|
1120
|
+
const [selectedConfig, setSelectedConfig] = useState([]);
|
|
1121
|
+
const [loading, setLoading] = useState(true);
|
|
1122
|
+
const updateRef = useRef(false);
|
|
1123
|
+
const load = useCallback(async () => {
|
|
1124
|
+
setLoading(true);
|
|
1125
|
+
try {
|
|
1126
|
+
const row = await getCustomPageContent(props.pageId, token);
|
|
1127
|
+
const data = row?.content;
|
|
1128
|
+
setSelectedConfig(Array.isArray(data) ? data.filter((x) => x != null) : []);
|
|
1129
|
+
} catch (e) {
|
|
1130
|
+
console.error("Error loading custom page content:", e);
|
|
1131
|
+
} finally {
|
|
1132
|
+
setLoading(false);
|
|
1133
|
+
}
|
|
1134
|
+
}, [props.pageId, token]);
|
|
1135
|
+
const persist = useCallback(
|
|
1136
|
+
async (configToSave) => {
|
|
1137
|
+
try {
|
|
1138
|
+
if (updateRef.current) return;
|
|
1139
|
+
updateRef.current = true;
|
|
1140
|
+
await updateCustomPageContent(props.pageId, configToSave, token);
|
|
1141
|
+
await load();
|
|
1142
|
+
} catch (e) {
|
|
1143
|
+
console.error("Error saving custom page content:", e);
|
|
1144
|
+
} finally {
|
|
1145
|
+
updateRef.current = false;
|
|
1146
|
+
}
|
|
1147
|
+
},
|
|
1148
|
+
[props.pageId, token, load]
|
|
1149
|
+
);
|
|
1150
|
+
const addConfig = useCallback(
|
|
1151
|
+
async (config) => {
|
|
1152
|
+
setSelectedConfig((prev) => {
|
|
1153
|
+
const next = [...prev, config];
|
|
1154
|
+
persist(next);
|
|
1155
|
+
return next;
|
|
1156
|
+
});
|
|
1157
|
+
},
|
|
1158
|
+
[persist]
|
|
1159
|
+
);
|
|
1160
|
+
const updateConfig = useCallback(
|
|
1161
|
+
async (config, index) => {
|
|
1162
|
+
setSelectedConfig((prev) => {
|
|
1163
|
+
const next = [...prev];
|
|
1164
|
+
next[index] = config;
|
|
1165
|
+
persist(next);
|
|
1166
|
+
return next;
|
|
1167
|
+
});
|
|
1168
|
+
},
|
|
1169
|
+
[persist]
|
|
1170
|
+
);
|
|
1171
|
+
const moveConfig = useCallback(
|
|
1172
|
+
(fromIndex, toIndex) => {
|
|
1173
|
+
setSelectedConfig((prev) => {
|
|
1174
|
+
const next = [...prev];
|
|
1175
|
+
const [moved] = next.splice(fromIndex, 1);
|
|
1176
|
+
next.splice(toIndex, 0, moved);
|
|
1177
|
+
persist(next);
|
|
1178
|
+
return next;
|
|
1179
|
+
});
|
|
1180
|
+
},
|
|
1181
|
+
[persist]
|
|
1182
|
+
);
|
|
1183
|
+
const removeConfig = useCallback(
|
|
1184
|
+
async (index) => {
|
|
1185
|
+
setSelectedConfig((prev) => {
|
|
1186
|
+
const next = prev.filter((_2, i) => i !== index);
|
|
1187
|
+
persist(next);
|
|
1188
|
+
return next;
|
|
1189
|
+
});
|
|
1190
|
+
},
|
|
1191
|
+
[persist]
|
|
1192
|
+
);
|
|
1193
|
+
useEffect(() => {
|
|
1194
|
+
load();
|
|
1195
|
+
}, [load]);
|
|
1196
|
+
return /* @__PURE__ */ jsx(
|
|
1197
|
+
CustomPageConfigContext.Provider,
|
|
1198
|
+
{
|
|
1199
|
+
value: {
|
|
1200
|
+
selectedConfig,
|
|
1201
|
+
setSelectedConfig,
|
|
1202
|
+
addConfig,
|
|
1203
|
+
updateConfig,
|
|
1204
|
+
removeConfig,
|
|
1205
|
+
moveConfig,
|
|
1206
|
+
loading
|
|
1207
|
+
},
|
|
1208
|
+
children: props.children
|
|
1209
|
+
}
|
|
1210
|
+
);
|
|
1211
|
+
};
|
|
1212
|
+
var useCustomPageConfig = () => useContext(CustomPageConfigContext);
|
|
1213
|
+
var WishlistContext = createContext({
|
|
1214
|
+
wishlistItems: [],
|
|
1215
|
+
addToWishlist: () => null,
|
|
1216
|
+
deleteWishlistItem: () => {
|
|
1217
|
+
},
|
|
1218
|
+
moveToCart: () => {
|
|
1219
|
+
},
|
|
1220
|
+
fetchWishlistLoading: false,
|
|
1221
|
+
addToWishlistLoading: false,
|
|
1222
|
+
moveToCartLoading: false
|
|
1223
|
+
});
|
|
1224
|
+
var WishlistProvider = (props) => {
|
|
1225
|
+
const [wishlistItems, setWishlistItems] = useState([]);
|
|
1226
|
+
const { user } = useAuth();
|
|
1227
|
+
const [fetchWishlistLoading, setFetchWishlistLoading] = useState(true);
|
|
1228
|
+
const [addToWishlistLoading, setAddToWishlistLoading] = useState(false);
|
|
1229
|
+
const [moveToCartLoading, setMoveToCartLoading] = useState(false);
|
|
1230
|
+
const { addToCart } = useCart();
|
|
1231
|
+
const { refreshType, setRefreshType } = useCartWishlistRefresh();
|
|
1232
|
+
useEffect(() => {
|
|
1233
|
+
if (refreshType == "wishlist") {
|
|
1234
|
+
fetchWishlistDetail();
|
|
1235
|
+
setRefreshType(null);
|
|
1236
|
+
}
|
|
1237
|
+
}, [refreshType]);
|
|
1238
|
+
const fetchWishlistDetail = async () => {
|
|
1239
|
+
if (!!user) {
|
|
1240
|
+
setFetchWishlistLoading(true);
|
|
1241
|
+
try {
|
|
1242
|
+
const response = await api.getWishlist();
|
|
1243
|
+
console.log("fetchWishlistDetail response:", response);
|
|
1244
|
+
setWishlistItems(response);
|
|
1245
|
+
return response;
|
|
1246
|
+
} catch (error) {
|
|
1247
|
+
console.error("Error fetching wishlist details:", error);
|
|
1248
|
+
return null;
|
|
1249
|
+
} finally {
|
|
1250
|
+
setFetchWishlistLoading(false);
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
};
|
|
1254
|
+
useEffect(() => {
|
|
1255
|
+
user && user.is_active && fetchWishlistDetail();
|
|
1256
|
+
}, [user]);
|
|
1257
|
+
const addToWishlist = async (sku) => {
|
|
1258
|
+
try {
|
|
1259
|
+
setAddToWishlistLoading(true);
|
|
1260
|
+
let body = {
|
|
1261
|
+
sku
|
|
1262
|
+
};
|
|
1263
|
+
await api.addProductToWishlist(body);
|
|
1264
|
+
console.log("New item added to Wishlist");
|
|
1265
|
+
toast.success("Item added to wishlist");
|
|
1266
|
+
fetchWishlistDetail();
|
|
1267
|
+
} catch (error) {
|
|
1268
|
+
console.log("error==", error);
|
|
1269
|
+
const errorMessage = error?.response?.data?.message || error?.response?.message || "Something went wrong! Please try again.";
|
|
1270
|
+
toast.error(errorMessage);
|
|
1271
|
+
} finally {
|
|
1272
|
+
setAddToWishlistLoading(false);
|
|
1273
|
+
}
|
|
1274
|
+
};
|
|
1275
|
+
const deleteWishlistItem = async (id) => {
|
|
1276
|
+
try {
|
|
1277
|
+
setFetchWishlistLoading(true);
|
|
1278
|
+
const response = await api.deleteWishlist(id);
|
|
1279
|
+
console.log("Item deleted:", response);
|
|
1280
|
+
setWishlistItems((prevItems) => prevItems.filter((item) => item.id !== id));
|
|
1281
|
+
toast.success("Item removed from wishlist");
|
|
1282
|
+
await fetchWishlistDetail();
|
|
1283
|
+
} catch (error) {
|
|
1284
|
+
console.log("Error deleting item:", error);
|
|
1285
|
+
toast.error("Failed to remove item from wishlist");
|
|
1286
|
+
} finally {
|
|
1287
|
+
setFetchWishlistLoading(false);
|
|
1288
|
+
}
|
|
1289
|
+
};
|
|
1290
|
+
const moveToCart = async (id, quantity) => {
|
|
1291
|
+
let isItemInWishlist = wishlistItems?.find((item) => item.id === id);
|
|
1292
|
+
if (!isItemInWishlist) {
|
|
1293
|
+
console.log("Item not found in wishlist.");
|
|
1294
|
+
toast.warning("Item not found in wishlist");
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
try {
|
|
1298
|
+
setMoveToCartLoading(true);
|
|
1299
|
+
addToCart(isItemInWishlist.sku.id, quantity);
|
|
1300
|
+
await api.deleteWishlist(isItemInWishlist.id);
|
|
1301
|
+
setWishlistItems(wishlistItems?.filter((item) => item.id !== isItemInWishlist.id));
|
|
1302
|
+
setRefreshType("cart");
|
|
1303
|
+
} catch (error) {
|
|
1304
|
+
console.log("Error moving item to cart:", error);
|
|
1305
|
+
const errorMessage = error?.response?.data?.message || error?.response?.message || error?.message || "";
|
|
1306
|
+
const errorMsg = errorMessage || "Failed to move item to cart";
|
|
1307
|
+
toast.error(errorMsg);
|
|
1308
|
+
} finally {
|
|
1309
|
+
setMoveToCartLoading(false);
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1312
|
+
return /* @__PURE__ */ jsx(WishlistContext.Provider, { value: { wishlistItems, addToWishlist, deleteWishlistItem, moveToCart, fetchWishlistLoading, addToWishlistLoading, moveToCartLoading }, children: props.children });
|
|
1313
|
+
};
|
|
1314
|
+
var useWishlist = () => useContext(WishlistContext);
|
|
1315
|
+
var ModalContext = createContext(void 0);
|
|
1316
|
+
var ModalProvider = ({ children }) => {
|
|
1317
|
+
const [openModal, setOpenModal] = useState("");
|
|
1318
|
+
const [userData, setUserData] = useState({});
|
|
1319
|
+
const showModal = (modal) => setOpenModal(modal);
|
|
1320
|
+
const closeModal = () => setOpenModal("");
|
|
1321
|
+
const clearUserData = () => setUserData({});
|
|
1322
|
+
return /* @__PURE__ */ jsx(
|
|
1323
|
+
ModalContext.Provider,
|
|
1324
|
+
{
|
|
1325
|
+
value: {
|
|
1326
|
+
openModal,
|
|
1327
|
+
showModal,
|
|
1328
|
+
closeModal,
|
|
1329
|
+
userData,
|
|
1330
|
+
setUserData,
|
|
1331
|
+
clearUserData
|
|
1332
|
+
},
|
|
1333
|
+
children
|
|
1334
|
+
}
|
|
1335
|
+
);
|
|
1336
|
+
};
|
|
1337
|
+
var useModal = () => {
|
|
1338
|
+
const context = useContext(ModalContext);
|
|
1339
|
+
if (!context) {
|
|
1340
|
+
throw new Error("useModal must be used within a ModalProvider");
|
|
1341
|
+
}
|
|
1342
|
+
return context;
|
|
1343
|
+
};
|
|
1344
|
+
var HomeConfigHeroSliderContext = createContext({
|
|
1345
|
+
loading: true,
|
|
1346
|
+
heroSliderConfigData: [],
|
|
1347
|
+
onUpdateHeroSlider: () => null
|
|
1348
|
+
});
|
|
1349
|
+
var HomeConfigHeroSliderProvider = (props) => {
|
|
1350
|
+
const [loading, setLoading] = useState(true);
|
|
1351
|
+
const [heroSliderConfigData, setHeroSliderConfigData] = useState([]);
|
|
1352
|
+
const { token } = useThemeEdit();
|
|
1353
|
+
const themeConfig = useContext(BusinessConfigContext);
|
|
1354
|
+
const getHeroSliderConfig = async () => {
|
|
1355
|
+
setLoading(true);
|
|
1356
|
+
try {
|
|
1357
|
+
const response = await retrieveThemeContent(
|
|
1358
|
+
themeConfig.theme.id,
|
|
1359
|
+
"hero_slider"
|
|
1360
|
+
);
|
|
1361
|
+
setHeroSliderConfigData(response.data);
|
|
1362
|
+
} finally {
|
|
1363
|
+
setLoading(false);
|
|
1364
|
+
}
|
|
1365
|
+
};
|
|
1366
|
+
useEffect(() => {
|
|
1367
|
+
getHeroSliderConfig();
|
|
1368
|
+
}, []);
|
|
1369
|
+
const onUpdateHeroSlider = async (configToUpdate) => {
|
|
1370
|
+
setLoading(true);
|
|
1371
|
+
try {
|
|
1372
|
+
const body = {
|
|
1373
|
+
data: configToUpdate,
|
|
1374
|
+
slug: "hero_slider",
|
|
1375
|
+
platform: typeof window !== "undefined" ? "website" : "app"
|
|
1376
|
+
};
|
|
1377
|
+
await updateThemeContent(
|
|
1378
|
+
body,
|
|
1379
|
+
themeConfig?.theme?.id,
|
|
1380
|
+
"hero_slider",
|
|
1381
|
+
token
|
|
1382
|
+
);
|
|
1383
|
+
const updatedResponse = await retrieveThemeContent(
|
|
1384
|
+
themeConfig.theme.id,
|
|
1385
|
+
"hero_slider"
|
|
1386
|
+
);
|
|
1387
|
+
setHeroSliderConfigData(updatedResponse.data);
|
|
1388
|
+
} catch (error) {
|
|
1389
|
+
console.error("Error updating theme content:", error);
|
|
1390
|
+
} finally {
|
|
1391
|
+
setLoading(false);
|
|
1392
|
+
}
|
|
1393
|
+
};
|
|
1394
|
+
return /* @__PURE__ */ jsx(
|
|
1395
|
+
HomeConfigHeroSliderContext.Provider,
|
|
1396
|
+
{
|
|
1397
|
+
value: { loading, heroSliderConfigData, onUpdateHeroSlider },
|
|
1398
|
+
children: props.children
|
|
1399
|
+
}
|
|
1400
|
+
);
|
|
1401
|
+
};
|
|
1402
|
+
var useHomeConfigHeroSlider = () => useContext(HomeConfigHeroSliderContext);
|
|
1403
|
+
var HeaderFooterContext = createContext({
|
|
1404
|
+
headerConfig: {},
|
|
1405
|
+
footerConfig: {},
|
|
1406
|
+
onUpdateThemeContent: () => Promise.resolve(),
|
|
1407
|
+
loading: false,
|
|
1408
|
+
announcementConfig: {}
|
|
1409
|
+
});
|
|
1410
|
+
var HeaderFooterProvider = (props) => {
|
|
1411
|
+
const [headerConfig, setHeaderConfig] = useState({});
|
|
1412
|
+
const [footerConfig, setFooterConfig] = useState({});
|
|
1413
|
+
const [announcementConfig, setAnnouncementConfig] = useState({});
|
|
1414
|
+
const { token } = useThemeEdit();
|
|
1415
|
+
const themeConfig = useBusiness();
|
|
1416
|
+
const [loading, setLoading] = useState(true);
|
|
1417
|
+
const getThemeConfig = useCallback(async () => {
|
|
1418
|
+
setLoading(true);
|
|
1419
|
+
try {
|
|
1420
|
+
const response = await api.retrieveThemeContent(
|
|
1421
|
+
themeConfig.theme.id,
|
|
1422
|
+
props.page
|
|
1423
|
+
);
|
|
1424
|
+
response.slug === "header" && setHeaderConfig(response.data);
|
|
1425
|
+
response.slug === "footer" && setFooterConfig(response.data);
|
|
1426
|
+
response.slug === "announcement" && setAnnouncementConfig(response.data);
|
|
1427
|
+
} catch (error) {
|
|
1428
|
+
console.error("Error fetching theme content:", error);
|
|
1429
|
+
} finally {
|
|
1430
|
+
setLoading(false);
|
|
1431
|
+
}
|
|
1432
|
+
}, [themeConfig.theme.id]);
|
|
1433
|
+
const onUpdateThemeContent = useCallback(
|
|
1434
|
+
async (configToUpdate) => {
|
|
1435
|
+
try {
|
|
1436
|
+
const body = {
|
|
1437
|
+
data: configToUpdate,
|
|
1438
|
+
slug: props.page,
|
|
1439
|
+
platform: typeof window !== "undefined" ? "website" : "app"
|
|
1440
|
+
};
|
|
1441
|
+
await api.updateThemeContent(
|
|
1442
|
+
body,
|
|
1443
|
+
themeConfig.theme.id,
|
|
1444
|
+
props.page,
|
|
1445
|
+
token
|
|
1446
|
+
);
|
|
1447
|
+
const updatedResponse = await api.retrieveThemeContent(
|
|
1448
|
+
themeConfig.theme.id,
|
|
1449
|
+
props.page
|
|
1450
|
+
);
|
|
1451
|
+
updatedResponse.slug === "header" && setHeaderConfig(updatedResponse.data);
|
|
1452
|
+
updatedResponse.slug === "footer" && setFooterConfig(updatedResponse.data);
|
|
1453
|
+
updatedResponse.slug === "announcement" && setAnnouncementConfig(updatedResponse.data);
|
|
1454
|
+
} catch (error) {
|
|
1455
|
+
console.error("Error updating theme content:", error);
|
|
1456
|
+
} finally {
|
|
1457
|
+
setLoading(false);
|
|
1458
|
+
}
|
|
1459
|
+
},
|
|
1460
|
+
[props.page]
|
|
1461
|
+
);
|
|
1462
|
+
useEffect(() => {
|
|
1463
|
+
getThemeConfig();
|
|
1464
|
+
}, [getThemeConfig]);
|
|
1465
|
+
return /* @__PURE__ */ jsx(
|
|
1466
|
+
HeaderFooterContext.Provider,
|
|
1467
|
+
{
|
|
1468
|
+
value: { headerConfig, footerConfig, onUpdateThemeContent, loading, announcementConfig },
|
|
1469
|
+
children: loading ? null : props.children
|
|
1470
|
+
}
|
|
1471
|
+
);
|
|
1472
|
+
};
|
|
1473
|
+
var useHeaderFooter = () => {
|
|
1474
|
+
return useContext(HeaderFooterContext);
|
|
1475
|
+
};
|
|
1476
|
+
var MenuFilterContext = createContext({
|
|
1477
|
+
menuList: [],
|
|
1478
|
+
categoryList: [],
|
|
1479
|
+
selectedCategoryId: [],
|
|
1480
|
+
addCategoryFilterId: () => null,
|
|
1481
|
+
removeCategoryFilterId: () => null,
|
|
1482
|
+
menuLoading: true,
|
|
1483
|
+
categoryLoading: true,
|
|
1484
|
+
isInitialLoad: true,
|
|
1485
|
+
currentPage: 1,
|
|
1486
|
+
totalPages: 1,
|
|
1487
|
+
handlePageChange: () => null,
|
|
1488
|
+
setMenuList: () => null,
|
|
1489
|
+
selectedSortOption: "newest_first",
|
|
1490
|
+
setSelectedSortOption: () => null,
|
|
1491
|
+
selectedMinPrice: void 0,
|
|
1492
|
+
selectedMaxPrice: void 0,
|
|
1493
|
+
setSelectedMinPrice: () => null,
|
|
1494
|
+
setSelectedMaxPrice: () => null,
|
|
1495
|
+
searchQuery: "",
|
|
1496
|
+
setSearchQuery: () => null,
|
|
1497
|
+
selectedFoodType: "",
|
|
1498
|
+
setSelectedFoodType: () => null
|
|
1499
|
+
});
|
|
1500
|
+
var MenuFilterProvider = (props) => {
|
|
1501
|
+
const [menuList, setMenuList] = useState([]);
|
|
1502
|
+
const [categoryList, setCategoryList] = useState([]);
|
|
1503
|
+
const [selectedCategoryId, setSelectedCategoryId] = useState([]);
|
|
1504
|
+
const [selectedSortOption, setSelectedSortOption] = useState("newest_first");
|
|
1505
|
+
const [selectedMinPrice, setSelectedMinPrice] = useState();
|
|
1506
|
+
const [selectedMaxPrice, setSelectedMaxPrice] = useState();
|
|
1507
|
+
const [menuLoading, setMenuLoading] = useState(true);
|
|
1508
|
+
const [categoryLoading, setCategoryLoading] = useState(true);
|
|
1509
|
+
const [isInitialLoad, setIsInitialLoad] = useState(true);
|
|
1510
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
1511
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
1512
|
+
const [debouncedSearchQuery, setDebouncedSearchQuery] = useState("");
|
|
1513
|
+
const [selectedFoodType, setSelectedFoodType] = useState("");
|
|
1514
|
+
const limit = 12;
|
|
1515
|
+
const [totalCount, setTotalCount] = useState(0);
|
|
1516
|
+
const totalPages = Math.ceil(totalCount / limit);
|
|
1517
|
+
const searchTimeoutRef = useRef(null);
|
|
1518
|
+
const fetchCategoryList = async () => {
|
|
1519
|
+
setCategoryLoading(true);
|
|
1520
|
+
try {
|
|
1521
|
+
const response = await api.getMenuCategories();
|
|
1522
|
+
setCategoryList(response.data || response);
|
|
1523
|
+
} catch (error) {
|
|
1524
|
+
console.log("Error fetching categories:", error);
|
|
1525
|
+
} finally {
|
|
1526
|
+
setCategoryLoading(false);
|
|
1527
|
+
}
|
|
1528
|
+
};
|
|
1529
|
+
const fetchMenuList = async () => {
|
|
1530
|
+
setMenuLoading(true);
|
|
1531
|
+
try {
|
|
1532
|
+
let body = {
|
|
1533
|
+
limit,
|
|
1534
|
+
offset: (currentPage - 1) * limit
|
|
1535
|
+
};
|
|
1536
|
+
if (selectedCategoryId.length > 0) {
|
|
1537
|
+
body.category_ids = selectedCategoryId.join(",");
|
|
1538
|
+
}
|
|
1539
|
+
if (selectedFoodType) {
|
|
1540
|
+
body.food_type = selectedFoodType;
|
|
1541
|
+
}
|
|
1542
|
+
if (debouncedSearchQuery.trim()) {
|
|
1543
|
+
body.search = debouncedSearchQuery;
|
|
1544
|
+
}
|
|
1545
|
+
const response = await api.getMenuList(body);
|
|
1546
|
+
let filteredMenus = response.data || response;
|
|
1547
|
+
if (filteredMenus && typeof filteredMenus === "object" && !Array.isArray(filteredMenus)) {
|
|
1548
|
+
filteredMenus = filteredMenus.results || filteredMenus.data || filteredMenus.items || [];
|
|
1549
|
+
}
|
|
1550
|
+
if (!Array.isArray(filteredMenus)) {
|
|
1551
|
+
filteredMenus = [];
|
|
1552
|
+
}
|
|
1553
|
+
setMenuList(filteredMenus);
|
|
1554
|
+
setTotalCount(filteredMenus.length);
|
|
1555
|
+
} catch (error) {
|
|
1556
|
+
console.log("Error fetching menus:", error);
|
|
1557
|
+
} finally {
|
|
1558
|
+
setMenuLoading(false);
|
|
1559
|
+
if (isInitialLoad) {
|
|
1560
|
+
setIsInitialLoad(false);
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
};
|
|
1564
|
+
const addCategoryFilterId = (id) => {
|
|
1565
|
+
setSelectedCategoryId((prevIds) => {
|
|
1566
|
+
if (prevIds.includes(id)) {
|
|
1567
|
+
return prevIds;
|
|
1568
|
+
}
|
|
1569
|
+
return [...prevIds, id];
|
|
1570
|
+
});
|
|
1571
|
+
setCurrentPage(1);
|
|
1572
|
+
};
|
|
1573
|
+
const removeCategoryFilterId = (id) => {
|
|
1574
|
+
setSelectedCategoryId((x) => {
|
|
1575
|
+
return x.filter((o) => o !== id);
|
|
1576
|
+
});
|
|
1577
|
+
setCurrentPage(1);
|
|
1578
|
+
};
|
|
1579
|
+
const handlePageChange = (page) => {
|
|
1580
|
+
setCurrentPage(page);
|
|
1581
|
+
};
|
|
1582
|
+
useEffect(() => {
|
|
1583
|
+
if (searchTimeoutRef.current) {
|
|
1584
|
+
clearTimeout(searchTimeoutRef.current);
|
|
1585
|
+
}
|
|
1586
|
+
searchTimeoutRef.current = setTimeout(() => {
|
|
1587
|
+
setDebouncedSearchQuery(searchQuery);
|
|
1588
|
+
}, 1e3);
|
|
1589
|
+
return () => {
|
|
1590
|
+
if (searchTimeoutRef.current) {
|
|
1591
|
+
clearTimeout(searchTimeoutRef.current);
|
|
1592
|
+
}
|
|
1593
|
+
};
|
|
1594
|
+
}, [searchQuery]);
|
|
1595
|
+
useEffect(() => {
|
|
1596
|
+
fetchCategoryList();
|
|
1597
|
+
}, []);
|
|
1598
|
+
useEffect(() => {
|
|
1599
|
+
fetchMenuList();
|
|
1600
|
+
}, [
|
|
1601
|
+
selectedCategoryId,
|
|
1602
|
+
currentPage,
|
|
1603
|
+
selectedSortOption,
|
|
1604
|
+
selectedMinPrice,
|
|
1605
|
+
selectedMaxPrice,
|
|
1606
|
+
debouncedSearchQuery,
|
|
1607
|
+
selectedFoodType
|
|
1608
|
+
]);
|
|
1609
|
+
return /* @__PURE__ */ jsx(
|
|
1610
|
+
MenuFilterContext.Provider,
|
|
1611
|
+
{
|
|
1612
|
+
value: {
|
|
1613
|
+
menuList,
|
|
1614
|
+
categoryList,
|
|
1615
|
+
selectedCategoryId,
|
|
1616
|
+
addCategoryFilterId,
|
|
1617
|
+
removeCategoryFilterId,
|
|
1618
|
+
menuLoading,
|
|
1619
|
+
categoryLoading,
|
|
1620
|
+
isInitialLoad,
|
|
1621
|
+
currentPage,
|
|
1622
|
+
totalPages,
|
|
1623
|
+
handlePageChange,
|
|
1624
|
+
setMenuList,
|
|
1625
|
+
selectedSortOption,
|
|
1626
|
+
setSelectedSortOption,
|
|
1627
|
+
selectedMinPrice,
|
|
1628
|
+
selectedMaxPrice,
|
|
1629
|
+
setSelectedMinPrice,
|
|
1630
|
+
setSelectedMaxPrice,
|
|
1631
|
+
searchQuery,
|
|
1632
|
+
setSearchQuery,
|
|
1633
|
+
selectedFoodType,
|
|
1634
|
+
setSelectedFoodType
|
|
1635
|
+
},
|
|
1636
|
+
children: props.children
|
|
1637
|
+
}
|
|
1638
|
+
);
|
|
1639
|
+
};
|
|
1640
|
+
var useMenuFilter = () => useContext(MenuFilterContext);
|
|
1641
|
+
var MenuCartContext = createContext({
|
|
1642
|
+
menuCartItems: [],
|
|
1643
|
+
cartLength: 0,
|
|
1644
|
+
cartType: "delivery",
|
|
1645
|
+
session: null,
|
|
1646
|
+
errorMessage: null,
|
|
1647
|
+
menuCartLoading: false,
|
|
1648
|
+
promoCodeLoading: false,
|
|
1649
|
+
updateOrderType: () => {
|
|
1650
|
+
},
|
|
1651
|
+
addMenuToCart: async () => {
|
|
1652
|
+
},
|
|
1653
|
+
updateMenuCartItem: async () => {
|
|
1654
|
+
},
|
|
1655
|
+
deleteMenuCartItem: async () => {
|
|
1656
|
+
},
|
|
1657
|
+
updateMenuCartPromoCode: async () => {
|
|
1658
|
+
},
|
|
1659
|
+
updateMenuCartAddress: async () => {
|
|
1660
|
+
},
|
|
1661
|
+
getMenuOrderCharge: async () => {
|
|
1662
|
+
},
|
|
1663
|
+
clearMenuCart: () => {
|
|
1664
|
+
}
|
|
1665
|
+
});
|
|
1666
|
+
var MenuCartProvider = (props) => {
|
|
1667
|
+
const [menuCartItems, setMenuCartItems] = useState([]);
|
|
1668
|
+
const [cartLength, setCartLength] = useState(0);
|
|
1669
|
+
const [cartType, setCartTypeState] = useState("delivery");
|
|
1670
|
+
const [session, setSession] = useState(null);
|
|
1671
|
+
const [errorMessage, setErrorMessage] = useState(null);
|
|
1672
|
+
const [menuCartLoading, setMenuCartLoading] = useState(false);
|
|
1673
|
+
const [promoCodeLoading, setPromoCodeLoading] = useState(false);
|
|
1674
|
+
const { user } = useAuth();
|
|
1675
|
+
const storage = useStorage();
|
|
1676
|
+
const fetchMenuCartDetail = async () => {
|
|
1677
|
+
setMenuCartLoading(true);
|
|
1678
|
+
try {
|
|
1679
|
+
const response = await api.getMenuCartDetail();
|
|
1680
|
+
setMenuCartItems(response?.items || response?.products || []);
|
|
1681
|
+
setCartLength(response?.items?.length || response?.products?.length || 0);
|
|
1682
|
+
setCartTypeState(response?.type || "delivery");
|
|
1683
|
+
setSession(response);
|
|
1684
|
+
} catch (error) {
|
|
1685
|
+
console.error("Error fetching menu cart:", error);
|
|
1686
|
+
setMenuCartItems([]);
|
|
1687
|
+
setCartLength(0);
|
|
1688
|
+
} finally {
|
|
1689
|
+
setMenuCartLoading(false);
|
|
1690
|
+
}
|
|
1691
|
+
};
|
|
1692
|
+
useEffect(() => {
|
|
1693
|
+
fetchMenuCartDetail();
|
|
1694
|
+
}, [user]);
|
|
1695
|
+
useEffect(() => {
|
|
1696
|
+
setCartLength(menuCartItems.length);
|
|
1697
|
+
}, [menuCartItems]);
|
|
1698
|
+
useEffect(() => {
|
|
1699
|
+
session && storage.setItem("menuCart", JSON.stringify(session), "local");
|
|
1700
|
+
}, [session, storage]);
|
|
1701
|
+
const updateOrderType = async (params) => {
|
|
1702
|
+
setMenuCartLoading(true);
|
|
1703
|
+
try {
|
|
1704
|
+
const { type, pickup_time, table_no, shipping_address } = params;
|
|
1705
|
+
const body = { type };
|
|
1706
|
+
if (type === "pickup" && pickup_time) {
|
|
1707
|
+
body.pickup_time = pickup_time;
|
|
1708
|
+
}
|
|
1709
|
+
if (type === "self_dinein" && table_no) {
|
|
1710
|
+
body.table_no = table_no;
|
|
1711
|
+
}
|
|
1712
|
+
if (type === "delivery" && user && shipping_address) {
|
|
1713
|
+
body.shipping_address = shipping_address;
|
|
1714
|
+
}
|
|
1715
|
+
await api.updateMenuCartType(body);
|
|
1716
|
+
setCartTypeState(type);
|
|
1717
|
+
fetchMenuCartDetail();
|
|
1718
|
+
} catch (error) {
|
|
1719
|
+
console.error("Failed to update cart type:", error);
|
|
1720
|
+
} finally {
|
|
1721
|
+
setMenuCartLoading(false);
|
|
1722
|
+
}
|
|
1723
|
+
};
|
|
1724
|
+
const updateMenuCartPromoCode = async (promoCode) => {
|
|
1725
|
+
let body = {
|
|
1726
|
+
promo_code: promoCode
|
|
1727
|
+
};
|
|
1728
|
+
setPromoCodeLoading(true);
|
|
1729
|
+
setErrorMessage(null);
|
|
1730
|
+
try {
|
|
1731
|
+
if (session) {
|
|
1732
|
+
const response = await api.updateMenuCartPromoCode(body);
|
|
1733
|
+
setSession({
|
|
1734
|
+
...session,
|
|
1735
|
+
promo: response.promo,
|
|
1736
|
+
promo_redeem_amount: Number(response.promo_redeem_amount),
|
|
1737
|
+
final_payable_amount: Number(response.final_payable_amount)
|
|
1738
|
+
});
|
|
1739
|
+
await fetchMenuCartDetail();
|
|
1740
|
+
}
|
|
1741
|
+
} catch (error) {
|
|
1742
|
+
setErrorMessage(error?.response?.data?.error || error?.message || "Failed to apply promo code");
|
|
1743
|
+
console.error("Failed to update promo code:", error);
|
|
1744
|
+
} finally {
|
|
1745
|
+
setPromoCodeLoading(false);
|
|
1746
|
+
}
|
|
1747
|
+
};
|
|
1748
|
+
const updateMenuCartAddress = async (shippingAddress) => {
|
|
1749
|
+
setMenuCartLoading(true);
|
|
1750
|
+
setErrorMessage(null);
|
|
1751
|
+
try {
|
|
1752
|
+
const body = {
|
|
1753
|
+
shipping_address: shippingAddress
|
|
1754
|
+
};
|
|
1755
|
+
const response = await api.updateMenuOrderCartAddress(body);
|
|
1756
|
+
setSession({
|
|
1757
|
+
...session,
|
|
1758
|
+
shipping_address: response.shipping_address
|
|
1759
|
+
});
|
|
1760
|
+
await fetchMenuCartDetail();
|
|
1761
|
+
} catch (error) {
|
|
1762
|
+
setErrorMessage(error?.response?.data?.error || error?.message || "Failed to update address");
|
|
1763
|
+
console.error("Failed to update menu cart address:", error);
|
|
1764
|
+
} finally {
|
|
1765
|
+
setMenuCartLoading(false);
|
|
1766
|
+
}
|
|
1767
|
+
};
|
|
1768
|
+
const getMenuOrderCharge = async (orderId, body) => {
|
|
1769
|
+
setMenuCartLoading(true);
|
|
1770
|
+
setErrorMessage(null);
|
|
1771
|
+
try {
|
|
1772
|
+
const response = await api.getMenuOrderCharge(orderId, body);
|
|
1773
|
+
return response;
|
|
1774
|
+
} catch (error) {
|
|
1775
|
+
setErrorMessage(error?.response?.data?.error || error?.message || "Failed to get order charge");
|
|
1776
|
+
console.error("Failed to get menu order charge:", error);
|
|
1777
|
+
} finally {
|
|
1778
|
+
setMenuCartLoading(false);
|
|
1779
|
+
}
|
|
1780
|
+
};
|
|
1781
|
+
const addMenuToCart = async (itemId, quantity, customizeOptions) => {
|
|
1782
|
+
setMenuCartLoading(true);
|
|
1783
|
+
try {
|
|
1784
|
+
const body = {
|
|
1785
|
+
item: itemId,
|
|
1786
|
+
qty: quantity,
|
|
1787
|
+
customize_option: customizeOptions || []
|
|
1788
|
+
};
|
|
1789
|
+
await api.addMenuToCart(body);
|
|
1790
|
+
await fetchMenuCartDetail();
|
|
1791
|
+
} catch (error) {
|
|
1792
|
+
console.error("Failed to add menu item to cart:", error);
|
|
1793
|
+
throw error;
|
|
1794
|
+
} finally {
|
|
1795
|
+
setMenuCartLoading(false);
|
|
1796
|
+
}
|
|
1797
|
+
};
|
|
1798
|
+
const updateMenuCartItem = async (id, quantity, customizeOptions) => {
|
|
1799
|
+
setMenuCartLoading(true);
|
|
1800
|
+
try {
|
|
1801
|
+
const body = {
|
|
1802
|
+
qty: quantity,
|
|
1803
|
+
customize_option: customizeOptions || []
|
|
1804
|
+
};
|
|
1805
|
+
await api.updateMenuCartItem(id, body);
|
|
1806
|
+
await fetchMenuCartDetail();
|
|
1807
|
+
} catch (error) {
|
|
1808
|
+
console.error("Failed to update menu cart item:", error);
|
|
1809
|
+
throw error;
|
|
1810
|
+
} finally {
|
|
1811
|
+
setMenuCartLoading(false);
|
|
1812
|
+
}
|
|
1813
|
+
};
|
|
1814
|
+
const deleteMenuCartItem = async (id) => {
|
|
1815
|
+
setMenuCartLoading(true);
|
|
1816
|
+
try {
|
|
1817
|
+
await api.deleteMenuCartItem(id);
|
|
1818
|
+
await fetchMenuCartDetail();
|
|
1819
|
+
} catch (error) {
|
|
1820
|
+
console.error("Failed to delete menu cart item:", error);
|
|
1821
|
+
throw error;
|
|
1822
|
+
} finally {
|
|
1823
|
+
setMenuCartLoading(false);
|
|
1824
|
+
}
|
|
1825
|
+
};
|
|
1826
|
+
const clearMenuCart = () => {
|
|
1827
|
+
setMenuCartItems([]);
|
|
1828
|
+
setSession(null);
|
|
1829
|
+
storage.removeItem("menuCart");
|
|
1830
|
+
fetchMenuCartDetail();
|
|
1831
|
+
};
|
|
1832
|
+
return /* @__PURE__ */ jsx(
|
|
1833
|
+
MenuCartContext.Provider,
|
|
1834
|
+
{
|
|
1835
|
+
value: {
|
|
1836
|
+
menuCartItems,
|
|
1837
|
+
cartLength,
|
|
1838
|
+
cartType,
|
|
1839
|
+
session,
|
|
1840
|
+
errorMessage,
|
|
1841
|
+
menuCartLoading,
|
|
1842
|
+
promoCodeLoading,
|
|
1843
|
+
updateOrderType,
|
|
1844
|
+
addMenuToCart,
|
|
1845
|
+
updateMenuCartItem,
|
|
1846
|
+
deleteMenuCartItem,
|
|
1847
|
+
updateMenuCartPromoCode,
|
|
1848
|
+
updateMenuCartAddress,
|
|
1849
|
+
getMenuOrderCharge,
|
|
1850
|
+
clearMenuCart
|
|
1851
|
+
},
|
|
1852
|
+
children: props.children
|
|
1853
|
+
}
|
|
1854
|
+
);
|
|
1855
|
+
};
|
|
1856
|
+
var useMenuCart = () => useContext(MenuCartContext);
|
|
1857
|
+
var ToastProvider = () => {
|
|
1858
|
+
return /* @__PURE__ */ jsx(
|
|
1859
|
+
ToastContainer,
|
|
1860
|
+
{
|
|
1861
|
+
position: "top-right",
|
|
1862
|
+
autoClose: 3e3,
|
|
1863
|
+
theme: "colored"
|
|
1864
|
+
}
|
|
1865
|
+
);
|
|
1866
|
+
};
|
|
1867
|
+
var REFERRAL_STORAGE_KEY = "referralCode";
|
|
1868
|
+
var ReferralCodeContext = createContext(null);
|
|
1869
|
+
function ReferralCodeProvider({
|
|
1870
|
+
children,
|
|
1871
|
+
referralCodeFromUrl
|
|
1872
|
+
}) {
|
|
1873
|
+
const [referralCode, setReferralCode] = useState(null);
|
|
1874
|
+
useEffect(() => {
|
|
1875
|
+
if (referralCodeFromUrl) {
|
|
1876
|
+
if (typeof window !== "undefined") {
|
|
1877
|
+
sessionStorage.setItem(REFERRAL_STORAGE_KEY, referralCodeFromUrl);
|
|
1878
|
+
}
|
|
1879
|
+
setReferralCode(referralCodeFromUrl);
|
|
1880
|
+
} else if (typeof window !== "undefined") {
|
|
1881
|
+
setReferralCode(sessionStorage.getItem(REFERRAL_STORAGE_KEY));
|
|
1882
|
+
}
|
|
1883
|
+
}, [referralCodeFromUrl]);
|
|
1884
|
+
return /* @__PURE__ */ jsx(ReferralCodeContext.Provider, { value: referralCode, children });
|
|
1885
|
+
}
|
|
1886
|
+
function useReferralCode() {
|
|
1887
|
+
return useContext(ReferralCodeContext);
|
|
1888
|
+
}
|
|
1889
|
+
var LiveSupportWidgetContext = createContext({
|
|
1890
|
+
config: null,
|
|
1891
|
+
loading: true
|
|
1892
|
+
});
|
|
1893
|
+
var LiveSupportWidgetProvider = ({ children }) => {
|
|
1894
|
+
const [config, setConfig] = useState(null);
|
|
1895
|
+
const [loading, setLoading] = useState(true);
|
|
1896
|
+
useEffect(() => {
|
|
1897
|
+
let isMounted = true;
|
|
1898
|
+
(async () => {
|
|
1899
|
+
try {
|
|
1900
|
+
const data = await api.getLiveSupportWidgetConfig();
|
|
1901
|
+
if (isMounted) {
|
|
1902
|
+
setConfig(data);
|
|
1903
|
+
}
|
|
1904
|
+
} catch (e) {
|
|
1905
|
+
if (isMounted) {
|
|
1906
|
+
setConfig(null);
|
|
1907
|
+
}
|
|
1908
|
+
} finally {
|
|
1909
|
+
if (isMounted) {
|
|
1910
|
+
setLoading(false);
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
})();
|
|
1914
|
+
return () => {
|
|
1915
|
+
isMounted = false;
|
|
1916
|
+
};
|
|
1917
|
+
}, []);
|
|
1918
|
+
return /* @__PURE__ */ jsx(LiveSupportWidgetContext.Provider, { value: { config, loading }, children });
|
|
1919
|
+
};
|
|
1920
|
+
var useLiveSupportWidget = () => useContext(LiveSupportWidgetContext);
|
|
1921
|
+
function LiveSupportWidget() {
|
|
1922
|
+
const { config, loading } = useLiveSupportWidget();
|
|
1923
|
+
if (loading || !config?.is_active || config?.type !== "whatsapp" || !config?.whatsapp_no?.trim()) {
|
|
1924
|
+
return null;
|
|
1925
|
+
}
|
|
1926
|
+
const phone = config.whatsapp_no.replace(/\D/g, "");
|
|
1927
|
+
const whatsappUrl = `https://wa.me/${phone}`;
|
|
1928
|
+
const handleClick = () => {
|
|
1929
|
+
window.open(whatsappUrl, "_blank", "noopener,noreferrer");
|
|
1930
|
+
};
|
|
1931
|
+
console.log(config);
|
|
1932
|
+
console.log(loading);
|
|
1933
|
+
return /* @__PURE__ */ jsx(
|
|
1934
|
+
"button",
|
|
1935
|
+
{
|
|
1936
|
+
type: "button",
|
|
1937
|
+
onClick: handleClick,
|
|
1938
|
+
style: {
|
|
1939
|
+
bottom: "15px"
|
|
1940
|
+
},
|
|
1941
|
+
className: "fixed bottom-6 fixed right-6 z-[9999] flex h-14 w-14 items-center justify-center rounded-full bg-[#25D366] text-white shadow-lg transition-transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-[#25D366] focus:ring-offset-2",
|
|
1942
|
+
"aria-label": "Chat on WhatsApp",
|
|
1943
|
+
children: /* @__PURE__ */ jsx(FaWhatsapp, { className: "h-8 w-8" })
|
|
1944
|
+
}
|
|
1945
|
+
);
|
|
1946
|
+
}
|
|
1947
|
+
var BaseProvider = ({
|
|
1948
|
+
children,
|
|
1949
|
+
baseURL,
|
|
1950
|
+
token,
|
|
1951
|
+
isEdit,
|
|
1952
|
+
businessConfig,
|
|
1953
|
+
storage,
|
|
1954
|
+
isHeader,
|
|
1955
|
+
isFooter,
|
|
1956
|
+
isAnnouncementBar,
|
|
1957
|
+
referralCodeFromUrl = null
|
|
1958
|
+
}) => {
|
|
1959
|
+
return /* @__PURE__ */ jsx(StorageProvider, { storage, 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(ThemeProvider, { children: /* @__PURE__ */ jsxs(LiveSupportWidgetProvider, { children: [
|
|
1960
|
+
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 }) }) }),
|
|
1961
|
+
/* @__PURE__ */ jsx(LiveSupportWidget, {})
|
|
1962
|
+
] }) }) }) }) }) }) }) }) }) });
|
|
1963
|
+
};
|
|
1964
|
+
|
|
1965
|
+
export { AuthContext, AuthProvider, BaseProvider, BusinessConfigContext, 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, ThemeContext, ThemeEditContext, ThemeEditProvider, ThemeProvider, ToastProvider, WishlistContext, WishlistProvider, toast, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSlider, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useTheme, useThemeEdit, useWishlist };
|
|
1966
|
+
//# sourceMappingURL=chunk-D52TP6ZA.js.map
|
|
1967
|
+
//# sourceMappingURL=chunk-D52TP6ZA.js.map
|