Snai3i-MarketPlace / frontend / src / routes / index.tsx
index.tsx
Raw
import { lazy } from 'react';
import { Navigate, useRoutes } from 'react-router-dom';
// import useUser from '@/hooks/useUser';

import Layout from '@/layouts/Main';
import DashboardLayout from '@/layouts/Dashboard';
import Home from '@/pages/Main/Home';
import useUser from '@/hooks/useUser';
import routes from './sideBar';

const SettingsPage = lazy(() => import('@/pages/Dashboard/Settings'));
const CourseDetails = lazy(() => import('@/pages/Main/CourseDetails'));
const Snai3iCourse = lazy(() => import('@/pages/Dashboard/EnrollCourse'));
const EditTeacher = lazy(() => import('@/pages/Dashboard/Teachers/EditTeacher'));
const Market = lazy(() => import('@/pages/Dashboard/Market'));
const Error404 = lazy(() => import('@/pages/Errors/Error404'));
const Login = lazy(() => import('@/pages/Login'));
const Accounts = lazy(() => import('@/pages/Dashboard/Accounts'));
const CreateAccount = lazy(
  () => import('@/pages/Dashboard/Accounts/CreateAccount')
);
const EditAccount = lazy(
  () => import('@/pages/Dashboard/Accounts/EditAccount')
);
const Meetings = lazy(() => import('@/pages/Dashboard/Meetings'));
const Teachers = lazy(() => import('@/pages/Dashboard/Teachers'));
const CreateTeacher = lazy(
  () => import('@/pages/Dashboard/Teachers/CreateTeacher')
);
const Orders = lazy(() => import('@/pages/Dashboard/Orders'));

const CreateSchoolOrder = lazy(
  () => import('@/pages/Dashboard/Orders/SchoolsOrders/CreateSchoolOrder')
);
const EditSchoolOrder = lazy(
  () => import('@/pages/Dashboard/Orders/SchoolsOrders/EditSchoolOrder')
);
const CreateTeacherOrder = lazy(
  () => import('@/pages/Dashboard/Orders/TeachersOrders/CreateTeacherOrder')
);
const EditTeacherOrder = lazy(
  () => import('@/pages/Dashboard/Orders/TeachersOrders/EditTeacherOrder')
);
const CreateSnai3iCourse = lazy(
  () => import('@/pages/Dashboard/Snai3iCourses/CreateSnai3iCourse')
);
const CreateMarketCourse = lazy(
  () => import('@/pages/Dashboard/MarketCourses/CreateMarketCourse.tsx')
);
const MarketCourses = lazy(() => import('@/pages/Dashboard/MarketCourses'));
const Snai3iCourses = lazy(() => import('@/pages/Dashboard/Snai3iCourses'));

const DashboardHome = lazy(() => import('@/pages/Dashboard/Home'));
const MyCoursesInstDesigner = lazy(
  () => import('@/pages/Dashboard/MyCoursesInstDesigner')
);
const CreateCourseByInst = lazy(
  () =>
    import(
      '@/pages/Dashboard/MyCoursesInstDesigner/components/CreateCourseByInst'
    )
);
const MyCoursesSchool = lazy(() => import('@/pages/Dashboard/MyCoursesSchool'));
const MyCoursesTeacher = lazy(
  () => import('@/pages/Dashboard/MyCoursesTeacher')
);
const Tutorials = lazy(() => import('@/pages/Dashboard/Tutorials'));
// const Courses = lazy(() => import('@/pages/Main/Home/components/Courses'));

