26 lines
788 B
TypeScript
26 lines
788 B
TypeScript
import { useEffect, useState } from 'react'
|
|
import { Navigate, Outlet } from 'react-router-dom'
|
|
import clientRoutes from '@/clientRoutes'
|
|
import apiFetch from '@/lib/apiFetch'
|
|
|
|
export default function ProtectedRoute() {
|
|
const [isAuthenticated, setIsAuthenticated] = useState<boolean | null>(null)
|
|
|
|
useEffect(() => {
|
|
async function checkSession() {
|
|
try {
|
|
// backend otomatis baca cookie JWT dari request
|
|
const res = await apiFetch.api.user.find.get()
|
|
setIsAuthenticated(res.status === 200)
|
|
} catch {
|
|
setIsAuthenticated(false)
|
|
}
|
|
}
|
|
checkSession()
|
|
}, [])
|
|
|
|
if (isAuthenticated === null) return null // or loading spinner
|
|
if (!isAuthenticated) return <Navigate to={clientRoutes['/login']} replace />
|
|
return <Outlet />
|
|
}
|