File size: 2,945 Bytes
07e8920
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import { AuthProvider, useAuth } from "./contexts/AuthContext";
import { LeaveProvider } from "./contexts/LeaveContext";
import { NotificationProvider } from "./contexts/NotificationContext";
import { EmployeeProvider } from "./contexts/EmployeeContext";
import { Navbar } from "./components/common/Navbar";
import { Login } from "./pages/Login";
import { Home } from "./pages/Home";
import { EmployeeDashboard } from "./pages/EmployeeDashboard";
import { ManagerDashboard } from "./pages/ManagerDashboard";
import { HRDashboard } from "./pages/HRDashboard";
import { ChatPage } from "./pages/ChatPage";

function ProtectedRoute({ children, allowedRoles }) {
  const { user, loading } = useAuth();
  if (loading) return <div className="flex items-center justify-center min-h-screen"><p className="text-gray-500">Loading...</p></div>;
  if (!user) return <Navigate to="/login" />;
  if (allowedRoles && !allowedRoles.includes(user.role)) {
    if (user.role === "employee") return <Navigate to="/dashboard" />;
    if (user.role === "manager") return <Navigate to="/manager-dashboard" />;
    if (user.role === "hr") return <Navigate to="/hr/dashboard" />;
    return <Navigate to="/login" />;
  }
  return children;
}

function AppLayout({ children, allowedRoles }) {
  return (
    <ProtectedRoute allowedRoles={allowedRoles}>
      <div className="min-h-screen bg-gray-50">
        <Navbar />
        <main>{children}</main>
      </div>
    </ProtectedRoute>
  );
}

export default function App() {
  return (
    <BrowserRouter>
      <AuthProvider>
        <NotificationProvider>
          <LeaveProvider>
            <EmployeeProvider>
              <Routes>
                <Route path="/login" element={<Login />} />
                <Route path="/" element={<Home />} />

                <Route path="/dashboard" element={<AppLayout allowedRoles={["employee"]}><EmployeeDashboard /></AppLayout>} />
                <Route path="/apply" element={<AppLayout allowedRoles={["employee"]}><EmployeeDashboard /></AppLayout>} />
                <Route path="/manager-dashboard" element={<AppLayout allowedRoles={["manager"]}><ManagerDashboard /></AppLayout>} />
                <Route path="/manager/team" element={<AppLayout allowedRoles={["manager"]}><ManagerDashboard /></AppLayout>} />
                <Route path="/hr/dashboard" element={<AppLayout allowedRoles={["hr"]}><HRDashboard /></AppLayout>} />
                <Route path="/hr/employees" element={<AppLayout allowedRoles={["hr"]}><HRDashboard /></AppLayout>} />
                <Route path="/chat" element={<AppLayout allowedRoles={["manager"]}><ChatPage /></AppLayout>} />

                <Route path="*" element={<Navigate to="/" />} />
              </Routes>
            </EmployeeProvider>
          </LeaveProvider>
        </NotificationProvider>
      </AuthProvider>
    </BrowserRouter>
  );
}