Skip to main content

Routing Overview

EducaStream uses React Router v6 for client-side routing. The routing configuration is centralized in App.jsx and implements role-based access control with protected routes.

Route Structure

The application implements three types of route configurations:

Public Routes

Accessible to all users

Authenticated Routes

Require user authentication

Admin Routes

Require admin privileges

Main Application Routes

Publicly Accessible Routes
import { Routes, Route, Navigate } from "react-router-dom";
import Layout from "./views/Layout/Layout";
import Courses from "./views/Courses/Courses";
import DetailCourse from "./views/DetailCourse/DetailCourse";
import Login from "./views/Login/Login";

// Public routes - no authentication required
<Routes>
  <Route 
    path="/" 
    element={<Layout updateContextUser={updateContextUser} />} 
  />
  
  <Route 
    path="/courses/" 
    element={<Courses updateContextUser={updateContextUser} />} 
  />
  
  <Route 
    path="/detailCourse/:id" 
    element={<DetailCourse updateContextUser={updateContextUser} />} 
  />
  
  <Route 
    path="/login/" 
    element={<Login updateContextUser={updateContextUser} setLogged={setLogged} />} 
  />
</Routes>
Available Public Routes:
  • / - Home page with course listings
  • /courses/ - Course catalog
  • /detailCourse/:id - Course details (dynamic route)
  • /login/ - Authentication page

Route Parameters

EducaStream uses dynamic route parameters for resource-specific pages:

User ID Routes

// Student dashboard
path="/student/:id"

// Instructor dashboard  
path="/instructor/:id"

// User configuration
path="/config/:id"

// Shopping cart
path="/cart/:id"

// Admin dashboard
path="/admin/dashboard/:id"

// Email utility
path="/mailer/:id"

Course & Content Routes

// Course details
path="/detailCourse/:id"

// Course editing
path="/edit/:id"

// Class list for a course
path="/student/classList/:courseId"

// Individual lecture
path="/student/classList/lecture/:lessonId"

// Create lecture for course
path="/instructor/:courseId/createLecture"

// Instructor course form
path="/instructor/:id/form"

Authentication Flow

1

Check Session

Application checks localStorage for active session
const session = JSON.parse(localStorage.getItem("userOnSession"));
const logged2 = localStorage.getItem("logged");
2

Determine Routes

Routes are conditionally rendered based on auth state
{session?.isAdmin ? adminRoutes : unauthenticatedRoutes}
{logged2 ? authenticatedRoutes : unauthenticatedRoutes}
3

Redirect Unauthorized

Unauthenticated users are redirected to login
const unauthenticatedRoutes = (
  <>
    <Route path="/" element={<Navigate to="/login" />} />
  </>
);
The NavBar component provides navigation links that adapt based on user authentication:
import { NavLink } from "react-router-dom";

// Conditional navigation links
<li>
  {!userData ? (
    <NavLink to={"/login"}>Mi aprendizaje</NavLink>
  ) : (
    <NavLink to={`/student/${userData?.id}`}>Mi aprendizaje</NavLink>
  )}
</li>

<li>
  {!userData ? (
    <NavLink to={"/login"}>Enseñar</NavLink>
  ) : (
    <NavLink to={`/instructor/${userData?.id}`}>Enseñar</NavLink>
  )}
</li>

Programmatic Navigation

Components use useNavigate hook for programmatic navigation:
import { useNavigate } from "react-router-dom";

const MyComponent = () => {
  const navigate = useNavigate();
  
  const handleNavigate = () => {
    navigate('/courses');
    window.scrollTo({ top: 0 });
  };
  
  return <button onClick={handleNavigate}>View Courses</button>;
};

Context Integration

Routes receive user context updates through a shared function:
import React, { useState } from "react";

export const userContext = React.createContext();

function App() {
  const [user, setUser] = useState({
    email: "",
    password: "",
    isNew: null,
    enabled: false,
  });
  
  const updateContextUser = (newUser) => {
    setUser(newUser);
  };
  
  return (
    <userContext.Provider value={user}>
      <Routes>
        <Route 
          path="/" 
          element={<Layout updateContextUser={updateContextUser} />} 
        />
        {/* All routes receive updateContextUser prop */}
      </Routes>
    </userContext.Provider>
  );
}

Conditional UI Elements

The footer is conditionally rendered based on the current route:
const location = useLocation();

const shouldShowFooter = () => {
  return ![
    "/student/",
    "/student/classList/",
    "/student/classList/lecture/",
    "/login",
    "/instructor/form",
    "/instructor/",
    "/detailCourse/",
    "/config/",
  ].includes(location.pathname);
};

// In render
{shouldShowFooter() && <Footer />}
NavBar is hidden only on the login page:
{location.pathname === "/login" ? "" : <NavBar />}

Route Guards

The current implementation uses client-side route protection. For production applications, always implement server-side authentication validation in addition to client-side guards.

Implementation Pattern

// Check authentication status
const session = JSON.parse(localStorage.getItem("userOnSession"));
const logged2 = localStorage.getItem("logged");

// Render routes conditionally
{logged2 ? (
  // Authenticated routes
  <Route path="/student/:id" element={<Student />} />
) : (
  // Redirect to login
  <Route path="/" element={<Navigate to="/login" />} />
)}

Complete Route Map

Route PatternComponentAccess LevelDescription
/LayoutPublicHome page
/courses/CoursesPublicCourse catalog
/detailCourse/:idDetailCoursePublicCourse details
/login/LoginPublicAuthentication
/student/:idStudentAuthenticatedStudent dashboard
/student/classList/:courseIdClassListAuthenticatedCourse class list
/student/classList/lecture/:lessonIdLectureAuthenticatedLecture viewer
/instructor/:idInstructorAuthenticatedInstructor dashboard
/instructor/:id/formFormAuthenticatedCreate course form
/instructor/:courseId/createLectureFormLectureAuthenticatedCreate lecture
/edit/:idEditCourseAuthenticatedEdit course
/cart/:idCartPageAuthenticatedShopping cart
/config/:idConfigAuthenticatedUser settings
/payment/checkout/sucessCheckOutAuthenticatedPayment success
/mailer/:idMailerAuthenticatedEmail utility
/admin/dashboard/:idDashboardAdminAdmin dashboard

Best Practices

Scroll to Top

Always scroll to top after navigation for better UX

Route Parameters

Use descriptive parameter names like :id, :courseId, :lessonId

Protected Routes

Check authentication before rendering sensitive routes

Fallback Routes

Use <Route path="*" element={<Navigate to="/" />} /> for 404s
When adding new routes, consider:
  • Whether the route requires authentication
  • If it needs admin privileges
  • What URL parameters are needed
  • Whether the NavBar and Footer should display
  • If scroll-to-top behavior is needed

Build docs developers (and LLMs) love