# Catalogo de Componentes Frontend - MiChangarrito
**Version:** 1.0.0
**Actualizado:** 2026-01-20
**Framework:** React 19.2.0 + TypeScript
**Bundler:** Vite 7.2.4
**Estilos:** TailwindCSS 4.1.18
---
## Indice
1. [Resumen Ejecutivo](#resumen-ejecutivo)
2. [Componentes de Layout](#componentes-de-layout)
3. [Componentes de Pagos](#componentes-de-pagos)
4. [Paginas](#paginas)
- [Autenticacion](#autenticacion)
- [Dashboard y Operaciones](#dashboard-y-operaciones)
- [Finanzas](#finanzas)
- [Marketplace y Extras](#marketplace-y-extras)
5. [Contexts](#contexts)
6. [Servicios API](#servicios-api)
---
## Resumen Ejecutivo
| Metrica | Valor |
|---------|-------|
| Total Componentes Reutilizables | 3 |
| Total Paginas | 14 |
| Total Contexts | 1 (AuthContext) |
| Total Lineas de Codigo (aprox) | ~5,500 |
---
## Componentes de Layout
### Layout.tsx
- **Archivo:** `src/components/Layout.tsx`
- **Lineas:** 178
- **Descripcion:** Layout principal de la aplicacion con sidebar responsive y navegacion completa.
- **Props:** Ninguna (usa `` de react-router-dom)
- **Estado interno:**
- `sidebarOpen: boolean` - Control de sidebar mobile
- **Hooks usados:**
- `useState` - Estado del sidebar
- `useNavigate` - Navegacion programatica
- `useAuth` - Contexto de autenticacion
- **Dependencias:**
- `react-router-dom` (Outlet, NavLink, useNavigate)
- `lucide-react` (16 iconos: LayoutDashboard, Package, ShoppingCart, Users, CreditCard, Boxes, Settings, Menu, X, Store, LogOut, Gift, FileText, Truck, Coins, QrCode)
- `clsx` - Clases condicionales
- `AuthContext` - Usuario y logout
- **Funcionalidades:**
- Sidebar fijo en desktop (lg:)
- Sidebar overlay en mobile con backdrop oscuro
- Navegacion a 12 rutas principales
- Avatar con iniciales del tenant
- Boton de logout
- Header mobile con hamburger menu
---
## Componentes de Pagos
### ClabeDisplay.tsx
- **Archivo:** `src/components/payments/ClabeDisplay.tsx`
- **Lineas:** 113
- **Descripcion:** Muestra y permite copiar la CLABE virtual del tenant para recibir transferencias SPEI.
- **Props:**
- `showCreateButton?: boolean` - Mostrar boton para crear CLABE (default: true)
- `beneficiaryName?: string` - Nombre del beneficiario
- **Estado interno:**
- `copied: boolean` - Indica si se copio la CLABE
- **Hooks usados:**
- `useState` - Estado de copiado
- `useQuery` - Fetch de CLABE existente
- `useMutation` - Creacion de CLABE
- `useQueryClient` - Invalidacion de cache
- **Dependencias:**
- `@tanstack/react-query` (useQuery, useMutation, useQueryClient)
- `lucide-react` (Copy, Check, Building)
- `codiSpeiApi` - API de CoDi/SPEI
- **Funcionalidades:**
- Mostrar CLABE formateada (XXX XXX XXXX XXXX XXXX)
- Copiar al clipboard con feedback visual
- Crear CLABE virtual si no existe
- Estados de loading y vacio
### CodiQR.tsx
- **Archivo:** `src/components/payments/CodiQR.tsx`
- **Lineas:** 168
- **Descripcion:** Genera y muestra QR de cobro CoDi con temporizador de expiracion.
- **Props:**
- `amount: number` - Monto a cobrar (requerido)
- `description?: string` - Descripcion del cobro
- `saleId?: string` - ID de venta asociada
- `onSuccess?: () => void` - Callback al confirmar pago
- `onCancel?: () => void` - Callback al cancelar
- **Estado interno:**
- `transactionId: string | null` - ID de transaccion generada
- `timeLeft: number` - Segundos restantes (inicia en 300)
- **Hooks usados:**
- `useState` - Estado del QR y timer
- `useEffect` - Generacion automatica y countdown
- `useMutation` - Generar QR
- `useQuery` - Polling del estado (cada 3s)
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (QrCode, Clock, Check, X, RefreshCw)
- `codiSpeiApi` - API de CoDi/SPEI
- **Funcionalidades:**
- Genera QR automaticamente al montar
- Countdown de 5 minutos
- Polling cada 3 segundos para verificar pago
- Estados: loading, confirmado, expirado
- Regenerar QR
---
## Paginas
### Autenticacion
#### Login.tsx
- **Archivo:** `src/pages/Login.tsx`
- **Lineas:** 104
- **Descripcion:** Pagina de inicio de sesion con telefono y PIN.
- **Props:** Ninguna (export default)
- **Estado interno:**
- `phone: string` - Telefono (10 digitos)
- `pin: string` - PIN (4-6 digitos)
- `error: string` - Mensaje de error
- `isLoading: boolean` - Estado de carga
- **Hooks usados:**
- `useState` - Estados del formulario
- `useNavigate` - Redireccion post-login
- `useAuth` - Funcion login
- **Dependencias:**
- `react-router-dom` (useNavigate, Link)
- `AuthContext` - Autenticacion
- **Validaciones:**
- Telefono: 10 digitos numericos
- PIN: 4-6 digitos numericos
- **Ruta:** `/login` (publica)
#### Register.tsx
- **Archivo:** `src/pages/Register.tsx`
- **Lineas:** 242
- **Descripcion:** Pagina de registro de nuevos negocios.
- **Props:** Ninguna (export default)
- **Estado interno:**
- `formData: object` - Datos del formulario completo
- `error: string` - Mensaje de error
- `isLoading: boolean` - Estado de carga
- **Hooks usados:**
- `useState` - Estados del formulario
- `useNavigate` - Redireccion post-registro
- `useAuth` - Funcion register
- **Dependencias:**
- `react-router-dom` (useNavigate, Link)
- `AuthContext` - Autenticacion
- **Campos del formulario:**
- `name` - Nombre del negocio (requerido)
- `ownerName` - Nombre del propietario (requerido)
- `businessType` - Tipo de negocio (select)
- `phone` - Telefono 10 digitos (requerido)
- `pin` - PIN 4-6 digitos (requerido)
- `confirmPin` - Confirmacion de PIN (requerido)
- `email` - Email (opcional)
- **Tipos de negocio:** tiendita, fonda, taqueria, tortilleria, verduleria, otro
- **Ruta:** `/register` (publica)
---
### Dashboard y Operaciones
#### Dashboard.tsx
- **Archivo:** `src/pages/Dashboard.tsx`
- **Lineas:** 270
- **Descripcion:** Panel principal con metricas, pedidos recientes y alertas de stock.
- **Estado interno:** Ninguno (todo via React Query)
- **Hooks usados:**
- `useQuery` (x3) - Stats, pedidos recientes, stock bajo
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (TrendingUp, ShoppingCart, Users, CreditCard, Package, AlertCircle, Loader2)
- APIs: dashboardApi, ordersApi, inventoryApi
- **Secciones:**
- Grid de 4 tarjetas de estadisticas
- Pedidos recientes (ultimos 5)
- Alertas de stock bajo
- **Componentes internos:**
- `LoadingSpinner` - Indicador de carga
- `ErrorMessage` - Mensaje de error
- **Ruta:** `/dashboard`
#### Products.tsx
- **Archivo:** `src/pages/Products.tsx`
- **Lineas:** 512
- **Descripcion:** Catalogo CRUD de productos con busqueda y filtrado por categoria.
- **Estado interno:**
- `search: string` - Termino de busqueda
- `category: string` - Filtro de categoria
- `showModal: boolean` - Modal crear/editar
- `editingProduct: Product | null` - Producto en edicion
- `deletingProduct: Product | null` - Producto a eliminar
- `formData: ProductFormData` - Datos del formulario
- `formError: string | null` - Error del formulario
- **Hooks usados:**
- `useState` (x7) - Estados del CRUD
- `useQuery` - Lista de productos
- `useMutation` (x3) - Create, update, delete
- `useQueryClient` - Invalidacion
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Search, Plus, Edit, Trash2, Package, X, AlertCircle, Loader2)
- `productsApi`
- **Categorias:** bebidas, botanas, lacteos, panaderia, limpieza, abarrotes, otros
- **Ruta:** `/products`
#### Orders.tsx
- **Archivo:** `src/pages/Orders.tsx`
- **Lineas:** 250
- **Descripcion:** Gestion de pedidos con flujo de estados.
- **Estado interno:**
- `filter: string` - Filtro de estado
- **Hooks usados:**
- `useState` - Filtro
- `useQuery` (x2) - Pedidos filtrados y todos
- `useMutation` - Cambio de estado
- `useQueryClient` - Invalidacion
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Clock, CheckCircle, XCircle, ChefHat, Package, Loader2, AlertCircle, RefreshCw)
- `clsx`
- `ordersApi`
- **Estados de pedido:** pending, confirmed, preparing, ready, completed, cancelled
- **Flujo:** pending -> confirmed -> preparing -> ready -> completed
- **Ruta:** `/orders`
#### Customers.tsx
- **Archivo:** `src/pages/Customers.tsx`
- **Lineas:** 390
- **Descripcion:** Directorio de clientes con CRUD y balance de fiado.
- **Estado interno:**
- `search: string` - Busqueda
- `isModalOpen: boolean` - Modal crear/editar
- `editingCustomer: Customer | null`
- `formData: CustomerFormData`
- `formError: string | null`
- **Hooks usados:**
- `useState` (x5)
- `useQuery` - Lista clientes
- `useMutation` (x2) - Create, update
- `useQueryClient`
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Search, Plus, Phone, Mail, MapPin, CreditCard, X, Loader2, AlertCircle, Edit2)
- `customersApi`
- **Informacion mostrada:** nombre, telefono, email, direccion, compras, total gastado, fiado
- **Ruta:** `/customers`
#### Inventory.tsx
- **Archivo:** `src/pages/Inventory.tsx`
- **Lineas:** 357
- **Descripcion:** Control de existencias con movimientos y alertas.
- **Estado interno:**
- `showLowStock: boolean` - Toggle filtro stock bajo
- **Hooks usados:**
- `useState`
- `useQuery` (x4) - Productos, movimientos, stock bajo, alertas
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Package, TrendingUp, TrendingDown, AlertTriangle, Plus, Minus, Loader2, AlertCircle, RefreshCw)
- `clsx`
- APIs: productsApi, inventoryApi
- **Secciones:**
- Banner de alertas
- Cards de resumen (unidades, valor, stock bajo)
- Tabla de inventario con barras de progreso
- Movimientos recientes
- **Ruta:** `/inventory`
---
### Finanzas
#### Fiado.tsx
- **Archivo:** `src/pages/Fiado.tsx`
- **Lineas:** 660
- **Descripcion:** Gestion de cuentas de credito con pagos y recordatorios.
- **Estado interno:**
- `filter: 'all' | 'pending' | 'overdue'` - Filtro
- `showNewFiadoModal: boolean`
- `showPaymentModal: boolean`
- `selectedFiado: Fiado | null`
- **Hooks usados:**
- `useState` (x4)
- `useMemo` (x3) - Stats, filtrado, pagos recientes
- `useQuery` (x2) - Fiados, clientes
- `useMutation` (x2) - Crear fiado, registrar pago
- `useQueryClient`
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (CreditCard, AlertTriangle, CheckCircle, Clock, Plus, Loader2, X, DollarSign)
- `clsx`
- APIs: fiadosApi, customersApi
- **Componentes internos:**
- `NewFiadoModal` - Crear nuevo fiado
- `PaymentModal` - Registrar pago
- **Ruta:** `/fiado`
#### CodiSpei.tsx
- **Archivo:** `src/pages/CodiSpei.tsx`
- **Lineas:** 450
- **Descripcion:** Cobros via CoDi (QR) y SPEI (CLABE virtual).
- **Estado interno:**
- `activeTab: 'codi' | 'spei'`
- `qrAmount: string`
- `qrDescription: string`
- `copied: boolean`
- **Hooks usados:**
- `useState` (x4)
- `useQuery` (x4) - Transacciones CoDi, info SPEI, transacciones SPEI
- `useMutation` (x2) - Generar QR, crear CLABE
- `useQueryClient`
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (QrCode, CreditCard, Copy, Check, Clock, ArrowDownLeft, RefreshCw, Plus, Smartphone)
- `codiSpeiApi`
- **Tabs:**
- CoDi: Generar QR, historial de cobros
- SPEI: Card con CLABE, historial de transferencias
- **Ruta:** `/codi-spei`
#### Invoices.tsx
- **Archivo:** `src/pages/Invoices.tsx`
- **Lineas:** 668
- **Descripcion:** Facturacion electronica CFDI 4.0 con timbrado y envio.
- **Estado interno:**
- `filter: string` - Filtro de estado
- `showConfig: boolean` - Modal configuracion
- `showNewInvoice: boolean` - Modal nueva factura
- **Hooks usados:**
- `useState` (x3)
- `useQuery` (x3) - Facturas, resumen, config fiscal
- `useMutation` (x2) - Timbrar, enviar
- `useQueryClient`
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (FileText, Send, XCircle, CheckCircle, Clock, Download, Plus, Settings, AlertCircle)
- `clsx`
- `invoicesApi`
- **Componentes internos:**
- `TaxConfigModal` - Configuracion fiscal (RFC, regimen, PAC)
- `NewInvoiceModal` - Crear factura con conceptos
- **Estados factura:** draft, pending, stamped, sent, cancelled
- **Ruta:** `/invoices`
#### Tokens.tsx
- **Archivo:** `src/pages/Tokens.tsx`
- **Lineas:** 329
- **Descripcion:** Tienda de tokens para servicios premium con Stripe checkout.
- **Estado interno:**
- `selectedPackage: string | null`
- **Hooks usados:**
- `useState`
- `useQuery` (x3) - Balance, paquetes, historial
- `useMutation` - Compra con redirect a Stripe
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Coins, Package, TrendingUp, Clock, Check, ShoppingCart, MessageSquare, FileText, Sparkles)
- `billingApi`
- **Secciones:**
- Card de balance con gradiente
- Grid de costos por servicio
- Grid de paquetes de tokens
- Historial de uso
- **Ruta:** `/tokens`
---
### Marketplace y Extras
#### Marketplace.tsx
- **Archivo:** `src/pages/Marketplace.tsx`
- **Lineas:** 731
- **Descripcion:** Marketplace B2B para comprar a proveedores.
- **Estado interno:**
- `view: 'suppliers' | 'orders' | 'favorites'`
- `selectedCategory: string | null`
- `searchQuery: string`
- `selectedSupplier: any`
- `showCart: boolean`
- `cart: { product, quantity }[]`
- **Hooks usados:**
- `useState` (x6)
- `useQuery` (x3) - Proveedores, ordenes, favoritos
- `useMutation` - Crear orden
- `useQueryClient`
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Store, Search, Star, Heart, ShoppingCart, Package, Truck, Clock, CheckCircle, XCircle, MapPin, Phone, ChevronRight)
- `clsx`
- `marketplaceApi`
- **Componentes internos:**
- `SupplierCard` - Tarjeta de proveedor
- `OrderCard` - Tarjeta de orden
- `SupplierDetailModal` - Detalle con productos
- `CartModal` - Carrito de compras
- **Categorias:** bebidas, botanas, lacteos, pan, abarrotes, limpieza
- **Ruta:** `/marketplace`
#### Referrals.tsx
- **Archivo:** `src/pages/Referrals.tsx`
- **Lineas:** 271
- **Descripcion:** Sistema de referidos con codigo unico y recompensas.
- **Estado interno:**
- `copied: boolean`
- **Hooks usados:**
- `useState`
- `useQuery` (x2) - Stats, lista de referidos
- **Dependencias:**
- `@tanstack/react-query`
- `lucide-react` (Gift, Users, Copy, Share2, Check, Clock, X)
- `referralsApi`
- **Secciones:**
- Card de compartir con codigo
- Grid de estadisticas
- Como funciona (3 pasos)
- Lista de referidos
- **Ruta:** `/referrals`
#### Settings.tsx
- **Archivo:** `src/pages/Settings.tsx`
- **Lineas:** 166
- **Descripcion:** Configuracion del negocio (mock data - pendiente API).
- **Estado interno:** Ninguno (formularios no controlados)
- **Hooks usados:** Ninguno
- **Dependencias:**
- `lucide-react` (Store, CreditCard, Bell, MessageSquare, Shield)
- **Secciones:**
- Informacion del negocio
- Configuracion de fiado
- WhatsApp Business
- Notificaciones
- Plan de suscripcion
- **Estado:** MOCK DATA - Pendiente implementar endpoints backend
- **Ruta:** `/settings`
---
## Contexts
### AuthContext
- **Archivo:** `src/contexts/AuthContext.tsx`
- **Lineas:** ~120
- **Descripcion:** Gestion de autenticacion y sesion del usuario.
- **Provee:**
- `user: User | null` - Usuario autenticado
- `tenant: Tenant | null` - Tenant/negocio
- `isAuthenticated: boolean` - Estado de autenticacion
- `isLoading: boolean` - Cargando sesion
- `login(phone, pin): Promise` - Iniciar sesion
- `register(data): Promise` - Registrar negocio
- `logout(): void` - Cerrar sesion
- **Persistencia:** localStorage (accessToken, refreshToken, user, tenant)
---
## Servicios API
### lib/api.ts
- **Archivo:** `src/lib/api.ts`
- **Lineas:** ~400
- **Descripcion:** Cliente Axios con todos los endpoints agrupados.
**Grupos de API:**
| Grupo | Endpoints |
|-------|-----------|
| `authApi` | register, login, refresh, changePin |
| `productsApi` | getAll, getById, create, update, delete |
| `ordersApi` | getAll, getById, create, updateStatus |
| `customersApi` | getAll, getById, create, update, getFiado |
| `inventoryApi` | getMovements, createMovement, getLowStock, getAlerts |
| `dashboardApi` | getStats, getSalesChart, getTopProducts |
| `fiadosApi` | getAll, getPending, create, pay, cancel |
| `invoicesApi` | getAll, getSummary, getTaxConfig, saveTaxConfig, create, stamp, send, cancel, download |
| `marketplaceApi` | getSuppliers, getSupplierProducts, getOrders, createOrder, getFavorites, addFavorite |
| `referralsApi` | getStats, getMyReferrals, generateCode, validateCode |
| `billingApi` | getTokenBalance, getTokenPackages, getTokenUsage, purchaseTokens |
| `codiSpeiApi` | getClabe, createClabe, generateQr, getCodiStatus, getCodiTransactions, getSpeiTransactions |
**Interceptores:**
- **Request:** Agrega Bearer token automaticamente
- **Response:** Maneja 401, intenta refresh token, limpia localStorage si falla