59 lines
1.7 KiB
JavaScript
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
|