38 lines
1.0 KiB
JSON
38 lines
1.0 KiB
JSON
import { useEffect } from 'react';
|
|
import { Outlet } from 'react-router-dom';
|
|
import { useAuth } from '@/lib/AuthContext';
|
|
import UserNotRegisteredError from '@/components/UserNotRegisteredError';
|
|
|
|
const DefaultFallback = () => (
|
|
<div className="fixed inset-0 flex items-center justify-center">
|
|
<div className="w-8 h-8 border-4 border-slate-200 border-t-slate-800 rounded-full animate-spin"></div>
|
|
</div>
|
|
);
|
|
|
|
export default function ProtectedRoute({ fallback = <DefaultFallback />, unauthenticatedElement }) {
|
|
const { isAuthenticated, isLoadingAuth, authChecked, authError, checkUserAuth } = useAuth();
|
|
|
|
useEffect(() => {
|
|
if (!authChecked && !isLoadingAuth) {
|
|
checkUserAuth();
|
|
}
|
|
}, [authChecked, isLoadingAuth, checkUserAuth]);
|
|
|
|
if (isLoadingAuth || !authChecked) {
|
|
return fallback;
|
|
}
|
|
|
|
if (authError) {
|
|
if (authError.type === 'user_not_registered') {
|
|
return <UserNotRegisteredError />;
|
|
}
|
|
return unauthenticatedElement;
|
|
}
|
|
|
|
if (!isAuthenticated) {
|
|
return unauthenticatedElement;
|
|
}
|
|
|
|
return <Outlet />;
|
|
}
|