Sistema web profesional para la gestión y monitoreo de invernaderos inteligentes. Esta aplicación frontend proporciona una interfaz moderna y responsiva para controlar módulos IoT, visualizar datos en tiempo real, y administrar cultivos de forma eficiente.
- React
^19.2.0- Biblioteca principal para la construcción de interfaces de usuario - TypeScript
^4.9.5- Superset tipado de JavaScript para mayor robustez del código - React Router DOM
^7.9.3- Enrutamiento y navegación entre vistas
- @mui/material
^5.18.0- Componentes de interfaz siguiendo Material Design - @mui/icons-material
^5.18.0- Iconografía Material Design - @emotion/react
^11.14.0- Biblioteca CSS-in-JS para estilizado - @emotion/styled
^11.14.1- API de componentes estilizados para Emotion
- antd
^5.27.4- Sistema de diseño empresarial con componentes avanzados - @ant-design/icons
^6.1.0- Biblioteca de iconos de Ant Design
- Recharts
^3.3.0- Biblioteca para gráficos y visualizaciones de datos responsivas
- Axios
^1.12.2- Cliente HTTP para comunicación con APIs - jwt-decode
^4.0.0- Decodificación de tokens JWT para autenticación - crypto-js
^4.2.0- Biblioteca de criptografía estándar - js-sha256
^0.11.1- Implementación SHA-256 para hashing seguro
- @testing-library/react
^16.3.0- Utilidades para testing de componentes React - @testing-library/jest-dom
^6.9.1- Matchers personalizados de Jest para el DOM - @testing-library/user-event
^13.5.0- Simulación avanzada de eventos de usuario - @testing-library/dom
^10.4.1- Utilidades de testing para consultas del DOM - @types/jest
^27.5.2- Definiciones TypeScript para Jest
- react-scripts
5.0.1- Scripts de configuración y build de Create React App - web-vitals
^2.1.4- Métricas de rendimiento web
- @types/react
^19.2.0- Definiciones TypeScript para React - @types/react-dom
^19.2.0- Definiciones TypeScript para React DOM - @types/node
^16.18.126- Definiciones TypeScript para Node.js - @types/crypto-js
^4.2.2- Definiciones TypeScript para crypto-js
- Node.js (versión 16 o superior)
- npm o yarn
- Clonar el repositorio
git clone <url-del-repositorio>
cd Invernadero-front- Instalar dependencias
npm install-
Configurar variables de entorno Crear un archivo
.enven la raíz del proyecto con las configuraciones necesarias. -
Iniciar el servidor de desarrollo
npm startLa aplicación estará disponible en http://localhost:3000
El componente raíz de la aplicación que orquesta la navegación y la configuración global.
Responsabilidades:
-
Providers Globales:
AntApp: Proporciona contexto para componentes de Ant Design (modales, mensajes, notificaciones).CssBaseline: Normaliza estilos CSS usando Material-UI.BrowserRouter: Habilita el enrutamiento SPA (Single Page Application).
-
Estructura de Rutas:
-
Rutas Públicas:
/*: Landing Page (ResponsiveView) que maneja login/registro y vistas públicas./terminos: Vista de términos y condiciones./activar-cuenta: Vista para verificación de cuenta.
-
Rutas Protegidas (
/admin):- Requiere autenticación y rol de administrador.
- Layout:
AdminLayout. - Sub-rutas: Dashboard, Perfil, Gestión de Usuarios.
-
Rutas Protegidas (
/user):- Requiere autenticación y rol de usuario.
- Layout:
UserLayout. - Sub-rutas: Bienvenida, Perfil, Gestión de Invernaderos (Frío/Cálido).
-
Componentes Clave:
ProtectedRoute: Wrapper que verifica autenticación antes de renderizar el contenido.Navigate: Redirecciones automáticas (ej./admin->/admin/dashboard).
Configuración necesaria para conectar el frontend con los servicios backend.
# URL base de la API Backend (Spring Boot / Node.js)
REACT_APP_API_URL=http://localhost:8080/api/v1Inicia la aplicación en modo desarrollo. La página se recargará automáticamente al realizar cambios en el código.
Invernadero-front/
├── public/ # Archivos estáticos públicos
├── src/
│ ├── components/ # Componentes reutilizables
│ ├── views/ # Vistas/Páginas principales
│ ├── services/ # Servicios y API calls
│ ├── utils/ # Funciones utilitarias
│ ├── types/ # Definiciones TypeScript
│ ├── App.tsx # Componente raíz
│ └── index.tsx # Punto de entrada
├── package.json # Dependencias del proyecto
└── README.md # Documentación
El proyecto cuenta con una estructura organizada de tipos TypeScript que garantiza type-safety en toda la aplicación:
LoginUserData- Credenciales de inicio de sesión (Mail, Password)LoginResponse- Respuesta del servidor con JWT y datos del usuario (token, role, verified)DecodedToken- Token JWT decodificado con información del usuario (rol, sub, exp)
RegisterUserData- Datos para registro de nuevo usuario (UserName, Mail, Password)
VerifyAccountData- Datos para verificar cuenta (userId, VerificationCode)ResendCodeData- Solicitud para reenvío de código de verificación (userId)
UserProfileDto- DTO del perfil de usuario (userName, mail)UserProfileFormValues- Valores del formulario de perfil con contraseñas opcionalesPatchProfileRequest- Solicitud de actualización de perfil (UserName, Mail)ChangePasswordRequest- Solicitud de cambio de contraseña (CurrentPassword, NewPassword, ConfirmNewPassword)
GetUsersDTO- DTO para listado de usuarios (id, mail, userName, role)UserTableData- Datos formateados para tabla de usuarios (key, nombre, correo, rol, id)UpdateUserRequest- Solicitud de actualización de usuario (Mail, UserName)UpdatePasswordRequest- Solicitud de cambio de contraseña (CurrentPassword, NewPassword, ConfirmNewPassword)
Roles- Constantes de roles del sistema (Administrador: 1, User: 2)Status- Constantes de estado del usuario (Active: 1, Inactive: 2)GetUsersDto- DTO completo de usuario con verificación y estadoGetUserDto- DTO individual de usuarioAddUserRequest- Solicitud para agregar nuevo usuario (mail, userName, password, role)PatchUserRequest- Solicitud de actualización parcial (mail, userName)ResendCodeRequest- Solicitud de reenvío de código (userId)UserTableData- Datos completos para tabla (incluye estatus y verificado)
UserProfileDto- DTO completo del perfil (incluye role, status, verified)UpdateProfileRequest- Solicitud de actualización (mail, userName)ChangePasswordFormValues- Valores del formulario de cambio de contraseñaChangePasswordApiRequest- Solicitud API de cambio de contraseña
AddGreenhouseRequest- Solicitud para agregar invernadero (name, location)PatchGreenhouseRequest- Solicitud de actualización de invernaderoGetGreenhouseDto- DTO de invernadero (id, name, location, ownerId)SensorReadingDto- DTO de lectura de sensores (timestamp, temperature, humidity)
ProtectedRouteProps- Props para componente de ruta protegidaProtectedRoute- Componente que valida autenticación para rutas privadas
Los servicios encapsulan toda la lógica de comunicación con el backend mediante Axios, incluyendo interceptores para autenticación y manejo de errores.
Gestiona el inicio de sesión y manejo de tokens JWT.
Funciones:
loginUser(userData: LoginUserData)- Autentica al usuario y retorna JWT y datos del usuariosaveToken(token: string)- Guarda el token JWT en localStoragelogoutUser()- Elimina el token de autenticación del almacenamiento localdecodeToken(token: string)- Decodifica el token JWT para extraer información del usuario
Características:
- Validación de URL base del API
- Logging de errores para debugging
- Decodificación manual de JWT sin dependencias externas
Maneja el registro de nuevos usuarios.
Funciones:
registerUser(userData: RegisterUserData)- Registra un nuevo usuario en el sistema
Características:
- Validación de configuración de URL del API
- Manejo de errores específicos de Axios
- Logging detallado para seguimiento de peticiones
Servicios para verificación de cuentas de usuario.
Funciones:
verifyUserAccount(data: VerifyAccountData)- Verifica la cuenta del usuario con códigoresendVerificationCode(data: ResendCodeData)- Reenvía el código de verificación
Características:
- Interceptor de autorización con token Bearer
- Validación de token en localStorage
- Manejo robusto de errores HTTP
Gestiona el perfil del usuario autenticado.
Funciones:
getUserById(id: string)- Obtiene información del perfil por IDupdateProfile(id: string, data: PatchProfileRequest)- Actualiza datos del perfilchangePassword(id: string, currentPass: string, newPass: string)- Cambia la contraseña del usuario
Características:
- Cliente Axios configurado con baseURL
- Interceptor automático de autenticación Bearer
- Hash SHA-256 de contraseñas usando Web Crypto API
- Hasheo paralelo con
Promise.allpara eficiencia
Servicio básico para obtener listado de usuarios.
Funciones:
getUsers()- Obtiene lista completa de usuarios del sistema
Características:
- Cliente Axios con interceptores de request y response
- Manejo automático de tokens Bearer
- Redirección automática a login en caso de sesión expirada (401)
- Manejo de errores con logging
Servicio completo de CRUD para gestión administrativa de usuarios.
Funciones:
getUsers()- Lista todos los usuarios del sistemacreateUser(userData)- Crea un nuevo usuario con hash de contraseñapatchUser(id, userData)- Actualiza información de un usuariodeleteUser(id)- Elimina un usuario del sistemaresendCode(userId)- Reenvía código de verificación a un usuario
Características:
- Hash SHA-256 automático de contraseñas al crear usuarios
- Interceptor de respuesta para manejo de sesiones
- Cliente Axios con autenticación automática
- Separación de contraseña raw y hasheada para seguridad
Gestiona perfiles desde la perspectiva administrativa.
Funciones:
getProfile(id: string)- Obtiene perfil completo de un usuarioupdateProfile(id: string, data: UpdateProfileRequest)- Actualiza perfil de usuariochangePassword(id: string, currentPass: string, newPass: string)- Cambia contraseña de usuario
Características:
- Hash SHA-256 con Web Crypto API
- Procesamiento paralelo de hash de contraseñas
- Autenticación automática mediante interceptores
Servicio completo para gestión de invernaderos y datos de sensores.
Funciones:
getGreenhousesByUser()- Obtiene invernaderos del usuario autenticadoaddGreenhouse(greenhouseData)- Agrega un nuevo invernaderopatchGreenhouse(id, greenhouseData)- Actualiza datos de un invernaderodeleteGreenhouse(id)- Elimina un invernaderogetColdDataByGreenhouseId(id)- Obtiene lecturas del sensor de invernadero fríogetHotDataByGreenhouseId(id)- Obtiene lecturas del sensor de invernadero cálido
Características:
- Cliente Axios dedicado con baseURL específica
- Validación estricta de configuración de URL
- Interceptor de autenticación Bearer
- Manejo centralizado de errores con mensajes del API
- Función
checkBaseUrl()pre-llamada para validación - Extracción de mensajes de error del backend
- Request Interceptor: Agrega automáticamente el token Bearer de localStorage a todas las peticiones
- Response Interceptor: Maneja errores 401 (sesión expirada) con redirección automática
- Hash SHA-256 implementado con Web Crypto API nativa del navegador
- Tokens JWT almacenados en localStorage
- Validación de URLs del API antes de realizar peticiones
- Todos los servicios usan
REACT_APP_API_URLdel archivo.env - Cliente Axios centralizado por módulo
- Logging detallado para debugging en desarrollo
Los layouts proporcionan la estructura visual consistente de la aplicación, organizados por roles (Admin, Usuario, Landing).
Cabecera del panel administrativo con navegación y autenticación.
Características:
- Diseño responsive con menu horizontal (desktop) y drawer lateral (mobile)
- Gradiente de fondo personalizado con tema oscuro profesional
- Logo de UTEQ con avatar circular con borde gradiente
- Menú de navegación: Perfil, Gestión de Usuarios
- Botón de cierre de sesión con confirmación modal
- Sticky header con z-index 100 para permanencia en scroll
- Interceptor de breakpoints usando
Grid.useBreakpoint() - Animaciones de hover en botones y menú
Navegación:
/admin/profile- Perfil del administrador/admin/users- Gestión de usuarios- Modal de confirmación para logout
Estilos destacados:
- Altura: 70px
- Gradiente:
linear-gradient(135deg, #2A3A6B, #1C2B4E) - Box shadow para profundidad
- Texto con gradiente y WebkitBackgroundClip
Cabecera del panel de usuario con acceso a perfil e invernaderos.
Características:
- Estructura similar a AdminHeader con branding consistente
- Menú de navegación específico para usuario
- Avatar de UTEQ con gradiente verde/amarillo
- Drawer móvil con animaciones suaves
- Botón de logout con estilos de advertencia
Navegación:
/user/profile- Perfil del usuario/user/gestion-invernadero- Gestión de invernaderos- Logout con confirmación
Diferencias con AdminHeader:
- Título: "Panel de Usuario" vs "Admin Panel"
- Opciones de menú orientadas a gestión de invernaderos
- Mismo sistema de theming y responsive
Cabecera principal de la página de aterrizaje con navegación pública.
Características:
- Logo clickeable de UTEQ con efecto de escala en hover
- Título "Invernaderos UTEQ" con gradiente de texto
- Navegación condicional basada en la ruta actual
- Delegación de menú a componentes Desktop/Mobile
- Sticky positioning con backdrop-filter blur
- Alturas responsive: 60px (xs), 72px (md), 80px (lg)
Props:
onRegisterClick- Handler para registroonLoginClick- Handler para loginonAboutClick- Handler para "sobre nosotros"onLogoClick- Handler para click en logoonHomeClick- Handler para volver a inicio
Componentes hijos:
DesktopMenu- Menú horizontal para pantallas grandesMobileMenu- Drawer lateral para móviles
Componente de navegación horizontal para dispositivos grandes.
Características:
- Botones con bordes translúcidos y efectos hover
- Navegación dinámica que oculta botón de página actual
- Botón de "Registrarse" con gradiente destacado (verde/amarillo)
- Transiciones suaves en hover con
translateY(-2px) - Icons de Ant Design para cada opción
- Tamaños adaptativos:
largeomiddle
Botones:
- Inicio (
HomeOutlined) - Sobre Nosotros (
TeamOutlined) - Iniciar Sesión (
LoginOutlined) - Registrarse (
UserAddOutlined) - Estilo principal con gradiente
Drawer de navegación para dispositivos móviles.
Características:
- Drawer desde la derecha con ancho de 300px
- Fondo con gradiente del tema principal
- Título "Navegación" con gradiente de texto
- Botones verticales con altura de 56px
- Iconos de 18px con espaciado consistente
- Animación
translateX(8px)en hover para botones normales - Botón de Registrarse con gradiente verde/amarillo destacado
- CloseIcon personalizado con fondo translúcido
Efectos:
- Backdrop filter blur en el overlay
- Transform en hover para feedback visual
- Border y background color changes
Pie de página simple para el panel administrativo.
Características:
- Diseño minimalista con copyright centrado
- Fondo azul oscuro (#003366) consistente con tema
- Texto: "©{año} Invernaderos UTEQ. Todos los derechos reservados."
- Color de texto:
rgba(255, 255, 255, 0.65) - Tipografía de Ant Design con
Typography.Text
Pie de página simple para el panel de usuario.
Características:
- Fondo gris claro (#f0f2f5) para contraste suave
- Texto secondary de Ant Design
- Copyright dinámico con año actual
- Texto: "Sistema de Gestión de Invernaderos ©{año} UTEQ"
- Alineación centrada
Contenedor principal del footer con renderizado condicional responsive.
Características:
- Renderiza
FooterMobileoFooterDesktopsegún breakpoint - Breakpoint de cambio:
md(768px) - Gradiente de fondo:
linear-gradient(135deg, #2A3A6B, #1C2B4E) - Box shadow superior para efecto elevado
- Divider horizontal con opacidad 0.2
- Padding adaptativo: 32px (xs), 40px (sm), 48px (md+)
- Border superior con color translúcido
- Copyright final común para ambas vistas
Delegación:
- Pasa
screensa componentes hijos para consistencia responsive
Footer completo con múltiples columnas para pantallas grandes.
Características:
- Layout de 3 columnas con
RowyColde Ant Design - Responsive gutters: [48, 32]
Columna 1 - Branding:
- Logo de UTEQ (45-40px de altura)
- Descripción del sistema: "Sistema inteligente de control climático..."
- Logo con border-radius y drop-shadow
- Texto con max-width de 280px
Columna 2 - Redes Sociales:
- Título: "Conecta con Nosotros"
- Enlaces a Facebook, Instagram, LinkedIn de UTEQ
- Icons de 20-18px con efectos hover
- Color change a
theme.secondaryen hover - Transform
translateY(-2px)para elevación
Columna 3 - Contacto y Ubicación:
- Información de contacto:
- Email: contacto@UTEQ (con
MailOutlined) - Teléfono: +593 2 123 4567 (con
PhoneOutlined)
- Email: contacto@UTEQ (con
- Dirección completa de UTEQ en Querétaro
- Icons con colores del tema (secondary, accent)
EnvironmentOutlinedpara ubicación
Estilos:
- Títulos con gradiente de texto
- fontSize adaptativo según breakpoint
- Alineación centrada en todas las columnas
Footer compacto vertical para dispositivos móviles.
Características:
- Layout de una sola columna centrada
- Logo de UTEQ más pequeño (30-35px)
- Secciones apiladas verticalmente con gaps adaptativos
Secciones:
- Logo - Parte superior
- Contacto - Email y teléfono con icons
- Redes Sociales - Título "Síguenos" + enlaces sociales
- Ubicación - Dirección de UTEQ con max-width 250px
Diseño:
- Space large entre iconos sociales
- fontSize reducido: 14-15px
- Icons de 18-20px
- Mismo sistema de hover que desktop
- Text align center para legibilidad en móvil
primary: '#2A3A6B' // Azul oscuro principal
primaryDark: '#1C2B4E' // Azul oscuro más intenso
secondary: '#8BC34A' // Verde UTEQ
accent: '#FBC02D' // Amarillo dorado
text: '#FFFFFF' // Blanco puro
textLight: '#E0E0E0' // Gris claro
textMuted: '#A0A0A0' // Gris apagadoFunción helper para convertir colores hex a rgba con opacity:
hexToRgba('#2A3A6B', 0.3) // → 'rgba(42, 58, 107, 0.3)'- Gradientes: Uso extensivo de
linear-gradient(135deg, ...) - Glassmorphism: Backdrop filters y backgrounds translúcidos
- Shadows: Box shadows con rgba para profundidad
- Animaciones: Transitions de 0.3s ease en hover states
- Typography: Gradientes de texto con WebkitBackgroundClip
- Responsive: Breakpoints de Ant Design (xs, sm, md, lg)
Los hooks personalizados encapsulan lógica de negocio reutilizable siguiendo las mejores prácticas de React.
Hook para manejo completo del formulario de inicio de sesión con protección contra fuerza bruta.
Estado:
loading- Indicador de petición en cursoisBlocked- Indica si el formulario está bloqueado por intentos fallidostimeLeft- Tiempo restante de bloqueo en formato "MM:SS"loginAttempts- Contador de intentos fallidos
Funciones retornadas:
form- Instancia de formulario de Ant DesignonFinish(values)- Handler de submit con validación y hasheo SHA-256
Características:
- Protección anti fuerza bruta: Máximo 4 intentos antes de bloqueo
- Bloqueo temporal: 2 minutos de bloqueo tras exceder intentos
- Contador en tiempo real: Actualización cada segundo del tiempo restante
- Hash de contraseña: SHA-256 con crypto-js antes de enviar
- Redirección por rol: Admin (1) →
/admin, Usuario (2) →/user - Verificación de cuenta: Redirige a
/activar-cuentasi verified=2 - Reset automático: Limpia intentos tras login exitoso
- Mensajes contextuales: Muestra intento actual y máximo permitido
Constantes:
MAX_LOGIN_ATTEMPTS = 4
BLOCK_DURATION_MINUTES = 2Hook para gestión del formulario de registro con validación de campos únicos.
Estado:
loading- Estado de carga durante registroform- Instancia del formulario
Funciones retornadas:
onFinish(values)- Handler de submit con trimming y hash
Características:
- Trimming automático: Elimina espacios de nombre y email
- Hash SHA-256: Contraseña hasheada con crypto-js
- Validación de duplicados: Manejo específico de errores por campo
RepeatedMail- Marca error en campo emailRepeatedUserName- Marca error en campo name
- Reset de formulario: Limpia campos tras éxito
- Redirección: Navega a
/tras registro exitoso - Mensajes amigables: Traduce errores del API a español
Hook para verificación de cuenta con código enviado por email.
Estado:
loading- Estado de verificación en cursoresendLoading- Estado de reenvío de códigouserId- ID extraído del token JWTform- Instancia del formulario
Funciones retornadas:
onFinish(values)- Verifica la cuenta con el código ingresadoonResendCode()- Reenvía código de verificación al email
Características:
- Extracción de userId: Lee token JWT del localStorage al montar
- Validación de token: Verifica existencia y validez del token
- Logout tras verificación: Elimina authToken tras éxito
- Redirección a login: / para nuevo inicio de sesión
- Manejo de errores específico:
VerificationFailedcon mensaje customizado - Protección de ruta: Redirige a
/si no hay token válido
Flujo:
- Monta componente → extrae userId del token
- Usuario ingresa código
- Envía userId + código al backend
- Si exitoso → logout + redirección
- Opción de reenviar código si expiró
Hook completo para gestión del perfil de usuario con actualización selectiva.
Estado:
userData- Datos del perfil actual (UserProfileDto)loading- Carga inicial del perfilisUpdating- Indicador de actualización en cursouserId- ID extraído del token JWTshowPasswordFields- Toggle de campos de contraseñaform- Formulario con valores iniciales
Funciones retornadas:
handleUpdate(values)- Actualiza perfil y/o contraseña selectivamentesetShowPasswordFields- Muestra/oculta campos de contraseña
Características:
- Decodificación de token: Extrae userId de
nameidosub - Carga automática: useEffect con fetchUser al montar
- Actualización inteligente: Detecta qué cambió (perfil vs contraseña)
- Validación de cambios: No envía si no hay modificaciones
- Actualización dual: Soporta cambio de perfil y contraseña simultáneos
- Reset de password fields: Limpia campos tras cambio exitoso
- Manejo de conflictos: Status 409 para correo/usuario duplicado
- Pre-population: Form.setFieldsValue con datos del perfil
Lógica de actualización:
hasProfileChanged → updateProfile()
isPasswordAttempt → changePassword()
ninguno → message.info('No hay cambios')Hook completo para CRUD de usuarios por administrador.
Estado:
users- Array de usuarios en formato tabla (UserTableData[])loading- Estado de carga de operaciones
Funciones retornadas:
fetchUsers()- Recarga lista de usuarioshandleCreateUser(values)- Crea nuevo usuario con hash de contraseñahandleEditUser(id, values)- Actualiza usuario existentehandleDeleteUser(id)- Inactiva usuario con confirmación modalhandleResendCode(id)- Reenvía código de verificación
Características:
- Mapeo de datos: Transforma GetUsersDto → UserTableData
- Carga automática: useEffect con fetchUsers al montar
- Confirmación de eliminación: Modal de Ant Design antes de inactivar
- Feedback inmediato: Recarga lista tras cada operación exitosa
- Manejo de errores robusto: Extrae errorMessage del response
- Password raw: Acepta
rawPasswordpara hasheo en servicio - Mensajes de éxito: message.success tras cada acción
Funciones auxiliares:
mapToTableData()- Convierte DTOs a formato de tabla con key
Hook para gestión del perfil del administrador.
Estado:
user- Datos del perfil (UserProfileDto con role, status, verified)loading- Estado de cargauserId- ID extraído del token
Funciones retornadas:
handleUpdateInfo(values)- Actualiza mail y userNamehandleChangePassword(currentPass, newPass)- Cambia contraseña
Características:
- Parsing de JWT: Función helper
parseJwt()local - Extracción de ID: Lee
subonameiddel token - useCallback: fetchProfile optimizado con dependencias
- Validación de userId: Retorna early si no existe
- Manejo de errores: Extrae mensaje del backend o usa genérico
- Return boolean: Retorna true/false para feedback en UI
- Recarga automática: fetchProfile tras actualización exitosa
Hook para animaciones basadas en scroll con IntersectionObserver.
Parámetros (opcionales):
{
threshold?: number // Porcentaje visible para activar (default: 0.1)
rootMargin?: string // Margen del viewport (default: '0px')
triggerOnce?: boolean // Animar solo una vez (default: false)
}Retorna:
ref- Ref para el elemento a observar (HTMLDivElement)isVisible- Boolean que indica si el elemento es visible
Características:
- IntersectionObserver API: Detección nativa de visibilidad
- Optimización de performance: Desconecta observer según config
- Modo una vez: triggerOnce desconecta tras primera activación
- Cleanup automático: useEffect cleanup desconecta observer
- Referencia persistente: useRef para evitar re-renders
- Configuración flexible: threshold y rootMargin personalizables
Uso típico:
const { ref, isVisible } = useScrollAnimation({
threshold: 0.3,
triggerOnce: true
});
<div ref={ref} className={isVisible ? 'fade-in' : 'hidden'}>
Contenido animado
</div>Casos de uso:
- Fade-in de secciones al hacer scroll
- Animaciones de entrada para cartas/tarjetas
- Lazy loading de imágenes
- Activación de contadores animados
- Parallax effects
Todos los hooks de perfil usan este patrón:
const parseJwt = (token: string) => {
try {
return JSON.parse(atob(token.split('.')[1]));
} catch (e) {
return null;
}
};
const id = decoded?.nameid || decoded?.sub;const { message } = App.useApp();
message.success('Operación exitosa');
message.error('Error en operación');
message.info('Información');const fetchData = useCallback(async () => {
setLoading(true);
try {
const data = await service.getData();
setState(data);
} catch (error) {
message.error('Error al cargar');
} finally {
setLoading(false);
}
}, [dependencies]);Hooks de formularios retornan boolean en handlers para permitir cierre condicional de modales:
const success = await handleUpdate(values);
if (success) closeModal();Componentes modulares diseñados para ser flexibles, responsivos y visualmente atractivos.
Sección principal de la landing page que captura la atención del usuario.
- Características:
- Animaciones de entrada con
useScrollAnimation. - Fondo con gradientes y efectos de "glow".
- Grid animado de fondo.
- Tarjeta principal con efecto glassmorphism.
- Previsualización de estadísticas en tiempo real.
- Botones de llamada a la acción (Demo, Documentación).
- Animaciones de entrada con
Muestra las características principales del sistema en un grid responsivo.
- Características:
- Tarjetas con efectos de hover (elevación y brillo).
- Iconos animados.
- Gradientes personalizados para cada característica.
- Layout adaptable (grid de 1, 2 o 4 columnas).
Sección de prueba social y métricas de rendimiento.
- Características:
- Contadores animados que suben desde 0 hasta el valor final.
- Tarjetas de estadísticas con iconos y gradientes.
- Actualización dinámica basada en la visibilidad (Intersection Observer).
Sección final para convertir visitantes en usuarios.
- Características:
- Diseño destacado con fondo de alto contraste.
- Botones grandes para "Solicitar Demo" o "Consultar".
- Elementos decorativos animados.
Gráficos de área interactivos para visualizar datos históricos de sensores.
- Librería: Recharts.
- Props:
data: Array de datos históricos.tempDataKey,humidityDataKey, etc.: Claves para mapear los datos.optimalTempMin/Max: Rango para sombrear la zona óptima en el gráfico.
- Características:
- Filtros de Tiempo: Botones para ver 24h, 7 días o 30 días.
- Tooltip Personalizado: Muestra detalles precisos al pasar el mouse.
- Zonas de Referencia: Área verde semitransparente indicando valores óptimos.
- Gradientes: Rellenos de área con desvanecimiento vertical.
- Responsive: Se adapta al ancho del contenedor.
Tarjetas de métricas individuales para el dashboard de usuario.
- Props:
icon: Icono de Ant Design.value: Valor numérico actual.unit: Unidad de medida (°C, %, etc.).trend: Valor de tendencia (positivo/negativo).color: Color base para el gradiente.
- Características:
- Indicadores de Tendencia: Flechas arriba/abajo con colores semánticos (verde/rojo).
- Diseño Visual: Fondos con gradientes basados en el color del sensor (Naranja para temp, Azul para humedad).
- Interactividad: Efectos de elevación al pasar el mouse.
- Sombra de Texto: Para mejorar legibilidad sobre fondos coloridos.
Componente contenedor principal para la sección pública de la aplicación.
- Función: Actúa como layout y enrutador para las páginas públicas.
- Características:
- Layout Adaptativo: Ajusta el estilo del contenido (
activeContentStyle) según la ruta actual (ancho completo vs caja centrada). - ConfigProvider: Inyecta el tema personalizado de Ant Design (colores, bordes) a todos los componentes hijos.
- Enrutamiento: Define las rutas para Home, About Us, Login y Register.
- Header/Footer: Integra
AppHeaderyAppFooterde forma consistente.
- Layout Adaptativo: Ajusta el estilo del contenido (
Vista principal (Home) de la landing page.
- Composición: Orquesta la visualización de las secciones clave:
HeroSection: Bienvenida e introducción.FeaturesSection: Características del sistema.StatsSection: Estadísticas y métricas.CTASection: Llamada a la acción final.
- Diseño: Fondo oscuro primario (
theme.primaryDark) para consistencia visual.
Página "Sobre Nosotros" que comunica la identidad del proyecto.
- Secciones:
- Intro: Logo y título con animación de entrada.
- Misión/Visión/Valores: Tarjetas interactivas con iconos y bordes de colores temáticos (Secundario, Acento, Texto Claro).
- Animaciones:
useScrollAnimation: Elementos aparecen suavemente al hacer scroll.- Hover Effects: Las tarjetas se elevan y proyectan sombra al pasar el mouse.
- Estilo: Fondo con gradientes y elementos decorativos flotantes (círculos radiales).
Interfaz de inicio de sesión segura y moderna.
- Diseño: Layout dividido (Split Screen) con imagen de portada a la izquierda y formulario a la derecha (en desktop).
- Características:
- Validación en tiempo real: Feedback visual en campos de correo y contraseña.
- Mecanismo de Bloqueo: Muestra alerta visual con contador regresivo si el usuario está bloqueado (
isBlocked). - Estética: Uso de glassmorphism en el contenedor del formulario y gradientes sutiles.
Formulario de registro de nuevos usuarios con validaciones robustas.
- Validaciones:
- Contraseña Fuerte: Requiere mayúsculas, caracteres especiales y longitud mínima.
- Confirmación: Verifica que las contraseñas coincidan.
- Términos: Checkbox obligatorio con enlace a la vista de términos.
- UX: Feedback visual en cada campo (
hasFeedback) y transiciones suaves.
Vista para la activación de cuenta mediante código OTP (One-Time Password).
- Componentes:
- Input OTP: Campo especializado de Ant Design para ingresar el código de 8 dígitos.
- Feedback Visual: Icono de éxito/estado grande y claro.
- Funcionalidad:
- Botón para validar el código.
- Opción para reenviar el código si no se recibió.
- Navegación de retorno al login.
Vista informativa de Términos y Condiciones y Política de Privacidad.
- Diseño: Tarjeta central con contenido scrolleable para facilitar la lectura de textos largos.
- Estilo: Tipografía legible, secciones claramente separadas y scrollbar personalizado para integrarse con el tema oscuro.
- Navegación: Botón "Volver" que regresa a la página anterior en el historial.
Estructura base para todas las vistas administrativas.
- Componentes:
AdminHeader: Barra superior con menú de usuario y navegación.AdminFooter: Pie de página informativo.Drawer: Menú lateral desplegable para navegación móvil.
- Estilo: Fondo gris claro (
#f0f2f5) típico de dashboards administrativos.
Vista de bienvenida al dashboard.
- Diseño: Minimalista y centrado, ofreciendo un punto de partida claro para el administrador.
Panel principal para la gestión CRUD de usuarios.
- Tabla de Usuarios:
- Columnas: Usuario, Correo, Rol (Tag coloreado), Estado (Icono + Color), Verificación.
- Acciones: Editar, Eliminar (Inactivar), Reenviar Código de Verificación.
- Responsividad: Columnas fijas y scroll horizontal en móviles.
- Funcionalidades:
- Filtrado/Ordenamiento: Por nombre de usuario.
- Modales: Integración con
UserFormModalpara crear y editar.
Formulario modal reutilizable para crear y editar usuarios.
- Modos:
- Creación: Permite definir nombre, correo, contraseña inicial y rol.
- Edición: Restringido a nombre y correo (muestra alerta informativa).
- Validaciones: Reglas estrictas para correo y longitud de campos.
Vista de perfil personal del administrador.
- Secciones:
- Tarjeta de Perfil: Avatar, rol (etiqueta dorada) y datos básicos.
- Acciones: Botones para editar información y cambiar contraseña.
- Modales:
- Editar Info: Formulario para actualizar nombre y correo.
- Seguridad: Formulario para cambio de contraseña con validación de la actual.
Layout principal para la interfaz de usuario estándar.
- Estructura: Similar al admin pero con opciones limitadas en el menú lateral y header.
- Navegación: Acceso rápido a "Gestión de Invernaderos" y cierre de sesión.
Dashboard de bienvenida para el usuario.
- Resumen: Muestra tarjetas de acceso rápido a las funcionalidades principales:
- Monitoreo en Vivo.
- Historial y Análisis.
- Configuración.
- Personalización: Saludo personalizado con el nombre del usuario.
Vista central para la administración de los invernaderos del usuario.
- CRUD Completo:
- Listar: Tabla con nombre, ubicación y acciones.
- Crear/Editar: Modales con formularios validados.
- Eliminar: Confirmación de seguridad antes de borrar.
- Navegación a Sensores: Botones directos para ver datos del lado "Frío" (❄️) o "Cálido" (☀️).
Vistas detalladas para la visualización de datos de sensores (GestionInvernaderoFrioView y GestionInvernaderoCalidoView).
- Pestañas de Navegación:
- Tiempo Real: Tarjetas KPI con actualización automática cada 10s.
- Último Mes: Gráficos de tendencia y promedios de los últimos 30 días.
- Rango Personalizado: Selectores de fecha/hora para análisis histórico específico.
- Visualización:
- Gráficos: Líneas de tendencia para Temperatura, Humedad y Luminosidad usando
Recharts. - KPIs: Tarjetas con valores actuales, promedios y flechas de tendencia.
- Gráficos: Líneas de tendencia para Temperatura, Humedad y Luminosidad usando
Gestión del perfil personal del usuario.
- Edición: Formulario unificado para actualizar nombre y correo.
- Seguridad: Sección desplegable ("Cambiar contraseña") para actualizar credenciales de forma segura.
- Feedback: Indicadores de carga y mensajes de éxito/error.
La aplicación frontend está desplegada en Vercel, aprovechando su red global de Edge Network para una entrega de contenido rápida y segura.
- CI/CD: Integración continua con GitHub para despliegues automáticos en cada push a la rama
main. - Optimización: Compresión de assets y caché inteligente.
El backend de la aplicación está construido con ASP.NET Core (C#) y alojado en Azure App Service.
- Base de Datos: Azure SQL Database para almacenamiento relacional seguro y escalable.
- API: RESTful API que sirve los datos al frontend mediante endpoints seguros.