@pakento/cms-sdk 4.0.1 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,15 +1,92 @@
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
+ ## Uso del Cart Context en Next.js
16
+
17
+ ### 1. Configurar el Provider en tu app
18
+
19
+ En tu `app/layout.tsx` o `pages/_app.tsx`:
20
+
21
+ ```tsx
22
+ import { CartProvider } from "@pakento/cms-sdk";
23
+
24
+ export default function RootLayout({
25
+ children,
26
+ }: {
27
+ children: React.ReactNode;
28
+ }) {
29
+ return (
30
+ <html lang="es">
31
+ <body>
32
+ <CartProvider>{children}</CartProvider>
33
+ </body>
34
+ </html>
35
+ );
36
+ }
37
+ ```
38
+
39
+ ### 2. Usar el hook useCart en tus componentes
40
+
41
+ ```tsx
42
+ "use client";
43
+
44
+ import { useCart } from "@pakento/cms-sdk";
45
+
46
+ export default function CartComponent() {
47
+ const { state, dispatch } = useCart();
48
+
49
+ const addToCart = (item) => {
50
+ dispatch({ type: "ADD_TO_CART", payload: item });
51
+ };
52
+
53
+ const removeFromCart = (itemId) => {
54
+ dispatch({ type: "REMOVE_FROM_CART", payload: itemId });
55
+ };
56
+
57
+ return (
58
+ <div>
59
+ <p>Items en carrito: {state.cart.itemCount}</p>
60
+ <p>Total: ${state.cart.total}</p>
61
+ {/* Tu UI del carrito aquí */}
62
+ </div>
63
+ );
64
+ }
65
+ ```
66
+
67
+ ### 3. API Usage
68
+
69
+ ````tsx
70
+ import { pakentoCMSAPI } from '@pakento/cms-sdk';
71
+
72
+ // Configurar variables de entorno
73
+ // PAKENTO_API_URL=tu_url_de_api
74
+ // PAKENTO_API_KEY=tu_api_key
75
+
76
+ const items = await pakentoCMSAPI.getItems({
77
+ limit: 10,
78
+ page: 1
79
+ });
80
+ ``` de forma rápida y sencilla.
81
+
82
+ ## Instalación
83
+
84
+ ```bash
85
+ npm install @pakento/cms-sdk
86
+ # o
87
+ bun add @pakento/cms-sdk
88
+ ````
89
+
13
90
  ## Configuración
14
91
 
15
92
  Agrega las siguientes variables de entorno a tu proyecto:
@@ -193,4 +270,4 @@ El SDK incluye manejo de errores para:
193
270
 
194
271
  MIT
195
272
 
196
- .build
273
+ .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
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  "use strict";
2
3
  var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
@@ -827,8 +828,9 @@ var PakentoCMSAPI = class {
827
828
  var pakentoCMSAPI = new PakentoCMSAPI();
828
829
 
829
830
  // src/context/CartContext.tsx
830
- var import_react = require("react");
831
+ var React = __toESM(require("react"));
831
832
  var import_jsx_runtime = require("react/jsx-runtime");
833
+ var { createContext, useContext, useReducer } = React;
832
834
  var initialState = {
833
835
  cart: {
834
836
  cartItems: [],
@@ -925,13 +927,13 @@ function cartReducer(state, action) {
925
927
  return state;
926
928
  }
927
929
  }
928
- var CartContext = (0, import_react.createContext)(null);
930
+ var CartContext = createContext(null);
929
931
  function CartProvider({ children }) {
930
- const [state, dispatch] = (0, import_react.useReducer)(cartReducer, initialState);
932
+ const [state, dispatch] = useReducer(cartReducer, initialState);
931
933
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CartContext.Provider, { value: { state, dispatch }, children });
932
934
  }
933
935
  function useCart() {
934
- const context = (0, import_react.useContext)(CartContext);
936
+ const context = useContext(CartContext);
935
937
  if (!context) {
936
938
  throw new Error("useCart must be used within a CartProvider");
937
939
  }
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
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  // src/services/api.ts
2
4
  import axios, { AxiosError } from "axios";
3
5
  import { Redis } from "@upstash/redis";
@@ -789,8 +791,9 @@ var PakentoCMSAPI = class {
789
791
  var pakentoCMSAPI = new PakentoCMSAPI();
790
792
 
791
793
  // src/context/CartContext.tsx
792
- import { createContext, useContext, useReducer } from "react";
794
+ import * as React from "react";
793
795
  import { jsx } from "react/jsx-runtime";
796
+ var { createContext, useContext, useReducer } = React;
794
797
  var initialState = {
795
798
  cart: {
796
799
  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.2",
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",