@pakento/cms-sdk 4.0.1 → 4.0.3

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 CHANGED
@@ -1,15 +1,99 @@
1
1
  # @pakento/cms-sdk
2
2
 
3
- SDK para conectar tiendas en línea con Pakento CMS de forma rápida y sencilla.
3
+ SDK para conectar tiendas en línea con Pakento CMS
4
4
 
5
5
  ## Instalación
6
6
 
7
7
  ```bash
8
8
  npm install @pakento/cms-sdk
9
9
  # o
10
+ yarn add @pakento/cms-sdk
11
+ # o
10
12
  bun add @pakento/cms-sdk
11
13
  ```
12
14
 
15
+ **Nota importante**: Este paquete requiere las siguientes peer dependencies:
16
+
17
+ - `react >= 16.8.0`
18
+ - `react-dom >= 16.8.0`
19
+ - `axios >= 1.6.0`
20
+ - `@upstash/redis >= 1.35.3` (opcional, solo si usas cache con Redis)
21
+
22
+ ## Uso del Cart Context en Next.js
23
+
24
+ ### 1. Configurar el Provider en tu app
25
+
26
+ En tu `app/layout.tsx` o `pages/_app.tsx`:
27
+
28
+ ```tsx
29
+ import { CartProvider } from "@pakento/cms-sdk";
30
+
31
+ export default function RootLayout({
32
+ children,
33
+ }: {
34
+ children: React.ReactNode;
35
+ }) {
36
+ return (
37
+ <html lang="es">
38
+ <body>
39
+ <CartProvider>{children}</CartProvider>
40
+ </body>
41
+ </html>
42
+ );
43
+ }
44
+ ```
45
+
46
+ ### 2. Usar el hook useCart en tus componentes
47
+
48
+ ```tsx
49
+ "use client";
50
+
51
+ import { useCart } from "@pakento/cms-sdk";
52
+
53
+ export default function CartComponent() {
54
+ const { state, dispatch } = useCart();
55
+
56
+ const addToCart = (item) => {
57
+ dispatch({ type: "ADD_TO_CART", payload: item });
58
+ };
59
+
60
+ const removeFromCart = (itemId) => {
61
+ dispatch({ type: "REMOVE_FROM_CART", payload: itemId });
62
+ };
63
+
64
+ return (
65
+ <div>
66
+ <p>Items en carrito: {state.cart.itemCount}</p>
67
+ <p>Total: ${state.cart.total}</p>
68
+ {/* Tu UI del carrito aquí */}
69
+ </div>
70
+ );
71
+ }
72
+ ```
73
+
74
+ ### 3. API Usage
75
+
76
+ ````tsx
77
+ import { pakentoCMSAPI } from '@pakento/cms-sdk';
78
+
79
+ // Configurar variables de entorno
80
+ // PAKENTO_API_URL=tu_url_de_api
81
+ // PAKENTO_API_KEY=tu_api_key
82
+
83
+ const items = await pakentoCMSAPI.getItems({
84
+ limit: 10,
85
+ page: 1
86
+ });
87
+ ``` de forma rápida y sencilla.
88
+
89
+ ## Instalación
90
+
91
+ ```bash
92
+ npm install @pakento/cms-sdk
93
+ # o
94
+ bun add @pakento/cms-sdk
95
+ ````
96
+
13
97
  ## Configuración
14
98
 
15
99
  Agrega las siguientes variables de entorno a tu proyecto:
@@ -193,4 +277,4 @@ El SDK incluye manejo de errores para:
193
277
 
194
278
  MIT
195
279
 
196
- .build
280
+ .build
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React, { ReactNode } from 'react';
2
+ import * as React from 'react';
3
3
 
