File size: 3,142 Bytes
898b101 5dd0307 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 898b101 5dd0307 898b101 5dd0307 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 898b101 99dec8c 5dd0307 99dec8c 5dd0307 99dec8c 5dd0307 898b101 0156bac | 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | import React from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate, useLocation } from 'react-router-dom';
import './Styles.css';
import './Styles/auth.css';
import Header from './components/header';
import Footer from './components/footer';
import Hero from './components/hero';
import Features from './components/Features';
import Privacy from './components/Privacy';
import DiagnosisPage from './components/DiagnosisPage';
import Login from './components/Login';
import Register from './components/Register';
import AdminDashboard from './components/AdminDashboard';
// --- 1. PROTEKSI KHUSUS ADMIN ---
// Jika User biasa mencoba masuk, lempar ke /diagnosis
const AdminRoute = ({ children }) => {
const token = localStorage.getItem("token");
const role = localStorage.getItem("user_role");
const location = useLocation();
if (!token) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
if (role !== 'admin') {
return <Navigate to="/diagnosis" replace />;
}
return children;
};
// --- 2. PROTEKSI KHUSUS USER BIASA ---
// Jika Admin mencoba masuk, lempar ke /admin
const UserRoute = ({ children }) => {
const token = localStorage.getItem("token");
const role = localStorage.getItem("user_role");
const location = useLocation();
if (!token) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
if (role === 'admin') {
return <Navigate to="/admin" replace />;
}
return children;
};
// --- Halaman Home (Publik) ---
const HomePage = () => {
const role = localStorage.getItem("user_role");
// Logika tombol "Mulai" di Hero
const navigateTo = (page) => {
if (page === 'diagnosis') {
if (role === 'admin') {
window.location.href = '/admin';
} else {
window.location.href = '/diagnosis';
}
}
};
return (
<>
<Hero navigateTo={navigateTo} />
<Features />
<Privacy />
</>
);
};
const App = () => {
const token = localStorage.getItem("token");
const userFullname = localStorage.getItem("user_fullname") || "Pengguna";
const userRole = localStorage.getItem("user_role") || "user";
const authStatusData = {
isLoggedIn: !!token,
user: {
name: userFullname,
role: userRole
}
};
return (
<Router>
<Header authStatus={authStatusData} />
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/login" element={<Login />} />
<Route path="/register" element={<Register />} />
{/* Halaman Chat: HANYA USER BIASA */}
<Route
path="/diagnosis"
element={
<UserRoute>
<DiagnosisPage />
</UserRoute>
}
/>
{/* Halaman Admin: HANYA ADMIN */}
<Route
path="/admin"
element={
<AdminRoute>
<AdminDashboard />
</AdminRoute>
}
/>
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
<Footer />
</Router>
);
};
export default App; |