Appearance
Archivos de la Carpeta src/routes
La carpeta src/routes es fundamental para la navegación de tu aplicación. Contiene la configuración de todas las rutas, organizando cómo los usuarios acceden a las diferentes vistas y protegiendo el contenido sensible.
app.routes.tsx
Este archivo es el corazón del sistema de enrutamiento de tu aplicación React. Define la estructura de navegación, mapeando las URLs a los componentes correspondientes y aplicando lógica de protección para rutas específicas.
- Descripción:
app.routes.tsxutilizareact-router-dompara crear un enrutador basado en el navegador. Define una jerarquía de rutas que incluye rutas públicas (como el inicio de sesión) y rutas protegidas que requieren autenticación. También utilizaReact.lazypara la carga perezosa de componentes de página, optimizando el rendimiento inicial de la aplicación. - Propósito: Configurar la navegación de la aplicación, asegurar que los usuarios autenticados solo puedan acceder a contenido protegido y mejorar la velocidad de carga al dividir el código de las páginas.
- Funcionalidad clave:
createBrowserRouter: Esta función dereact-router-domes la encargada de crear la instancia principal del enrutador. Utiliza la API de historial del navegador para mantener la URL sincronizada con la interfaz de usuario.- Carga Perezosa (
React.lazy): Componentes comoLoginPage,Dashboard,StudentProfile,AddStudent,SchoolClassyStatisticsse importan dinámicamente usandolazy. Esto significa que el código de estas páginas solo se carga cuando el usuario navega a ellas, reduciendo el tamaño inicial del paquete de la aplicación y mejorando el tiempo de carga. - Rutas Protegidas (
<ProtectedRoute />): El componenteProtectedRoute(definido en./protected.routes.tsx) actúa como un guardián de rutas. Envuelve un conjunto de rutaschildren, asegurándose de que solo los usuarios autenticados puedan acceder a ellas. Si un usuario no está autenticado,ProtectedRoutegeneralmente lo redirige a la página de inicio de sesión. - Layout Protegido (
<ProtectedLayout />): Este componente de layout (importado de../components/layouts/protected-layout/protected.layout.tsx) envuelve las rutas protegidas, proporcionando una estructura de interfaz de usuario común para todas ellas (por ejemplo, una barra lateral, una cabecera, un pie de página). - Rutas Anidadas: La configuración utiliza rutas anidadas, donde
/dashboardactúa como una ruta padre. Esto permite definir sub-rutas comostudent/:id(para perfiles individuales),add-student(para agregar estudiantes), y:school/:course(para filtrar estudiantes por colegio y curso). - Ruta Índice (
index: true):index: trueen la ruta deDashboardindica que este es el componente que se renderizará cuando la URL sea exactamente/dashboard, sin ningún segmento adicional. - Parámetros de URL Dinámicos: Rutas como
student/:idy:school/:courseutilizan parámetros de URL (indicados con:). Esto permite que la misma ruta renderice diferentes contenidos basándose en el valor del parámetro en la URL. Por ejemplo,student/123ystudent/456usarán el mismoStudentProfilepero con diferentes IDs.
- Rol en la aplicación:
app.routes.tsxes la columna vertebral de la navegación. Define la experiencia del usuario a través de la aplicación, controlando a qué contenido puede acceder y cómo se organiza ese contenido. Su diseño modular y el uso de la carga perezosa contribuyen significativamente a la seguridad y el rendimiento general de la aplicación.
tsx
// src/routes/app.routes.tsx
import { lazy } from "react";
import { createBrowserRouter, type RouteObject } from "react-router-dom";
import { ProtectedRoute } from "./protected.routes";
import ProtectedLayout from "../components/layouts/protected-layout/protected.layout";
const LoginPage = lazy(() => import("../pages/login.page"));
const Dashboard = lazy(() => import("../pages/dashboard"));
const StudentProfile = lazy(() => import("../pages/student.profile"));
const AddStudent = lazy(() => import("../pages/add.student"));
const SchoolClass = lazy(() => import("../pages/school.class"));
const Statistics = lazy(() => import("../pages/statistics"));
const routes: RouteObject[] = [
{
path: "/",
element: <LoginPage />,
},
{
element: <ProtectedRoute />, // Este componente protege las rutas hijas
children: [
{
element: <ProtectedLayout />, // Este componente define el layout para las rutas protegidas
children: [
{
path: "/dashboard", // Ruta base para el área protegida y con layout
children: [
{ index: true, element: <Dashboard /> }, // Ruta para /dashboard
{ path: "student/:id", element: <StudentProfile /> }, // Ruta para /dashboard/student/:id
{ path: "add-student", element: <AddStudent /> }, // Ruta para /dashboard/add-student
{ path: ":school/:course", element: <SchoolClass /> }, // Ruta para /dashboard/:school/:course
{ path: "estadisticas", element: <Statistics /> }, // Ruta para /dashboard/estadisticas
],
},
],
},
],
},
];
// Define un tipo para el enrutador para un mejor tipado en TypeScript
interface AppRouter extends ReturnType<typeof createBrowserRouter> {}
export const router: AppRouter = createBrowserRouter(routes);
protected.routes.tsx
Este archivo define el componente ProtectedRoute, que actúa como un guardián de rutas en tu aplicación. Su función principal es asegurar que solo los usuarios autenticados puedan acceder a ciertas partes de la aplicación.
- Descripción:
ProtectedRoutees un componente de enrutamiento que se encarga de la lógica de protección. Utiliza un hook personalizado (useProtectedRoute) para gestionar el estado de carga y el proceso de autenticación, mostrando un spinner de carga o denegando el acceso si el usuario no está autenticado. - Propósito: Implementar un mecanismo de control de acceso para las rutas de la aplicación, garantizando que el contenido sensible solo sea visible para usuarios validados.
- Funcionalidad clave:
useProtectedRoute(): Este es un hook personalizado (importado de../hooks/use.protected.route.ts) que encapsula la lógica principal de la protección de rutas. Es probable que este hook:- Verifique el token de autenticación del usuario.
- Maneje el proceso de revalidación del token si es necesario.
- Gestione un estado de carga (
isLoading) mientras se determina la autenticación. - Realice redirecciones a la página de login si el usuario no está autenticado después de la verificación.
isLoading: Un estado booleano retornado poruseProtectedRouteque indica si la lógica de autenticación está en progreso. Si estrue, el componente muestra unLoadingSpinner.useAuth().isAuthenticated: Después de queisLoadingseafalse, se verifica el estado de autenticación del usuario desde el contexto de autenticación (useAuth).LoadingSpinner: Un componente de UI (importado de../components/ui/loading.spinner.tsx) que se muestra al usuario mientras se verifica su estado de autenticación. Esto mejora la experiencia de usuario, evitando un "flash" de contenido no autorizado o roto.return null;(para usuario no autenticado): Si el usuario no está autenticado (!isAuthenticated), el componente retornanull. Esto, en conjunto con la lógica de redirección enuseProtectedRoute, asegura que no se renderice ningún contenido de la ruta protegida.<Outlet />: Si el usuario está autenticado y la lógica de protección ha finalizado,ProtectedRouterenderiza el componente<Outlet />. Este componente es proporcionado porreact-router-domy renderiza el elementochildrende la ruta anidada que coincide con la URL actual.
- Rol en la aplicación:
protected.routes.tsxes una pieza fundamental de la seguridad y la gestión de la experiencia de usuario en las rutas protegidas. Garantiza que la aplicación funcione de manera segura, proporcionando un feedback visual adecuado durante los procesos de autenticación y acceso.
tsx
// src/routes/protected.routes.tsx
import { Outlet } from "react-router-dom"; // Componente para renderizar rutas anidadas
import { useAuth } from "../components/auth/auth.context"; // Hook para acceder al contexto de autenticación
import { LoadingSpinner } from "../components/ui/loading.spinner"; // Componente para mostrar un spinner de carga
import { useProtectedRoute } from "../hooks/use.protected.route"; // Hook personalizado para la lógica de protección
export const ProtectedRoute = () => {
// Obtiene el estado de carga del hook de protección de ruta
const isLoading = useProtectedRoute();
// Si está cargando (verificando autenticación), muestra un spinner
if (isLoading) {
return <LoadingSpinner />;
}
// Si el usuario no está autenticado después de la carga, no renderiza nada (la redirección ocurre en el hook)
if (!useAuth().isAuthenticated) {
return null; // Importante para evitar que se muestre contenido fugazmente
}
// Si está autenticado, renderiza el contenido de la ruta anidada
return <Outlet />;
};