const Router = () => {
  const { user } = useUser();
  const role = user?.role;
  // const role = 'school';
  const verifyRole = (component: React.ReactNode, path: string) => {
    if (
      routes.find((route) => route.path === path)?.roles.includes(role ?? '')
    ) {
      return component;
    } else {
      return <Navigate to="/dashboard" />;
    }
  };
  // const user = true;
  return useRoutes([
    {
      path: '/',
      element: <Layout />,
      children: [
        { path: '', element: <Home /> },
        { path: 'courses/:courseId', element: <CourseDetails /> },
      ],
    },
    {
      path: '/dashboard',
      element: user ? <DashboardLayout /> : <Navigate to="/login" />,
      children: [
        { path: 'home', element: <DashboardHome /> },
        {
          path: 'market',
          element: <Market />,
        },
        {
          path: 'courses',
          element: <Snai3iCourse />,
        },
        {
          path: 'courses/instructor',
          element: verifyRole(
            <MyCoursesInstDesigner />,
            '/dashboard/courses/instructor'
          ),
        },
        {
          path: 'courses/instructor/create',
          element: verifyRole(
            <CreateCourseByInst />,
            '/dashboard/courses/instructor'
          ),
        },
        {
          path: 'courses/instructor/edit/:courseId',
          element: verifyRole(
            <CreateCourseByInst isEdit />,
            '/dashboard/courses/instructor'
          ),
        },
        {
          path: 'courses/teacher',
          element: verifyRole(
            <MyCoursesTeacher />,
            '/dashboard/courses/teacher'
          ),
        },
        {
          path: 'courses/school',
          element: verifyRole(<MyCoursesSchool />, '/dashboard/courses/school'),
        },
        {
          path: 'snai3i-courses/list',
          element: verifyRole(
            <Snai3iCourses />,
            '/dashboard/snai3i-courses/list'
          ),
        },
        {
          path: 'tutorials',
          element: verifyRole(<Tutorials />, '/dashboard/tutorials'),
        },
        {
          path: 'market-courses/list',
          element: verifyRole(
            <MarketCourses />,
            '/dashboard/market-courses/list'
          ),
        },
        {
          path: 'market-courses/create',
          element: verifyRole(
            <CreateMarketCourse />,
            '/dashboard/market-courses/list'
          ),
        },
        {
          path: 'market-courses/edit/:courseId',
          element: verifyRole(
            <CreateMarketCourse isEdit />,
            '/dashboard/market-courses/list'
          ),
        },
        {
          path: 'snai3i-courses/create',
          element: verifyRole(
            <CreateSnai3iCourse />,
            '/dashboard/snai3i-courses/list'
          ),
        },
        {
          path: 'snai3i-courses/edit/:courseId',
          element: verifyRole(
            <CreateSnai3iCourse isEdit />,
            '/dashboard/snai3i-courses/list'
          ),
        },
        {
          path: 'orders',
          element: verifyRole(<Orders />, '/dashboard/orders'),
        },
        {
          path: 'orders/teachers/create',
          element: verifyRole(<CreateTeacherOrder />, '/dashboard/orders'),
        },
        {
          path: 'orders/teachers/edit/:orderId',
          element: verifyRole(<EditTeacherOrder />, '/dashboard/orders'),
        },
        {
          path: 'orders/schools/create',
          element: verifyRole(<CreateSchoolOrder />, '/dashboard/orders'),
        },
        {
          path: 'orders/schools/edit/:orderId',
          element: verifyRole(<EditSchoolOrder />, '/dashboard/orders'),
        },
        {
          path: 'meetings',
          element: verifyRole(<Meetings />, '/dashboard/meetings'),
        },
        {
          path: 'accounts',
          element: verifyRole(<Accounts />, '/dashboard/accounts'),
        },
        {
          path: 'accounts/create',
          element: verifyRole(<CreateAccount />, '/dashboard/accounts'),
        },
        {
          path: 'accounts/edit/:userId',
          element: verifyRole(<EditAccount />, '/dashboard/accounts'),
        },
        {
          path: 'teachers',
          element: verifyRole(<Teachers />, '/dashboard/teachers'),
        },
        {
          path: 'teachers/create',
          element: verifyRole(<CreateTeacher />, '/dashboard/teachers'),
        },
        {
          path: 'teachers/edit/:teacherId',
          element: verifyRole(<EditTeacher />, '/dashboard/teachers'),
        },
        {
          path: 'settings',
          element: <SettingsPage />,
        },
      ],
    },
    {
      path: '/dashboard/snai3i-courses/enroll',
      element: user ? (
        <DashboardLayout isCourseLayout />
      ) : (
        <Navigate to="/login" />
      ),
      children: [
        {
          path: ':courseId',
          element: <Snai3iCourse />,
        },
      ],
    },
    {
      path: '/login',
      element: user ? <Navigate to="/dashboard" /> : <Login />,
    },
    { path: '*', element: <Error404 /> },
  ]);
};
export default Router;