Frontend de MoviPass: aplicación SPA construida con React + Vite para la búsqueda, reserva y venta de tickets de buses interprovinciales.
Este README está orientado a desarrolladores: contiene pasos rápidos para levantar el entorno, descripción de la estructura, comandos útiles, y notas de integración con el backend.
- Framework: React 18 + Vite
- Estilos: Tailwind CSS (+
tailwindcss-animateopcional) - UI: shadcn/ui (componentes), Lucide React (iconos)
- HTTP: Axios (cliente central en
src/services/api.js) - Fechas: date-fns
- Extras: react-hot-toast, qrcode.react
Node.js>= 16 (recomendado 18+)npm>= 8 (oyarn/pnpm)- Backend API accesible (por defecto
http://localhost:3000/api)
- Clonar el repositorio
git clone https://github.com/Davidl2002/Buses_Front.git
cd MovPass_Front- Instalar dependencias
npm install- Variables de entorno
Crear un archivo .env en la raíz (opcional) con la URL del backend y otras claves:
VITE_API_URL=http://localhost:3000/api
VITE_PAYPAL_CLIENT_ID=tu_client_id_paypal- Levantar en modo desarrollo
npm run devEl servidor se sirve por defecto en http://localhost:5173.
- Desarrollo:
npm run dev - Build producción:
npm run build - Previsualizar build:
npm run preview - Formateo / Lint (si existe):
npm run format/npm run lint
- La URL base del API se configura a través de la variable
VITE_API_URLy ensrc/services/api.js. - En desarrollo,
vite.config.jsincluye un proxy para redirigir/apial backend local.
Si el backend está en otro host/puerto, ajusta VITE_API_URL o el proxy de Vite.
src/
├─ components/ # Componentes reutilizables y por área
│ ├─ public/ # Buscador público: TripSearch, SeatSelection, SeatMap
│ ├─ admin/ # Componentes administrativos (AdminSeatMap...)
│ └─ ui/ # Wrappers de UI (botones, inputs, dialogs)
├─ contexts/ # AuthContext.jsx
├─ hooks/ # Hooks personalizados (useActiveCooperativaId...)
├─ pages/ # Rutas publicadas (home, login, admin, driver...)
├─ services/ # Cliente Axios (`api.js`) y servicios (`index.js`)
├─ lib/ # Constantes y utilidades
├─ App.jsx
├─ main.jsx
└─ index.css
- Búsqueda avanzada de viajes (incluye paradas intermedias y filtros)
- Visualización y selección de asientos con motor en tiempo real (Socket.IO en backend)
- Integración de pagos con PayPal (flow de sandbox y ejecución)
- Gestión administrativa: rutas, frecuencias, buses, viajes, reportes
- Crear tickets manuales desde admin/oficinista con validación por viaje/fecha
- SUPER_ADMIN: gestión global de cooperativas
- ADMIN: gestión de recursos dentro de su cooperativa
- OFICINISTA: ventas y emisión manual de tickets
- CHOFER: manifiesto, validación QR, gastos
- CLIENTE: compra y historial
- Buscar en consola:
TripSearch.jsximprime logs con prefijo[TripSearch...]para diagnosticar coincidencias y normalizaciones. - Network: filtrar por
/api/tripsy/api/ticketsen la pestaña Network. - Si el frontend no muestra un viaje esperado, pega el JSON devuelto por
/api/trips/searcho/api/tripspara que podamos ajustar la normalización o aplicar un fallback cliente.
# Instalar dependencias
npm install
# Desarrollo
npm run dev
# Build producción
npm run build
# Previsualizar build
npm run preview- Crear una rama descriptiva:
git checkout -b feat/descripcion-corta- Hacer cambios, probar localmente y commitear:
git add .
git commit -m "feat: descripción breve"
git push origin feat/descripcion-corta- Abrir Pull Request hacia
mainodevelopdescribiendo cambios y pasos para probar.
Esta sección amplía la documentación anterior y cubre en detalle la estructura del frontend, los componentes clave, los flujos de datos con el backend, variables de entorno, despliegue, debugging avanzado y recomendaciones para desarrollo y colaboración.
Si trabajas en este repo: asegúrate de usar la rama develop para features en progreso y crear ramas por feature para PRs. Este README asume que el backend (MoviPass_Back) está disponible y documentado por separado.
MoviPass Frontend es una SPA para búsqueda, reserva y administración de tickets de buses interprovinciales. Está diseñada para operar en un modelo multi-tenant (cooperativas). Soporta roles (cliente, admin, oficinista, chofer, superadmin) y se integra con servicios externos (PayPal, Brevo/email). El frontend consume una API REST (endpoints /api/*) y se apoya en sockets para el motor de asientos en tiempo real.
Objetivos principales:
- Facilitar la búsqueda y compra de tickets por usuario final.
- Permitir gestión administrativa (rutas, frecuencias, buses, viajes).
- Proporcionar herramientas operativas (manifiesto de chofer, registro de gastos).
Coloca estas variables en .env en la raíz:
VITE_API_URL— URL base de la API (ej.http://localhost:3000/api)VITE_PAYPAL_CLIENT_ID— client id de PayPal (sandbox/prod)VITE_ANALYTICS_ID— (opcional) ID para analyticsVITE_APP_ENV—development/production
Nota: No incluyas secrets sensibles en repositorios públicos.
# Instalar dependencias
npm install
# Desarrollo (Vite)
npm run dev
# Build producción
npm run build
# Previsualizar build
npm run previewSi prefieres yarn o pnpm cambia los comandos por yarn / pnpm install y los scripts equivalentes.
Explicación de carpetas y archivos clave (raíz src/):
-
src/components/— Componentes organizados por área:public/: componentes públicos comoTripSearch.jsx,SeatMap.jsx,TripSelection.admin/: componentes para panel administrativo (AdminSeatMap.jsx,AdminSidebar.jsx,SeatDesigner.jsx).ui/: componentes de UI reutilizables (botones, inputs, dialogs, tabla, selects). Estos son wrappers sobre shadcn/ui.
-
src/pages/— Rutas principales agrupadas por roles:pages/Home.jsx,Login.jsx,Register.jsx,MyTickets.jsx,Profile.jsx.pages/admin/: gestión completa (BusesManagement, RoutesManagement, TripsManagement, TicketsManagement, ReportsManagement, etc.).pages/driver/: manifiestos y flujos para chofer (MyTrips.jsx,Manifest.jsx).pages/oficinista/: ventas en taquilla (VenderTicket.jsx,MisVentas.jsx).
-
src/services/— Clienteapi.js(Axios configurado) yindex.jscon servicios agrupados:tripService:search,getAll,getById,getPublicById.ticketService:create,reserveSeat,myTickets, etc.
-
src/contexts/AuthContext.jsx— ProveeuseAuth()y manejo de token/usuario y roles. -
src/hooks/— Hooks propios (ej.useActiveCooperativaId.js,usePermissions.js). -
src/lib/—constants.js,utils.jscon helpers (formateo de fecha, normalización de objetos, parse de parada/itinerario). -
src/utils/—errorHandlers.js(manejadores de errores comunes y adaptadores de mensajes para UI).
Archivos de configuración importantes:
vite.config.js— proxy de desarrollo y configuraciones del bundler.tailwind.config.js— rutas a contenido, plugins, tema.postcss.config.js— configuración PostCSS.
Describo los flujos más relevantes y dónde intervenir si necesitas cambios:
-
Búsqueda de viajes (Home →
TripSearch.jsx):- Input: origen, destino, fecha, filtros.
- Llama a
tripService.search(GET /trips/search) para resultados públicos. - Si el backend no devuelve coincidencias esperadas por paradas intermedias, el componente aplica normalización y un fallback que llama a
tripService.getAlly realiza filtrado cliente por secuencia de paradas. - Resultado: lista de
tripsnormalizados (precio, capacidad, departureTime, status).
-
Selección y compra (SeatSelection → Checkout):
- Seleccionar butaca bloquea temporalmente el asiento via socket (backend).
- Reserva y pago:
ticketService.reserveSeat→ iniciar pago PayPalPOST /tickets/payment/paypal/initiate→ completar conexecute.
-
Crear Ticket Manual (admin/oficinista →
TicketsManagement.jsx):- Flujo: elegir frecuencia → ver fechas futuras con viajes en
SCHEDULED→ seleccionar viaje → cargar buses asociados a ese viaje (GET /trips/:id) → seleccionar bus y asiento → crear ticket. - Cambios recientes en el código hacen que el selector de buses muestre solo buses asignados al viaje/fecha seleccionado.
- Flujo: elegir frecuencia → ver fechas futuras con viajes en
-
Vista Chofer (
MyTrips.jsx,Manifest.jsx):MyTrips.jsxfiltra viajes para mostrar solo los viajes asignados al chofer autenticado (cliente con rol CHOFER).Manifest.jsxconsumeGET /operations/manifest/:tripIdpara mostrar pasajeros con tickets validados.
Estos endpoints están documentados en el backend; el frontend asume las rutas:
- Autenticación:
POST /api/auth/login,POST /api/auth/register,GET /api/auth/verify-email. - Trips públicos:
GET /api/trips/search,GET /api/trips,GET /api/trips/:id,GET /api/trips/public/:id. - Tickets:
POST /api/tickets,POST /api/tickets/reserve-seat,GET /api/tickets/my-tickets,GET /api/tickets/seat-map/:tripId. - Operaciones:
POST /api/operations/validate-qr,GET /api/operations/manifest/:tripId.
Si extiendes servicios en src/services/index.js, mantén los nombres de funciones consistentes (tripService.search, ticketService.create, etc.).
- El
AuthContextguardaaccessTokenycurrentUser. - Las rutas protegidas usan
ProtectedRoute.jsxque verifica roles y redirige cuando no hay permisos. - Roles:
SUPER_ADMIN,ADMIN,OFICINISTA,CHOFER,CLIENTE.
Recomendación: para pruebas rápidas crea usuarios desde prisma/seed.ts (backend). Para probar permisos, inicia sesión con cada rol y verifica vistas disponibles.
- Algunas comparaciones utilizan la zona
America/Guayaquil(UTC-5). Para evitar errores de cálculo, normaliza fechas del backend a ISO y presenta localmente condate-fns. - En
TicketsManagement.jsxse usa lógica para filtrar solo viajes futuros con estadoSCHEDULEDantes de mostrar fechas disponibles.
- Centralizar llamadas a API en
src/services/. - Mantener componentes UI puros y delegar lógica en hooks o servicios.
- Documentar nuevos endpoints y actualizar
src/services/index.js. - Evitar manipular estado global en operaciones asíncronas (usar variables locales y update único de estado).
Davidl2002 — dl735894@gmail.com