nexus-1/frontend/components/ProtectedRoute.jsx
2026-01-26 09:45:31 -05:00

59 lines
1.7 KiB
JavaScript

import React from 'react'
import {Navigate} from 'react-router-dom'
import {jwtDecode} from 'jwt-decode'
import api from '../api'
import {REFRESH_TOKEN, ACCESS_TOKEN} from "../constants";
import {useEffect} from "react";
function ProtectedRoute({children}) {
const [isAuthorized, setIsAuthorized] = React.useState(null)
useEffect(() => {
auth().catch(() => setIsAuthorized(false))
}, [])
const refreshToken = async () => {
const refreshToken = localStorage.getItem(REFRESH_TOKEN)
try {
const response = await api.post('token/refresh/', {refresh: refreshToken})
if (response.status === 200) {
localStorage.setItem(ACCESS_TOKEN, response.data.access)
setIsAuthorized(true)
} else {
setIsAuthorized(false)
}
} catch (error) {
console.log(error)
setIsAuthorized(false)
}
}
const auth = async () => {
const token = localStorage.getItem(ACCESS_TOKEN)
if (!token) {
setIsAuthorized(false)
return
}
try {
const decoded = jwtDecode(token)
const tokenExpiration = decoded.exp
const now = Date.now() / 1000
if (tokenExpiration < now) {
await refreshToken()
} else {
setIsAuthorized(true)
}
} catch (error) {
console.error('Error decoding token:', error);
setIsAuthorized(false);
}
}
if (isAuthorized === null) {
return <div>Loading...</div>
}
return isAuthorized ? children : <Navigate to="/login"/>
}
export default ProtectedRoute