4
4
  interface ItemImage {
5
5
  alt: string;
@@ -293,7 +293,7 @@ type CartAction = {
293
293
  type: "CLOSE_CART";
294
294
  };
295
295
  declare function CartProvider({ children }: {
296
- children: ReactNode;
296
+ children: React.ReactNode;
297
297
  }): react_jsx_runtime.JSX.Element;
298
298
  declare function useCart(): {
299
299
  state: CartState;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React, { ReactNode } from 'react';
2
+ import * as React from 'react';
3
3
 
4
4
  interface ItemImage {
5
5
  alt: string;
@@ -293,7 +293,7 @@ type CartAction = {
293
293
  type: "CLOSE_CART";
294
294
  };
295
295
  declare function CartProvider({ children }: {
296
- children: ReactNode;
296
+ children: React.ReactNode;
297
297
  }): react_jsx_runtime.JSX.Element;
298
298
  declare function useCart(): {
299
299
  state: CartState;
package/dist/index.js CHANGED
@@ -827,8 +827,9 @@ var PakentoCMSAPI = class {
827
827
  var pakentoCMSAPI = new PakentoCMSAPI();
828
828
 
829
829
  // src/context/CartContext.tsx
830
- var import_react = require("react");
830
+ var React = __toESM(require("react"));
831
831
  var import_jsx_runtime = require("react/jsx-runtime");
832
+ var { createContext, useContext, useReducer } = React;
832
833
  var initialState = {
833
834
  cart: {
834
835
  cartItems: [],
@@ -925,13 +926,13 @@ function cartReducer(state, action) {
925
926
  return state;
926
927
  }
927
928
  }
928
- var CartContext = (0, import_react.createContext)(null);
929
+ var CartContext = createContext(null);
929
930
  function CartProvider({ children }) {
930
- const [state, dispatch] = (0, import_react.useReducer)(cartReducer, initialState);
931
+ const [state, dispatch] = useReducer(cartReducer, initialState);
931
932
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CartContext.Provider, { value: { state, dispatch }, children });
932
933
  }
933
934
  function useCart() {
934
- const context = (0, import_react.useContext)(CartContext);
935
+ const context = useContext(CartContext);
935
936
  if (!context) {
936
937
  throw new Error("useCart must be used within a CartProvider");
937
938
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/services/api.ts","../src/context/CartContext.tsx"],"sourcesContent":["// Services\nexport { pakentoCMSAPI } from \"./services/api\";\n\n// Types\nexport type {\n // Base types\n Item,\n ItemImage,\n Category,\n Brand,\n Entity,\n\n // GraphQL Where conditions\n WhereEquals,\n ItemsWhere,\n CategoriesWhere,\n\n // API Parameters\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n\n // Raw API Response types\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n EntityRawResponse,\n\n // API Response types with error handling\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n} from \"./types\";\n\n// Context\nexport { CartProvider, useCart } from \"./context/CartContext\";\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { Redis } from \"@upstash/redis\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private redis?: Redis;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n // Configuración de TTL por defecto si se pasa en el constructor\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n // Instanciar Redis si las variables están presentes\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n\n if (!this.baseURL || !this.apiKey) {\n /*\n * No lanzamos excepciones en el constructor para evitar errores durante el build.\n * Las validaciones se harán justo antes de ejecutar una petición.\n */\n console.warn(\n \"[PakentoSDK] Variables de entorno PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes. Se validarán al hacer la petición.\"\n );\n }\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Obtiene datos desde cache si existen; de lo contrario llama a fetcher() y guarda.\n */\n private safeJsonParse<T>(data: string): T | null {\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n return typeof value === \"string\"\n ? (value as string)\n : JSON.stringify(value);\n }\n\n private async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n return fetcher();\n }\n\n try {\n const cached = await this.redis.get<string>(key);\n if (cached) {\n const parsed = this.safeJsonParse<T>(cached);\n if (parsed !== null) {\n return parsed;\n }\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n const result = await fetcher();\n\n try {\n await this.redis.set(key, this.serializeForCache(result), {\n ex: ttl ?? this.defaultTTL,\n });\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n }\n\n return result;\n }\n\n /**\n * Construye una llave única para el cache a partir del nombre de la\n * consulta y los parámetros.\n */\n private buildCacheKey(\n queryName: string,\n variables: Record<string, unknown>\n ): string {\n // Usar apiKey para namespacing y evitar colisiones entre proyectos\n const vars =\n typeof variables === \"string\"\n ? variables\n : JSON.stringify(variables ?? {});\n return `${this.apiKey}-${queryName}:${vars}`;\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetItemsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(params),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n // Construir el objeto where solo si se envían parámetros\n const whereConditions: ItemsWhere = {};\n\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = {\n equals: params.where.brand_id.equals,\n };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = {\n equals: params.where.id.equals,\n };\n }\n\n // Solo incluir where si tiene condiciones\n const variables: GetItemsParams = {\n onlyOffers: params.onlyOffers,\n onlyEcommerce: params.onlyEcommerce,\n limit: params.limit,\n page: params.page,\n search: params.search,\n sort: params.sort,\n minPrice: params.minPrice,\n maxPrice: params.maxPrice,\n };\n\n // Solo agregar where si tiene condiciones\n if (Object.keys(whereConditions).length > 0) {\n variables.where = whereConditions;\n }\n\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: ItemsRawResponse = response.data.data.GetEcommerceItems;\n\n return {\n data: rawData,\n items: rawData.docs,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n prevPage: rawData.prevPage,\n nextPage: rawData.nextPage,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n const rawData: CategoriesRawResponse =\n response.data.data.GetEcommerceCategories;\n\n return {\n data: rawData.docs,\n categories: rawData.docs,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: BrandsRawResponse = response.data.data.GetEcommerceBrands;\n\n return {\n data: rawData,\n brands: rawData.docs,\n hasNextPage: rawData.hasNextPage,\n hasPrevPage: rawData.hasPrevPage,\n limit: rawData.limit,\n nextPage: rawData.nextPage,\n offset: rawData.offset,\n page: rawData.page,\n pagingCounter: rawData.pagingCounter,\n prevPage: rawData.prevPage,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.buildCacheKey(\"GetEntity\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n const entityData = response.data.data.GetEntity;\n\n return {\n data: entityData,\n entity: entityData,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n if (\n !params.items ||\n !Array.isArray(params.items) ||\n params.items.length === 0\n ) {\n return {\n message: \"Se requiere al menos un item en la orden\",\n error: true,\n errorMessage: \"Se requiere al menos un item en la orden\",\n };\n }\n\n if (\n params.payment_method &&\n params.payment_method !== \"cash\" &&\n params.payment_method !== \"transfer\"\n ) {\n return {\n message: \"Método de pago no válido\",\n error: true,\n errorMessage: \"Método de pago no válido\",\n };\n }\n\n // Validar estructura de items\n for (const item of params.items) {\n if (!item.id || !item.quantity || item.quantity <= 0) {\n return {\n message: \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n error: true,\n errorMessage:\n \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n };\n }\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al crear la orden\",\n error: true,\n errorMessage: response.data.message || \"Error al crear la orden\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n // Validar formato de email básico\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(params.email)) {\n return {\n message: \"Formato de email inválido\",\n error: true,\n errorMessage: \"Formato de email inválido\",\n };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al enviar el mensaje\",\n error: true,\n errorMessage: response.data.message || \"Error al enviar el mensaje\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","\"use client\";\n\nimport React, { createContext, useContext, useReducer, ReactNode } from \"react\";\nimport { Cart, CartItem, Item } from \"../types\";\n\ninterface CartState {\n cart: Cart;\n isCartOpen: boolean;\n}\n\ntype CartAction =\n | { type: \"ADD_TO_CART\"; payload: Item }\n | { type: \"REMOVE_FROM_CART\"; payload: string }\n | {\n type: \"UPDATE_QUANTITY\";\n payload: { itemId: string; quantity: number };\n }\n | { type: \"CLEAR_CART\" }\n | { type: \"TOGGLE_CART\" }\n | { type: \"OPEN_CART\" }\n | { type: \"CLOSE_CART\" };\n\nconst initialState: CartState = {\n cart: {\n cartItems: [],\n total: 0,\n itemCount: 0,\n },\n isCartOpen: false,\n};\n\nfunction cartReducer(state: CartState, action: CartAction): CartState {\n switch (action.type) {\n case \"ADD_TO_CART\": {\n const existingItem = state.cart.cartItems.find(\n (cartItem) => cartItem.item.id === action.payload.id\n );\n\n let newItems: CartItem[];\n if (existingItem) {\n newItems = state.cart.cartItems.map((cartItem) =>\n cartItem.item.id === action.payload.id\n ? { ...cartItem, quantity: cartItem.quantity + 1 }\n : cartItem\n );\n } else {\n newItems = [\n ...state.cart.cartItems,\n { item: action.payload, quantity: 1 },\n ];\n }\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"REMOVE_FROM_CART\": {\n const newItems = state.cart.cartItems.filter(\n (cartItem) => cartItem.item.id !== action.payload\n );\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"UPDATE_QUANTITY\": {\n const newItems = state.cart.cartItems\n .map((cartItem) =>\n cartItem.item.id === action.payload.itemId\n ? { ...cartItem, quantity: Math.max(0, action.payload.quantity) }\n : cartItem\n )\n .filter((item) => item.quantity > 0);\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"CLEAR_CART\":\n return {\n ...state,\n cart: { cartItems: [], total: 0, itemCount: 0 },\n };\n\n case \"TOGGLE_CART\":\n return {\n ...state,\n isCartOpen: !state.isCartOpen,\n };\n\n case \"OPEN_CART\":\n return {\n ...state,\n isCartOpen: true,\n };\n\n case \"CLOSE_CART\":\n return {\n ...state,\n isCartOpen: false,\n };\n\n default:\n return state;\n }\n}\n\nconst CartContext = createContext<{\n state: CartState;\n dispatch: React.Dispatch<CartAction>;\n} | null>(null);\n\nexport function CartProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(cartReducer, initialState);\n\n return (\n <CartContext.Provider value={{ state, dispatch }}>\n {children}\n </CartContext.Provider>\n );\n}\n\nexport function useCart() {\n const context = useContext(CartContext);\n if (!context) {\n throw new Error(\"useCart must be used within a CartProvider\");\n }\n return context;\n}\n"],"mappings":"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","names":["axios","config"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/services/api.ts","../src/context/CartContext.tsx"],"sourcesContent":["// Services\nexport { pakentoCMSAPI } from \"./services/api\";\n\n// Types\nexport type {\n // Base types\n Item,\n ItemImage,\n Category,\n Brand,\n Entity,\n\n // GraphQL Where conditions\n WhereEquals,\n ItemsWhere,\n CategoriesWhere,\n\n // API Parameters\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n\n // Raw API Response types\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n EntityRawResponse,\n\n // API Response types with error handling\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n} from \"./types\";\n\n// Context\nexport { CartProvider, useCart } from \"./context/CartContext\";\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { Redis } from \"@upstash/redis\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private redis?: Redis;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n // Configuración de TTL por defecto si se pasa en el constructor\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n // Instanciar Redis si las variables están presentes\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n\n if (!this.baseURL || !this.apiKey) {\n /*\n * No lanzamos excepciones en el constructor para evitar errores durante el build.\n * Las validaciones se harán justo antes de ejecutar una petición.\n */\n console.warn(\n \"[PakentoSDK] Variables de entorno PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes. Se validarán al hacer la petición.\"\n );\n }\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Obtiene datos desde cache si existen; de lo contrario llama a fetcher() y guarda.\n */\n private safeJsonParse<T>(data: string): T | null {\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n return typeof value === \"string\"\n ? (value as string)\n : JSON.stringify(value);\n }\n\n private async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n return fetcher();\n }\n\n try {\n const cached = await this.redis.get<string>(key);\n if (cached) {\n const parsed = this.safeJsonParse<T>(cached);\n if (parsed !== null) {\n return parsed;\n }\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n const result = await fetcher();\n\n try {\n await this.redis.set(key, this.serializeForCache(result), {\n ex: ttl ?? this.defaultTTL,\n });\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n }\n\n return result;\n }\n\n /**\n * Construye una llave única para el cache a partir del nombre de la\n * consulta y los parámetros.\n */\n private buildCacheKey(\n queryName: string,\n variables: Record<string, unknown>\n ): string {\n // Usar apiKey para namespacing y evitar colisiones entre proyectos\n const vars =\n typeof variables === \"string\"\n ? variables\n : JSON.stringify(variables ?? {});\n return `${this.apiKey}-${queryName}:${vars}`;\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetItemsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(params),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n // Construir el objeto where solo si se envían parámetros\n const whereConditions: ItemsWhere = {};\n\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = {\n equals: params.where.brand_id.equals,\n };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = {\n equals: params.where.id.equals,\n };\n }\n\n // Solo incluir where si tiene condiciones\n const variables: GetItemsParams = {\n onlyOffers: params.onlyOffers,\n onlyEcommerce: params.onlyEcommerce,\n limit: params.limit,\n page: params.page,\n search: params.search,\n sort: params.sort,\n minPrice: params.minPrice,\n maxPrice: params.maxPrice,\n };\n\n // Solo agregar where si tiene condiciones\n if (Object.keys(whereConditions).length > 0) {\n variables.where = whereConditions;\n }\n\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: ItemsRawResponse = response.data.data.GetEcommerceItems;\n\n return {\n data: rawData,\n items: rawData.docs,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n prevPage: rawData.prevPage,\n nextPage: rawData.nextPage,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n const rawData: CategoriesRawResponse =\n response.data.data.GetEcommerceCategories;\n\n return {\n data: rawData.docs,\n categories: rawData.docs,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: BrandsRawResponse = response.data.data.GetEcommerceBrands;\n\n return {\n data: rawData,\n brands: rawData.docs,\n hasNextPage: rawData.hasNextPage,\n hasPrevPage: rawData.hasPrevPage,\n limit: rawData.limit,\n nextPage: rawData.nextPage,\n offset: rawData.offset,\n page: rawData.page,\n pagingCounter: rawData.pagingCounter,\n prevPage: rawData.prevPage,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.buildCacheKey(\"GetEntity\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n const entityData = response.data.data.GetEntity;\n\n return {\n data: entityData,\n entity: entityData,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n if (\n !params.items ||\n !Array.isArray(params.items) ||\n params.items.length === 0\n ) {\n return {\n message: \"Se requiere al menos un item en la orden\",\n error: true,\n errorMessage: \"Se requiere al menos un item en la orden\",\n };\n }\n\n if (\n params.payment_method &&\n params.payment_method !== \"cash\" &&\n params.payment_method !== \"transfer\"\n ) {\n return {\n message: \"Método de pago no válido\",\n error: true,\n errorMessage: \"Método de pago no válido\",\n };\n }\n\n // Validar estructura de items\n for (const item of params.items) {\n if (!item.id || !item.quantity || item.quantity <= 0) {\n return {\n message: \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n error: true,\n errorMessage:\n \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n };\n }\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al crear la orden\",\n error: true,\n errorMessage: response.data.message || \"Error al crear la orden\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n // Validar formato de email básico\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(params.email)) {\n return {\n message: \"Formato de email inválido\",\n error: true,\n errorMessage: \"Formato de email inválido\",\n };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al enviar el mensaje\",\n error: true,\n errorMessage: response.data.message || \"Error al enviar el mensaje\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","\"use client\";\n\nimport * as React from \"react\";\nconst { createContext, useContext, useReducer } = React;\nimport { Cart, CartItem, Item } from \"../types\";\n\ninterface CartState {\n cart: Cart;\n isCartOpen: boolean;\n}\n\ntype CartAction =\n | { type: \"ADD_TO_CART\"; payload: Item }\n | { type: \"REMOVE_FROM_CART\"; payload: string }\n | {\n type: \"UPDATE_QUANTITY\";\n payload: { itemId: string; quantity: number };\n }\n | { type: \"CLEAR_CART\" }\n | { type: \"TOGGLE_CART\" }\n | { type: \"OPEN_CART\" }\n | { type: \"CLOSE_CART\" };\n\nconst initialState: CartState = {\n cart: {\n cartItems: [],\n total: 0,\n itemCount: 0,\n },\n isCartOpen: false,\n};\n\nfunction cartReducer(state: CartState, action: CartAction): CartState {\n switch (action.type) {\n case \"ADD_TO_CART\": {\n const existingItem = state.cart.cartItems.find(\n (cartItem) => cartItem.item.id === action.payload.id\n );\n\n let newItems: CartItem[];\n if (existingItem) {\n newItems = state.cart.cartItems.map((cartItem) =>\n cartItem.item.id === action.payload.id\n ? { ...cartItem, quantity: cartItem.quantity + 1 }\n : cartItem\n );\n } else {\n newItems = [\n ...state.cart.cartItems,\n { item: action.payload, quantity: 1 },\n ];\n }\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"REMOVE_FROM_CART\": {\n const newItems = state.cart.cartItems.filter(\n (cartItem) => cartItem.item.id !== action.payload\n );\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"UPDATE_QUANTITY\": {\n const newItems = state.cart.cartItems\n .map((cartItem) =>\n cartItem.item.id === action.payload.itemId\n ? { ...cartItem, quantity: Math.max(0, action.payload.quantity) }\n : cartItem\n )\n .filter((item) => item.quantity > 0);\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"CLEAR_CART\":\n return {\n ...state,\n cart: { cartItems: [], total: 0, itemCount: 0 },\n };\n\n case \"TOGGLE_CART\":\n return {\n ...state,\n isCartOpen: !state.isCartOpen,\n };\n\n case \"OPEN_CART\":\n return {\n ...state,\n isCartOpen: true,\n };\n\n case \"CLOSE_CART\":\n return {\n ...state,\n isCartOpen: false,\n };\n\n default:\n return state;\n }\n}\n\nconst CartContext = createContext<{\n state: CartState;\n dispatch: React.Dispatch<CartAction>;\n} | null>(null);\n\nexport function CartProvider({ children }: { children: React.ReactNode }) {\n const [state, dispatch] = useReducer(cartReducer, initialState);\n\n return (\n <CartContext.Provider value={{ state, dispatch }}>\n {children}\n </CartContext.Provider>\n );\n}\n\nexport function useCart() {\n const context = useContext(CartContext);\n if (!context) {\n throw new Error(\"useCart must be used within a CartProvider\");\n }\n return context;\n}\n"],"mappings":"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","names":["axios","config"]}
package/dist/index.mjs CHANGED
@@ -789,8 +789,9 @@ var PakentoCMSAPI = class {
789
789
  var pakentoCMSAPI = new PakentoCMSAPI();
790
790
 
791
791
  // src/context/CartContext.tsx
792
- import { createContext, useContext, useReducer } from "react";
792
+ import * as React from "react";
793
793
  import { jsx } from "react/jsx-runtime";
794
+ var { createContext, useContext, useReducer } = React;
794
795
  var initialState = {
795
796
  cart: {
796
797
  cartItems: [],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/api.ts","../src/context/CartContext.tsx"],"sourcesContent":["import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { Redis } from \"@upstash/redis\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private redis?: Redis;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n // Configuración de TTL por defecto si se pasa en el constructor\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n // Instanciar Redis si las variables están presentes\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n\n if (!this.baseURL || !this.apiKey) {\n /*\n * No lanzamos excepciones en el constructor para evitar errores durante el build.\n * Las validaciones se harán justo antes de ejecutar una petición.\n */\n console.warn(\n \"[PakentoSDK] Variables de entorno PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes. Se validarán al hacer la petición.\"\n );\n }\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Obtiene datos desde cache si existen; de lo contrario llama a fetcher() y guarda.\n */\n private safeJsonParse<T>(data: string): T | null {\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n return typeof value === \"string\"\n ? (value as string)\n : JSON.stringify(value);\n }\n\n private async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n return fetcher();\n }\n\n try {\n const cached = await this.redis.get<string>(key);\n if (cached) {\n const parsed = this.safeJsonParse<T>(cached);\n if (parsed !== null) {\n return parsed;\n }\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n const result = await fetcher();\n\n try {\n await this.redis.set(key, this.serializeForCache(result), {\n ex: ttl ?? this.defaultTTL,\n });\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n }\n\n return result;\n }\n\n /**\n * Construye una llave única para el cache a partir del nombre de la\n * consulta y los parámetros.\n */\n private buildCacheKey(\n queryName: string,\n variables: Record<string, unknown>\n ): string {\n // Usar apiKey para namespacing y evitar colisiones entre proyectos\n const vars =\n typeof variables === \"string\"\n ? variables\n : JSON.stringify(variables ?? {});\n return `${this.apiKey}-${queryName}:${vars}`;\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetItemsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(params),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n // Construir el objeto where solo si se envían parámetros\n const whereConditions: ItemsWhere = {};\n\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = {\n equals: params.where.brand_id.equals,\n };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = {\n equals: params.where.id.equals,\n };\n }\n\n // Solo incluir where si tiene condiciones\n const variables: GetItemsParams = {\n onlyOffers: params.onlyOffers,\n onlyEcommerce: params.onlyEcommerce,\n limit: params.limit,\n page: params.page,\n search: params.search,\n sort: params.sort,\n minPrice: params.minPrice,\n maxPrice: params.maxPrice,\n };\n\n // Solo agregar where si tiene condiciones\n if (Object.keys(whereConditions).length > 0) {\n variables.where = whereConditions;\n }\n\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: ItemsRawResponse = response.data.data.GetEcommerceItems;\n\n return {\n data: rawData,\n items: rawData.docs,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n prevPage: rawData.prevPage,\n nextPage: rawData.nextPage,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n const rawData: CategoriesRawResponse =\n response.data.data.GetEcommerceCategories;\n\n return {\n data: rawData.docs,\n categories: rawData.docs,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: BrandsRawResponse = response.data.data.GetEcommerceBrands;\n\n return {\n data: rawData,\n brands: rawData.docs,\n hasNextPage: rawData.hasNextPage,\n hasPrevPage: rawData.hasPrevPage,\n limit: rawData.limit,\n nextPage: rawData.nextPage,\n offset: rawData.offset,\n page: rawData.page,\n pagingCounter: rawData.pagingCounter,\n prevPage: rawData.prevPage,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.buildCacheKey(\"GetEntity\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n const entityData = response.data.data.GetEntity;\n\n return {\n data: entityData,\n entity: entityData,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n if (\n !params.items ||\n !Array.isArray(params.items) ||\n params.items.length === 0\n ) {\n return {\n message: \"Se requiere al menos un item en la orden\",\n error: true,\n errorMessage: \"Se requiere al menos un item en la orden\",\n };\n }\n\n if (\n params.payment_method &&\n params.payment_method !== \"cash\" &&\n params.payment_method !== \"transfer\"\n ) {\n return {\n message: \"Método de pago no válido\",\n error: true,\n errorMessage: \"Método de pago no válido\",\n };\n }\n\n // Validar estructura de items\n for (const item of params.items) {\n if (!item.id || !item.quantity || item.quantity <= 0) {\n return {\n message: \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n error: true,\n errorMessage:\n \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n };\n }\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al crear la orden\",\n error: true,\n errorMessage: response.data.message || \"Error al crear la orden\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n // Validar formato de email básico\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(params.email)) {\n return {\n message: \"Formato de email inválido\",\n error: true,\n errorMessage: \"Formato de email inválido\",\n };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al enviar el mensaje\",\n error: true,\n errorMessage: response.data.message || \"Error al enviar el mensaje\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","\"use client\";\n\nimport React, { createContext, useContext, useReducer, ReactNode } from \"react\";\nimport { Cart, CartItem, Item } from \"../types\";\n\ninterface CartState {\n cart: Cart;\n isCartOpen: boolean;\n}\n\ntype CartAction =\n | { type: \"ADD_TO_CART\"; payload: Item }\n | { type: \"REMOVE_FROM_CART\"; payload: string }\n | {\n type: \"UPDATE_QUANTITY\";\n payload: { itemId: string; quantity: number };\n }\n | { type: \"CLEAR_CART\" }\n | { type: \"TOGGLE_CART\" }\n | { type: \"OPEN_CART\" }\n | { type: \"CLOSE_CART\" };\n\nconst initialState: CartState = {\n cart: {\n cartItems: [],\n total: 0,\n itemCount: 0,\n },\n isCartOpen: false,\n};\n\nfunction cartReducer(state: CartState, action: CartAction): CartState {\n switch (action.type) {\n case \"ADD_TO_CART\": {\n const existingItem = state.cart.cartItems.find(\n (cartItem) => cartItem.item.id === action.payload.id\n );\n\n let newItems: CartItem[];\n if (existingItem) {\n newItems = state.cart.cartItems.map((cartItem) =>\n cartItem.item.id === action.payload.id\n ? { ...cartItem, quantity: cartItem.quantity + 1 }\n : cartItem\n );\n } else {\n newItems = [\n ...state.cart.cartItems,\n { item: action.payload, quantity: 1 },\n ];\n }\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"REMOVE_FROM_CART\": {\n const newItems = state.cart.cartItems.filter(\n (cartItem) => cartItem.item.id !== action.payload\n );\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"UPDATE_QUANTITY\": {\n const newItems = state.cart.cartItems\n .map((cartItem) =>\n cartItem.item.id === action.payload.itemId\n ? { ...cartItem, quantity: Math.max(0, action.payload.quantity) }\n : cartItem\n )\n .filter((item) => item.quantity > 0);\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"CLEAR_CART\":\n return {\n ...state,\n cart: { cartItems: [], total: 0, itemCount: 0 },\n };\n\n case \"TOGGLE_CART\":\n return {\n ...state,\n isCartOpen: !state.isCartOpen,\n };\n\n case \"OPEN_CART\":\n return {\n ...state,\n isCartOpen: true,\n };\n\n case \"CLOSE_CART\":\n return {\n ...state,\n isCartOpen: false,\n };\n\n default:\n return state;\n }\n}\n\nconst CartContext = createContext<{\n state: CartState;\n dispatch: React.Dispatch<CartAction>;\n} | null>(null);\n\nexport function CartProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(cartReducer, initialState);\n\n return (\n <CartContext.Provider value={{ state, dispatch }}>\n {children}\n </CartContext.Provider>\n );\n}\n\nexport function useCart() {\n const context = useContext(CartContext);\n if (!context) {\n throw new Error(\"useCart must be used within a CartProvider\");\n }\n return context;\n}\n"],"mappings":"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","names":["config"]}
1
+ {"version":3,"sources":["../src/services/api.ts","../src/context/CartContext.tsx"],"sourcesContent":["import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { Redis } from \"@upstash/redis\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private redis?: Redis;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n // Configuración de TTL por defecto si se pasa en el constructor\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n // Instanciar Redis si las variables están presentes\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n\n if (!this.baseURL || !this.apiKey) {\n /*\n * No lanzamos excepciones en el constructor para evitar errores durante el build.\n * Las validaciones se harán justo antes de ejecutar una petición.\n */\n console.warn(\n \"[PakentoSDK] Variables de entorno PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes. Se validarán al hacer la petición.\"\n );\n }\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Obtiene datos desde cache si existen; de lo contrario llama a fetcher() y guarda.\n */\n private safeJsonParse<T>(data: string): T | null {\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n return typeof value === \"string\"\n ? (value as string)\n : JSON.stringify(value);\n }\n\n private async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n return fetcher();\n }\n\n try {\n const cached = await this.redis.get<string>(key);\n if (cached) {\n const parsed = this.safeJsonParse<T>(cached);\n if (parsed !== null) {\n return parsed;\n }\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n const result = await fetcher();\n\n try {\n await this.redis.set(key, this.serializeForCache(result), {\n ex: ttl ?? this.defaultTTL,\n });\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n }\n\n return result;\n }\n\n /**\n * Construye una llave única para el cache a partir del nombre de la\n * consulta y los parámetros.\n */\n private buildCacheKey(\n queryName: string,\n variables: Record<string, unknown>\n ): string {\n // Usar apiKey para namespacing y evitar colisiones entre proyectos\n const vars =\n typeof variables === \"string\"\n ? variables\n : JSON.stringify(variables ?? {});\n return `${this.apiKey}-${queryName}:${vars}`;\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetItemsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(params),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n // Construir el objeto where solo si se envían parámetros\n const whereConditions: ItemsWhere = {};\n\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = {\n equals: params.where.brand_id.equals,\n };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = {\n equals: params.where.id.equals,\n };\n }\n\n // Solo incluir where si tiene condiciones\n const variables: GetItemsParams = {\n onlyOffers: params.onlyOffers,\n onlyEcommerce: params.onlyEcommerce,\n limit: params.limit,\n page: params.page,\n search: params.search,\n sort: params.sort,\n minPrice: params.minPrice,\n maxPrice: params.maxPrice,\n };\n\n // Solo agregar where si tiene condiciones\n if (Object.keys(whereConditions).length > 0) {\n variables.where = whereConditions;\n }\n\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: ItemsRawResponse = response.data.data.GetEcommerceItems;\n\n return {\n data: rawData,\n items: rawData.docs,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n prevPage: rawData.prevPage,\n nextPage: rawData.nextPage,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n const rawData: CategoriesRawResponse =\n response.data.data.GetEcommerceCategories;\n\n return {\n data: rawData.docs,\n categories: rawData.docs,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n const rawData: BrandsRawResponse = response.data.data.GetEcommerceBrands;\n\n return {\n data: rawData,\n brands: rawData.docs,\n hasNextPage: rawData.hasNextPage,\n hasPrevPage: rawData.hasPrevPage,\n limit: rawData.limit,\n nextPage: rawData.nextPage,\n offset: rawData.offset,\n page: rawData.page,\n pagingCounter: rawData.pagingCounter,\n prevPage: rawData.prevPage,\n totalDocs: rawData.totalDocs,\n totalPages: rawData.totalPages,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.buildCacheKey(\"GetEntity\", rest);\n return this.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n try {\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: params,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n const entityData = response.data.data.GetEntity;\n\n return {\n data: entityData,\n entity: entityData,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n if (\n !params.items ||\n !Array.isArray(params.items) ||\n params.items.length === 0\n ) {\n return {\n message: \"Se requiere al menos un item en la orden\",\n error: true,\n errorMessage: \"Se requiere al menos un item en la orden\",\n };\n }\n\n if (\n params.payment_method &&\n params.payment_method !== \"cash\" &&\n params.payment_method !== \"transfer\"\n ) {\n return {\n message: \"Método de pago no válido\",\n error: true,\n errorMessage: \"Método de pago no válido\",\n };\n }\n\n // Validar estructura de items\n for (const item of params.items) {\n if (!item.id || !item.quantity || item.quantity <= 0) {\n return {\n message: \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n error: true,\n errorMessage:\n \"Cada item debe tener un id válido y una cantidad mayor a 0\",\n };\n }\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al crear la orden\",\n error: true,\n errorMessage: response.data.message || \"Error al crear la orden\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validación de parámetros requeridos\n if (!params.name || !params.email) {\n return {\n message: \"Faltan campos requeridos: name y email son obligatorios\",\n error: true,\n errorMessage: \"Faltan campos requeridos: name y email son obligatorios\",\n };\n }\n\n // Validar formato de email básico\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(params.email)) {\n return {\n message: \"Formato de email inválido\",\n error: true,\n errorMessage: \"Formato de email inválido\",\n };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n params\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n return {\n message: response.data.message || \"Error al enviar el mensaje\",\n error: true,\n errorMessage: response.data.message || \"Error al enviar el mensaje\",\n };\n }\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n\n if (status === 400) {\n errorMessage = responseMessage || \"Datos de entrada inválidos\";\n } else if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint no encontrado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage =\n responseMessage || `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n message: errorMessage,\n error: true,\n errorMessage,\n };\n }\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","\"use client\";\n\nimport * as React from \"react\";\nconst { createContext, useContext, useReducer } = React;\nimport { Cart, CartItem, Item } from \"../types\";\n\ninterface CartState {\n cart: Cart;\n isCartOpen: boolean;\n}\n\ntype CartAction =\n | { type: \"ADD_TO_CART\"; payload: Item }\n | { type: \"REMOVE_FROM_CART\"; payload: string }\n | {\n type: \"UPDATE_QUANTITY\";\n payload: { itemId: string; quantity: number };\n }\n | { type: \"CLEAR_CART\" }\n | { type: \"TOGGLE_CART\" }\n | { type: \"OPEN_CART\" }\n | { type: \"CLOSE_CART\" };\n\nconst initialState: CartState = {\n cart: {\n cartItems: [],\n total: 0,\n itemCount: 0,\n },\n isCartOpen: false,\n};\n\nfunction cartReducer(state: CartState, action: CartAction): CartState {\n switch (action.type) {\n case \"ADD_TO_CART\": {\n const existingItem = state.cart.cartItems.find(\n (cartItem) => cartItem.item.id === action.payload.id\n );\n\n let newItems: CartItem[];\n if (existingItem) {\n newItems = state.cart.cartItems.map((cartItem) =>\n cartItem.item.id === action.payload.id\n ? { ...cartItem, quantity: cartItem.quantity + 1 }\n : cartItem\n );\n } else {\n newItems = [\n ...state.cart.cartItems,\n { item: action.payload, quantity: 1 },\n ];\n }\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"REMOVE_FROM_CART\": {\n const newItems = state.cart.cartItems.filter(\n (cartItem) => cartItem.item.id !== action.payload\n );\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"UPDATE_QUANTITY\": {\n const newItems = state.cart.cartItems\n .map((cartItem) =>\n cartItem.item.id === action.payload.itemId\n ? { ...cartItem, quantity: Math.max(0, action.payload.quantity) }\n : cartItem\n )\n .filter((item) => item.quantity > 0);\n\n const total = newItems.reduce(\n (sum, cartItem) => sum + cartItem.item.price * cartItem.quantity,\n 0\n );\n const itemCount = newItems.reduce(\n (sum, cartItem) => sum + cartItem.quantity,\n 0\n );\n\n return {\n ...state,\n cart: { cartItems: newItems, total, itemCount },\n };\n }\n\n case \"CLEAR_CART\":\n return {\n ...state,\n cart: { cartItems: [], total: 0, itemCount: 0 },\n };\n\n case \"TOGGLE_CART\":\n return {\n ...state,\n isCartOpen: !state.isCartOpen,\n };\n\n case \"OPEN_CART\":\n return {\n ...state,\n isCartOpen: true,\n };\n\n case \"CLOSE_CART\":\n return {\n ...state,\n isCartOpen: false,\n };\n\n default:\n return state;\n }\n}\n\nconst CartContext = createContext<{\n state: CartState;\n dispatch: React.Dispatch<CartAction>;\n} | null>(null);\n\nexport function CartProvider({ children }: { children: React.ReactNode }) {\n const [state, dispatch] = useReducer(cartReducer, initialState);\n\n return (\n <CartContext.Provider value={{ state, dispatch }}>\n {children}\n </CartContext.Provider>\n );\n}\n\nexport function useCart() {\n const context = useContext(CartContext);\n if (!context) {\n throw new Error(\"useCart must be used within a CartProvider\");\n }\n return context;\n}\n"],"mappings":"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","names":["config"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pakento/cms-sdk",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "SDK para conectar tiendas en línea con Pakento CMS",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",