El proyecto no tiene configurada la regla react-hooks/rules-of-hooks ni react-hooks/exhaustive-deps. Muchos de los errores de hooks encontrados habrían sido capturados en CI antes de llegar a revisión. Instalar con npm install -D eslint-plugin-react-hooks y añadir al config.
src/app/dashboard/leads/actions.ts:14
saveLeadAction acepta FormData sin ningún esquema de validación (zod/yup/valibot) antes de insertarlo en la base de datos.
src/app/dashboard/leads/LeadsDashboard.tsx:3
"use client" pero importa directamente @/lib/db (wrapper de Prisma Client). El módulo accede a DATABASE_URL en el bundle del cliente.
server-only al módulo db para prevenir re-ocurrencias.
src/app/dashboard/leads/LeadsDashboard.tsx:38
fetchLeads usa filterState pero el array de deps está vacío ([]). Los filtros no actualizan la tabla al cambiar.
src/app/dashboard/leads/LeadsDashboard.tsx:42
fetchLeads hace un fetch sin AbortController. Si el componente se desmonta antes de que la promesa resuelva, se producirá un setState on unmounted component y una fuga de memoria.
src/app/dashboard/leads/LeadsDashboard.tsx:87
<div onClick> sin rol, sin tabIndex y sin handler de teclado. Inaccesible para usuarios de teclado y screen readers.
src/app/dashboard/leads/LeadsDashboard.tsx:105
key={index}. Al filtrar, ordenar o eliminar leads, React asociará el estado del componente de fila a la posición, no al elemento, causando bugs visuales.
src/app/dashboard/leads/LeadsDashboard.tsx:100
@tanstack/react-virtual o paginación server-side. Evaluar con React DevTools Profiler antes de decidir.
src/app/dashboard/leads/QuickCaptureForm.tsx:12
<div> en lugar de <form>. Pierde submit-on-Enter nativo, integración con gestores de contraseñas y la semántica del árbol de accesibilidad.
src/app/dashboard/leads/QuickCaptureForm.tsx:45
useState de error por campo. El mismo esquema zod del Server Action puede reutilizarse en cliente con React Hook Form.
@hookform/resolvers/zod para compartir el mismo LeadSchema cliente/servidor.
| Área de revisión | Responsable | Estado en este PR |
|---|---|---|
| Hooks (reglas, deps, cleanup) | react-reviewer ✓ | 2 issues HIGH |
| Server/Client boundary, RSC leaks | react-reviewer ✓ | 1 issue CRITICAL |
| Server Actions (validación, auth) | react-reviewer ✓ | 1 issue CRITICAL |
| Accesibilidad (a11y, ARIA, semántica) | react-reviewer ✓ | 1 issue HIGH |
| Rendimiento (key, virtualización, memo) | react-reviewer ✓ | 2 issues MEDIUM + 1 HIGH |
| Tipado TypeScript, any/as, strict-null | typescript-reviewer → | No revisado aquí |
| Async/await, unhandled rejections | typescript-reviewer → | No revisado aquí |
| XSS genérico via innerHTML, Node.js sec | typescript-reviewer → | No revisado aquí |