forked from cartsnitch/cartsnitch
cd733fbc7d
- Remove unused `response` variable in j8-unauth-access.spec.ts:40 - Move Dashboard route inside ProtectedRoute wrapper in App.tsx - Add VITE_MOCK_AUTH mode to ProtectedRoute: check Zustand isAuthenticated flag instead of calling authClient.useSession() Co-Authored-By: Paperclip <noreply@paperclip.ing>
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import { useEffect } from 'react'
|
|
import { Navigate, Outlet } from 'react-router-dom'
|
|
import { authClient } from '../lib/auth-client.ts'
|
|
import { useAuthStore } from '../stores/auth.ts'
|
|
|
|
export function ProtectedRoute() {
|
|
const isMockAuth = import.meta.env.VITE_MOCK_AUTH === 'true'
|
|
const { data: session, isPending } = authClient.useSession()
|
|
const isAuthenticated = useAuthStore((s) => s.isAuthenticated)
|
|
const setAuthenticated = useAuthStore((s) => s.setAuthenticated)
|
|
|
|
useEffect(() => {
|
|
if (!isMockAuth) {
|
|
setAuthenticated(!!session)
|
|
}
|
|
}, [session, setAuthenticated, isMockAuth])
|
|
|
|
// In mock auth mode, rely on Zustand store (set by Login/Register pages)
|
|
if (isMockAuth) {
|
|
if (!isAuthenticated) return <Navigate to="/login" replace />
|
|
return <Outlet />
|
|
}
|
|
|
|
if (isPending) {
|
|
return (
|
|
<div className="flex min-h-screen items-center justify-center">
|
|
<div className="h-8 w-8 animate-spin rounded-full border-2 border-brand-blue border-t-transparent" />
|
|
</div>
|
|
)
|
|
}
|
|
|
|
if (!session) {
|
|
return <Navigate to="/login" replace />
|
|
}
|
|
|
|
return <Outlet />
|
|
}
|