6 Alto 5 Medio 4 Bajo
Severidad alta
ALTO
Clave de token incorrecta en AdminLayout
src/layouts/AdminLayout.jsx · useEffect
Llama a getTokenData('etiketarToken', 'role') pero la aplicación guarda el token bajo 'frigappToken' en todas partes. El rol siempre será null, rompiendo el filtrado del menú y cualquier control de acceso basado en roles.
ALTO
useEffect duplicado y en conflicto para clave de token
src/layouts/AdminLayout.jsx · segundo useEffect
Hay dos hooks useEffect(()=>{...}, []) idénticos que leen etiketarToken y llaman a setAgency. El segundo es un duplicado inútil — elimínalo.
ALTO
redirect() no navega en React Router v6
src/App.jsx · authContext.signIn
redirect se importa de react-router-dom pero solo funciona dentro de loaders/actions del data-router. Llamarlo en una función normal no hace nada — después del login la URL permanece en /login. Usa el hook useNavigate().
ALTO
getTokenData lanza error cuando no hay token
src/utils/token.js · getTokenData
jwtDecode(localStorage.getItem(token)) — si la clave no existe, getItem devuelve null y jwtDecode(null) lanza una excepción. UserButton y AdminLayout llaman esto al montar sin validación, causando un crash en sesiones nuevas.
ALTO
getAllClientInvoiceData y varias funciones retornan undefined en error
src/api/admin.js · múltiples funciones
~10 funciones usan catch(err) { console.log(err) } sin return. Los consumidores reciben undefined en lugar de un objeto de error, por lo que res.success lanza un TypeError. Usa return err o return { success: false, message: err.message }.
ALTO
Texto ofensivo de prueba en la UI de producción
src/pages/Auth/Login/index.jsx · left-panel Title · src/pages/Admin/Welcome.jsx
La página de login muestra "Y este negro cree que me va a joder." y Welcome.jsx contiene texto similar. Estas cadenas serán visibles para usuarios reales — reemplázalas antes de cualquier release.
Severidad media
MEDIO
Falta exportación de clave en constants.js
src/api/constants.js
getAgencyBySubdomain() se usa en admin.js → setNewPassword pero está en utils/token.js, no en api/constants.js donde se llama como CONS.getAgencyBySubdomain(). Esto lanzará CONS.getAgencyBySubdomain is not a function.
MEDIO
Doble envío de formulario en login
src/pages/Auth/Login/index.jsx
El <form> tiene onSubmit llamando a sendData() y el botón también tiene onClick={sendData}. Presionar Enter o hacer clic dispara dos veces la función, enviando dos requests simultáneos.
MEDIO
Error lógico: validación de formato antes de campos vacíos
src/pages/Auth/Login/index.jsx · sendData
El regex se evalúa primero; solo el else if valida campos vacíos. Un email vacío falla el regex y muestra "formato inválido" en lugar de "campos vacíos". Invierte el orden.
MEDIO
updateProductData tiene el null check invertido
src/api/admin.js · updateProductData
(comImg === null) ? formData.append('file', comImg) : formData.append('file', comImg.file, comImg.file.name) — cuando comImg es null, se añade null al form. Las ramas están invertidas.
MEDIO
deleteUsersData usa URL incorrecta
src/api/admin.js · deleteUsersData
Envía DELETE ${CONS.admin}/${id} pero otras funciones usan ${CONS.admin}/users/${id}. Probablemente el endpoint correcto es /api/admin/users/${id}.
Severidad baja / calidad de código
BAJO
Importaciones no usadas: Avatar y ScrollArea
src/layouts/AdminLayout.jsx
Avatar y ScrollArea se importan de @mantine/core pero no se usan. Elimínalos.
BAJO
getAgencyData es un stub sin implementación
src/utils/token.js
El cuerpo está comentado y siempre devuelve undefined. Implementa o elimina la función.
BAJO
URL de producción hardcodeada en constants.js
src/api/constants.js
La URL https://frigapp-back.azurewebsites.net/api está hardcodeada. Usa import.meta.env.VITE_API_URL.
BAJO
Componentes de página vacíos
src/pages/Admin/*
Páginas como Calculator, Products, Support solo renderizan <h1>. Falta implementación.