@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.
@@ -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