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