@growupsell/react-ecommerce-core 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @growupsell/react-ecommerce-core
2
+
3
+ React providers, hooks, and shared runtime helpers used by Growupsell ecommerce apps.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm i @growupsell/react-ecommerce-core @growupsell/api
9
+ ```
10
+
11
+ ## Peer dependencies
12
+
13
+ - `react` `^18`
14
+ - `react-dom` `^18`
15
+
16
+ ## Quick start
17
+
18
+ ```tsx
19
+ import { AuthProvider } from '@growupsell/react-ecommerce-core';
20
+
21
+ export function AppRoot({ children }: { children: React.ReactNode }) {
22
+ return <AuthProvider>{children}</AuthProvider>;
23
+ }
24
+ ```
25
+
26
+ ## Exports
27
+
28
+ - `@growupsell/react-ecommerce-core` - root exports
29
+ - `@growupsell/react-ecommerce-core/provider` - provider-focused entry
30
+ - `@growupsell/react-ecommerce-core/business-config-context` - narrow export for `BusinessConfigContext`
31
+
32
+ ## Notes
33
+
34
+ - This package depends on `@growupsell/api`.
35
+ - `ToastSupportProvider` / `useToastSupport` let cart and wishlist show messages without importing UI. On web, pass `toast` from `@growupsell/react-ecommerce-ui/toast` into `BaseProvider`; on React Native, pass your own implementation or omit (no-ops).
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ // src/provider/BusinessConfigContext.tsx
6
+ var BusinessConfigContext = react.createContext({
7
+ currency: null,
8
+ reward_point_config: null,
9
+ orderConfig: null
10
+ });
11
+
12
+ exports.BusinessConfigContext = BusinessConfigContext;
13
+ //# sourceMappingURL=business-config-context.cjs.map
14
+ //# sourceMappingURL=business-config-context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/BusinessConfigContext.tsx"],"names":["createContext"],"mappings":";;;;;AAGO,IAAM,wBAAwBA,mBAAA,CAIlC;AAAA,EACD,QAAA,EAAU,IAAA;AAAA,EACV,mBAAA,EAAqB,IAAA;AAAA,EACrB,WAAA,EAAa;AACf,CAAC","file":"business-config-context.cjs","sourcesContent":["import { createContext } from 'react';\n\n/** Split out so `@growupsell/react-ecommerce-ui` can consume theme without importing the full provider graph. */\nexport const BusinessConfigContext = createContext<{\n currency: any;\n reward_point_config: any;\n orderConfig: any;\n}>({\n currency: null,\n reward_point_config: null,\n orderConfig: null,\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+
3
+ /** Split out so `@growupsell/react-ecommerce-ui` can consume theme without importing the full provider graph. */
4
+ declare const BusinessConfigContext: React.Context<{
5
+ currency: any;
6
+ reward_point_config: any;
7
+ orderConfig: any;
8
+ }>;
9
+
10
+ export { BusinessConfigContext };
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+
3
+ /** Split out so `@growupsell/react-ecommerce-ui` can consume theme without importing the full provider graph. */
4
+ declare const BusinessConfigContext: React.Context<{
5
+ currency: any;
6
+ reward_point_config: any;
7
+ orderConfig: any;
8
+ }>;
9
+
10
+ export { BusinessConfigContext };
@@ -0,0 +1,3 @@
1
+ export { BusinessConfigContext } from './chunk-SP77KIKJ.js';
2
+ //# sourceMappingURL=business-config-context.js.map
3
+ //# sourceMappingURL=business-config-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"business-config-context.js"}
@@ -0,0 +1,12 @@
1
+ import { createContext } from 'react';
2
+
3
+ // src/provider/BusinessConfigContext.tsx
4
+ var BusinessConfigContext = createContext({
5
+ currency: null,
6
+ reward_point_config: null,
7
+ orderConfig: null
8
+ });
9
+
10
+ export { BusinessConfigContext };
11
+ //# sourceMappingURL=chunk-SP77KIKJ.js.map
12
+ //# sourceMappingURL=chunk-SP77KIKJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/BusinessConfigContext.tsx"],"names":[],"mappings":";;;AAGO,IAAM,wBAAwB,aAAA,CAIlC;AAAA,EACD,QAAA,EAAU,IAAA;AAAA,EACV,mBAAA,EAAqB,IAAA;AAAA,EACrB,WAAA,EAAa;AACf,CAAC","file":"chunk-SP77KIKJ.js","sourcesContent":["import { createContext } from 'react';\n\n/** Split out so `@growupsell/react-ecommerce-ui` can consume theme without importing the full provider graph. */\nexport const BusinessConfigContext = createContext<{\n currency: any;\n reward_point_config: any;\n orderConfig: any;\n}>({\n currency: null,\n reward_point_config: null,\n orderConfig: null,\n});\n"]}
@@ -1,12 +1,10 @@
1
+ import { BusinessConfigContext } from './chunk-SP77KIKJ.js';
1
2
  import { createContext, useState, useContext, useEffect, useMemo, useRef, useCallback } from 'react';
2
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { jsx, Fragment } from 'react/jsx-runtime';
3
4
  import { WAApi, api } from '@growupsell/api';
4
5
  import { retrieveThemeContent, updateThemeContent, getCustomPageContent, updateCustomPageContent, createCustomerSession, getBusinessSetting, getRewardPointBusinessConfig, getOrderBusinessConfig } from '@growupsell/api/api';
5
- import { ToastContainer, toast as toast$1 } from 'react-toastify';
6
6
  import 'lodash';
7
- import { FaWhatsapp } from 'react-icons/fa';
8
7
 
9
- // src/provider/StorageProvider.tsx
10
8
  var StorageContext = createContext({
11
9
  setItem: (key, data, type) => null,
12
10
  getItem: (key) => null,
@@ -154,11 +152,6 @@ var BusinessMediaProvider = (props) => {
154
152
  return /* @__PURE__ */ jsx(BusinessMediaContext.Provider, { value: { businessMedia, updateBusinessMedia }, children: props.children });
155
153
  };
156
154
  var useBusinessMedia = () => useContext(BusinessMediaContext);
157
- var BusinessConfigContext = createContext({
158
- currency: null,
159
- reward_point_config: null,
160
- orderConfig: null
161
- });
162
155
  var BusinessConfigProvider = ({
163
156
  children,
164
157
  data,
@@ -208,57 +201,28 @@ var BusinessConfigProvider = ({
208
201
  };
209
202
  var useBusinessContext = () => useContext(BusinessConfigContext);
210
203
  var useBusiness = () => useContext(BusinessConfigContext);
211
- var show = (type, message, options) => {
212
- const defaultOptions = {
213
- position: "top-right",
214
- autoClose: 3e3
204
+ function createNoopToastSupport() {
205
+ const noop = () => {
215
206
  };
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
- };
207
+ return {
208
+ success: noop,
209
+ error: noop,
210
+ info: noop,
211
+ warning: noop,
212
+ default: noop
213
+ };
214
+ }
215
+ var ToastSupportContext = createContext(createNoopToastSupport());
216
+ function ToastSupportProvider({ children, value }) {
217
+ const api13 = useMemo(() => {
218
+ if (!value) return createNoopToastSupport();
219
+ return { ...createNoopToastSupport(), ...value };
220
+ }, [value]);
221
+ return /* @__PURE__ */ jsx(ToastSupportContext.Provider, { value: api13, children });
222
+ }
223
+ function useToastSupport() {
224
+ return useContext(ToastSupportContext);
225
+ }
262
226
  var CartWishlistRefreshContext = createContext({
263
227
  refreshType: null,
264
228
  setRefreshType: () => null
@@ -279,6 +243,7 @@ var CartContext = createContext({
279
243
  onChangeOffer: () => null,
280
244
  onChangeOrderType: () => null,
281
245
  session: {},
246
+ setSession: () => null,
282
247
  removeAppliedOffer: () => null,
283
248
  moveToWishlist: () => null,
284
249
  moveToWishlistLoading: false,
@@ -288,6 +253,7 @@ var CartContext = createContext({
288
253
  errorMessage: null
289
254
  });
290
255
  var CartProvider = (props) => {
256
+ const toast = useToastSupport();
291
257
  const [cartItems, setCartItems] = useState([]);
292
258
  const [orderFetchLoading, setOrderFetchLoading] = useState(true);
293
259
  const [addToCartLoading, setAddToCartLoading] = useState(false);
@@ -561,6 +527,7 @@ var CartProvider = (props) => {
561
527
  onChangeOffer,
562
528
  onChangeOrderType,
563
529
  session,
530
+ setSession,
564
531
  removeAppliedOffer,
565
532
  moveToWishlist,
566
533
  moveToWishlistLoading,
@@ -864,51 +831,6 @@ var ProductDetailProvider = (props) => {
864
831
  );
865
832
  };
866
833
  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
834
  var ProductConfigContext = createContext({});
913
835
  var ProductConfigProvider = (props) => {
914
836
  const [productConfig, setProductConfig] = useState({});
@@ -1222,6 +1144,7 @@ var WishlistContext = createContext({
1222
1144
  moveToCartLoading: false
1223
1145
  });
1224
1146
  var WishlistProvider = (props) => {
1147
+ const toast = useToastSupport();
1225
1148
  const [wishlistItems, setWishlistItems] = useState([]);
1226
1149
  const { user } = useAuth();
1227
1150
  const [fetchWishlistLoading, setFetchWishlistLoading] = useState(true);
@@ -1854,16 +1777,6 @@ var MenuCartProvider = (props) => {
1854
1777
  );
1855
1778
  };
1856
1779
  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
1780
  var REFERRAL_STORAGE_KEY = "referralCode";
1868
1781
  var ReferralCodeContext = createContext(null);
1869
1782
  function ReferralCodeProvider({
@@ -1918,32 +1831,6 @@ var LiveSupportWidgetProvider = ({ children }) => {
1918
1831
  return /* @__PURE__ */ jsx(LiveSupportWidgetContext.Provider, { value: { config, loading }, children });
1919
1832
  };
1920
1833
  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
1834
  var BaseProvider = ({
1948
1835
  children,
1949
1836
  baseURL,
@@ -1954,14 +1841,12 @@ var BaseProvider = ({
1954
1841
  isHeader,
1955
1842
  isFooter,
1956
1843
  isAnnouncementBar,
1957
- referralCodeFromUrl = null
1844
+ referralCodeFromUrl = null,
1845
+ toast
1958
1846
  }) => {
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
- ] }) }) }) }) }) }) }) }) }) });
1847
+ return /* @__PURE__ */ jsx(StorageProvider, { storage, children: /* @__PURE__ */ jsx(ToastSupportProvider, { value: toast, 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(LiveSupportWidgetProvider, { children: 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 }) }) }) }) }) }) }) }) }) }) }) }) });
1963
1848
  };
1964
1849
 
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
1850
+ export { AuthContext, AuthProvider, BaseProvider, 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, ThemeEditContext, ThemeEditProvider, ToastSupportProvider, WishlistContext, WishlistProvider, useAuth, useBusiness, useBusinessContext, useBusinessMedia, useCart, useCartWishlistRefresh, useCustomPageConfig, useCustomer, useFilter, useHeaderFooter, useHomeConfig, useHomeConfigHeroSlider, useLiveSupportWidget, useMenuCart, useMenuFilter, useModal, useProductConfig, useProductDetail, useReferralCode, useStorage, useThemeEdit, useToastSupport, useWishlist };
1851
+ //# sourceMappingURL=chunk-XL2AT5BD.js.map
1852
+ //# sourceMappingURL=chunk-XL2AT5BD.js.map