80 lines
3.0 KiB
JavaScript
80 lines
3.0 KiB
JavaScript
import { useEffect } from "react";
|
|
import { Routes, Route, Navigate, useNavigate, useLocation } from "react-router-dom";
|
|
|
|
import LoginPage from "./src/Login/login";
|
|
import Dashboard from "./src/dashboard";
|
|
import AlumniForm from "./src/form-alumni";
|
|
import ExportKlasifikasi from "./src/Export-Klasifikasi";
|
|
import ForgotPassword from "./src/forgot-password";
|
|
import ProsesKlasifikasi from "./src/proses-klasifikasi";
|
|
import ResetPassword from "./src/reset-password";
|
|
import TahunAngkatan from "./src/tahun-angkatan";
|
|
import ImportData from "./src/ImportData";
|
|
import KuesionerAlumni from "./src/kuesioner-alumni";
|
|
import KamusKataKunci from "./src/kamus-kata-kunci";
|
|
|
|
function ProtectedRoute({ children }) {
|
|
const navigate = useNavigate();
|
|
const location = useLocation();
|
|
|
|
useEffect(() => {
|
|
const checkAuth = () => {
|
|
const token = localStorage.getItem('token');
|
|
const username = localStorage.getItem('username');
|
|
if (!token || !username) {
|
|
navigate('/', { replace: true });
|
|
}
|
|
};
|
|
|
|
checkAuth();
|
|
|
|
// Dengarkan saat logout dari tab browser lain
|
|
const handleStorageChange = (e) => {
|
|
if (e.key === 'token' || e.key === 'username' || e.key === null) {
|
|
checkAuth();
|
|
}
|
|
};
|
|
|
|
window.addEventListener('storage', handleStorageChange);
|
|
return () => window.removeEventListener('storage', handleStorageChange);
|
|
}, [navigate, location]);
|
|
|
|
const token = localStorage.getItem('token');
|
|
const username = localStorage.getItem('username');
|
|
|
|
if (!token || !username) {
|
|
return <Navigate to="/" replace />;
|
|
}
|
|
|
|
return children;
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<Routes>
|
|
{/* Rute Publik */}
|
|
<Route path="/" element={<LoginPage />} />
|
|
<Route path="/register" element={<Navigate to="/" replace />} />
|
|
<Route path="/forgot-password" element={<ForgotPassword />} />
|
|
<Route path="/reset-password" element={<ResetPassword />} />
|
|
<Route path="/kuesioner" element={<KuesionerAlumni />} />
|
|
<Route path="/tracer-study" element={<KuesionerAlumni />} />
|
|
|
|
{/* Rute Terproteksi (Wajib Login) */}
|
|
<Route path="/dashboard" element={<ProtectedRoute><Dashboard /></ProtectedRoute>} />
|
|
<Route path="/alumni" element={<ProtectedRoute><AlumniForm /></ProtectedRoute>} />
|
|
<Route path="/export-klasifikasi" element={<ProtectedRoute><ExportKlasifikasi /></ProtectedRoute>} />
|
|
<Route path="/proses-klasifikasi" element={<ProtectedRoute><ProsesKlasifikasi /></ProtectedRoute>} />
|
|
<Route path="/tahun-angkatan" element={<ProtectedRoute><TahunAngkatan /></ProtectedRoute>} />
|
|
<Route path="/import" element={<ProtectedRoute><ImportData standalone={true} /></ProtectedRoute>} />
|
|
<Route path="/keywords" element={<ProtectedRoute><KamusKataKunci standalone={true} /></ProtectedRoute>} />
|
|
<Route path="/kamus-kata-kunci" element={<ProtectedRoute><KamusKataKunci standalone={true} /></ProtectedRoute>} />
|
|
|
|
{/* Fallback jika route tidak ditemukan */}
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
);
|
|
}
|
|
|
|
export default App;
|