# 🛠️ Guía de Desarrollo - Karibeo ## Configuración del Entorno ### Requisitos del Sistema - **Node.js**: >= 18.0.0 (recomendado 20.x LTS) - **npm**: >= 9.0.0 o **yarn**: >= 1.22.0 - **Git**: >= 2.30.0 - **Editor**: VSCode (recomendado) con extensiones ### Extensiones VSCode Recomendadas ```json { "recommendations": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "bradlc.vscode-tailwindcss", "formulahendry.auto-rename-tag", "christian-kohler.path-intellisense", "dsznajder.es7-react-js-snippets", "mikestead.dotenv" ] } ``` ## Setup Inicial ### 1. Clonar el Repositorio ```bash git clone https://github.com/tu-usuario/karibeo.git cd karibeo ``` ### 2. Instalar Dependencias ```bash npm install # o yarn install ``` ### 3. Configurar Variables de Entorno Crear archivo `.env` en la raíz: ```env # API Backend VITE_API_BASE_URL=https://karibeo.lesoluciones.net:8443/api/v1 # Google Maps VITE_GOOGLE_MAPS_API_KEY=your_google_maps_api_key # Stripe (Pagos) VITE_STRIPE_PUBLIC_KEY=pk_test_... # Analytics (Opcional) VITE_GA_ID=G-XXXXXXXXXX # Sentry (Error Tracking - Opcional) VITE_SENTRY_DSN=https://...@sentry.io/... # Feature Flags (Opcional) VITE_ENABLE_ANALYTICS=true VITE_ENABLE_PWA=false ``` ### 4. Iniciar Servidor de Desarrollo ```bash npm run dev ``` La aplicación estará disponible en: `http://localhost:5173` ## Estructura de Carpetas Detallada ``` karibeo/ ├── .vscode/ # Configuración de VSCode │ ├── settings.json # Configuraciones del workspace │ └── extensions.json # Extensiones recomendadas │ ├── docs/ # Documentación │ ├── API.md # Documentación de API │ ├── ARCHITECTURE.md # Arquitectura del sistema │ └── DEVELOPMENT.md # Esta guía │ ├── public/ # Assets estáticos │ ├── favicon.ico │ ├── manifest.json # PWA manifest │ └── robots.txt │ ├── src/ │ ├── assets/ # Recursos (imágenes, fonts) │ │ ├── images/ │ │ └── fonts/ │ │ │ ├── components/ # Componentes React │ │ ├── ui/ # Componentes base (shadcn) │ │ │ ├── button.tsx │ │ │ ├── input.tsx │ │ │ └── ... │ │ │ │ │ ├── admin/ # Componentes de admin │ │ │ ├── ConfigTab.tsx │ │ │ ├── UsersTab.tsx │ │ │ └── ... │ │ │ │ │ ├── hotel/ # Componentes hoteleros │ │ ├── restaurant/ # Componentes de restaurante │ │ ├── roles/ # Sistema de roles │ │ ├── security/ # Componentes de seguridad │ │ └── shared/ # Componentes compartidos │ │ │ ├── contexts/ # React Contexts │ │ ├── AuthContext.tsx │ │ ├── CartContext.tsx │ │ ├── CurrencyContext.tsx │ │ └── LanguageContext.tsx │ │ │ ├── hooks/ # Custom Hooks │ │ ├── useAdminData.ts │ │ ├── useBooking.ts │ │ ├── useChannelManager.ts │ │ └── ... │ │ │ ├── lib/ # Utilidades y helpers │ │ ├── utils.ts # Funciones utilitarias │ │ └── validation.ts # Schemas de validación │ │ │ ├── pages/ # Páginas/Rutas │ │ ├── dashboard/ # Panel de control │ │ │ ├── AdminDashboard.tsx │ │ │ ├── Dashboard.tsx │ │ │ └── ... │ │ │ │ │ ├── Index.tsx # Landing page │ │ ├── SignIn.tsx # Login │ │ └── SignUp.tsx # Registro │ │ │ ├── services/ # Servicios API │ │ ├── adminApi.ts │ │ ├── emergencyApi.ts │ │ └── ... │ │ │ ├── types/ # TypeScript types │ │ ├── index.ts │ │ └── roles.ts │ │ │ ├── i18n/ # Internacionalización │ │ ├── en.ts │ │ └── es.ts │ │ │ ├── App.tsx # Componente principal │ ├── main.tsx # Entry point │ └── index.css # Estilos globales │ ├── .eslintrc.js # Configuración ESLint ├── .prettierrc # Configuración Prettier ├── tailwind.config.ts # Configuración Tailwind ├── tsconfig.json # Configuración TypeScript ├── vite.config.ts # Configuración Vite └── package.json # Dependencias y scripts ``` ## Convenciones de Código ### Nomenclatura #### Archivos ```typescript // PascalCase para componentes UserProfile.tsx AdminDashboard.tsx // camelCase para utilidades y hooks useAuth.ts formatCurrency.ts // kebab-case para estilos user-profile.css ``` #### Variables y Funciones ```typescript // camelCase para variables y funciones const userName = "John"; function getUserData() {} // PascalCase para componentes y clases const UserCard = () => {}; class ApiClient {} // UPPER_SNAKE_CASE para constantes const MAX_RETRY_ATTEMPTS = 3; const API_BASE_URL = "https://..."; ``` #### Interfaces y Types ```typescript // PascalCase con prefijo "I" opcional interface UserProfile {} interface IUserProfile {} // alternativa type UserRole = 'admin' | 'user'; ``` ### Formato de Código #### Imports ```typescript // 1. Imports de librerías externas import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; // 2. Imports de componentes UI import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; // 3. Imports de componentes propios import { UserCard } from '@/components/UserCard'; // 4. Imports de hooks y contexts import { useAuth } from '@/contexts/AuthContext'; import { useAdminData } from '@/hooks/useAdminData'; // 5. Imports de utilidades y tipos import { cn } from '@/lib/utils'; import type { User } from '@/types'; // 6. Imports de assets import logo from '@/assets/logo.png'; // 7. Imports de estilos import './styles.css'; ``` #### Componentes Funcionales ```typescript // Buena práctica interface UserCardProps { user: User; onEdit?: (id: string) => void; className?: string; } export const UserCard: React.FC = ({ user, onEdit, className }) => { const [isExpanded, setIsExpanded] = useState(false); useEffect(() => { // Effect logic }, []); const handleClick = () => { setIsExpanded(!isExpanded); }; return (
{/* JSX */}
); }; ``` ### TypeScript #### Tipado Estricto ```typescript // ✅ Bueno interface User { id: string; name: string; email: string; } const getUser = (id: string): Promise => { return api.get(`/users/${id}`); }; // ❌ Evitar const getUser = (id: any): any => { return api.get(`/users/${id}`); }; ``` #### Usar Interfaces sobre Types ```typescript // ✅ Preferido para objetos interface UserProfile { name: string; age: number; } // ✅ Usar type para unions, intersections type UserRole = 'admin' | 'user' | 'guest'; type ExtendedUser = UserProfile & { role: UserRole }; ``` ### React Patterns #### Hooks ```typescript // Custom hook export const useUser = (userId: string) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetchUser(userId) .then(setUser) .catch(setError) .finally(() => setLoading(false)); }, [userId]); return { user, loading, error }; }; ``` #### Memoization ```typescript // useMemo para cálculos costosos const expensiveValue = useMemo(() => { return computeExpensiveValue(a, b); }, [a, b]); // useCallback para funciones const handleSubmit = useCallback((data: FormData) => { submitForm(data); }, []); // memo para componentes export const UserCard = memo(({ user }: Props) => { return
{user.name}
; }); ``` ### Tailwind CSS #### Ordenamiento de Clases ```tsx // Orden recomendado: // 1. Layout (display, position) // 2. Box model (width, height, margin, padding) // 3. Typography // 4. Visual (background, border, shadow) // 5. Misc (cursor, transform, transition)
Content
``` #### Usar cn() para Clases Condicionales ```tsx import { cn } from '@/lib/utils';