33 lines
937 B
TypeScript
33 lines
937 B
TypeScript
import { Navigate, Outlet } from 'react-router';
|
|
import { useAuthStore } from '../features/auth/store';
|
|
|
|
interface ProtectedRouteProps {
|
|
requiresAuth?: boolean;
|
|
requiresAdmin?: boolean;
|
|
}
|
|
|
|
const ProtectedRoute = ({
|
|
requiresAuth = true,
|
|
requiresAdmin = false,
|
|
}: ProtectedRouteProps) => {
|
|
const { isAuthenticated, user } = useAuthStore();
|
|
|
|
// Jika memerlukan authentication tapi tidak authenticated, redirect ke login
|
|
if (requiresAuth && !isAuthenticated) {
|
|
return <Navigate to="/login" replace />;
|
|
}
|
|
|
|
// Jika sudah authenticated tapi mengakses halaman login, redirect ke dashboard
|
|
if (!requiresAuth && isAuthenticated) {
|
|
return <Navigate to="/dashboard" replace />;
|
|
}
|
|
|
|
// Jika memerlukan role admin tapi bukan admin, redirect ke dashboard
|
|
if (requiresAdmin && user?.role !== 'admin') {
|
|
return <Navigate to="/dashboard" replace />;
|
|
}
|
|
|
|
return <Outlet />;
|
|
};
|
|
|
|
export default ProtectedRoute; |