Handle Data on Reload in React¶
This is the protected wrapper
import React, { useContext, useEffect, useState } from 'react'
import { CaptainDataContext } from '../context/CapatainContext'
import { useNavigate } from 'react-router-dom'
import axios from 'axios'
const CaptainProtectWrapper = ({
children
}) => {
const token = localStorage.getItem('token')
const navigate = useNavigate()
const { captain, setCaptain } = useContext(CaptainDataContext)
const [ isLoading, setIsLoading ] = useState(true)
useEffect(() => {
if (!token) {
navigate('/captain-login')
}
axios.get(`${import.meta.env.VITE_BASE_URL}/captains/profile`, {
headers: {
Authorization: `Bearer ${token}`
}
}).then(response => {
if (response.status === 200) {
setCaptain(response.data.captain)
setIsLoading(false)
}
})
.catch(err => {
localStorage.removeItem('token')
navigate('/captain-login')
})
}, [ token ])
if (isLoading) {
return (
<div>Loading...</div>
)
}
return (
<>
{children}
</>
)
}
export default CaptainProtectWrapper
context part
import { createContext, useState, useContext } from 'react';
export const CaptainDataContext = createContext();
const CaptainContext = ({ children }) => {
const [ captain, setCaptain ] = useState(null);
const [ isLoading, setIsLoading ] = useState(false);
const [ error, setError ] = useState(null);
const updateCaptain = (captainData) => {
setCaptain(captainData);
};
const value = {
captain,
setCaptain,
isLoading,
setIsLoading,
error,
setError,
updateCaptain
};
return (
<CaptainDataContext.Provider value={value}>
{children}
</CaptainDataContext.Provider>
);
};
export default CaptainContext;