'react js axios interceptions

when i use bellow component as a hook and called hook from multiple components interceptor handler grove. when auth token get expired interceptor called too many times and made refresh token request how can i solve this issue


import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom';
import useAuth from './useAuth'; import axios, { axiosPrivate } from '../api/axios';
import { FORBIDDEN } from '../util/util'
    
    function useAxiosPrivate() {
        const { auth, setAuth } = useAuth();
        const navigate = useNavigate();
        const getRefreshToken = () => {        
            return new Promise((resolve, reject) => {
                axios.post('/api/User/RefreshToken', {refreshToken : auth.refreshToken}, {
                    'Content-Type' : 'application/json'
                })
                .then(resp =>  resolve(resp))
                .catch(err => reject(err))
            })        
        }
    
        useEffect(() => {
            console.log(axiosPrivate.interceptors.request)
            const privateApi = axiosPrivate.interceptors.request.use(async request => {
                try {
                    if((auth.tokenExpireDate * 1000) <= Date.now()) {
                        let resp = await getRefreshToken();
                        request.headers.Authorization = 'Bearer ' +  resp.data.result.token;                
                        setAuth({
                            ...auth,
                            refreshToken : resp.data.result.refreshToken,
                            token : resp.data.result.token,
                            tokenExpireDate : resp.data.result.tokenExpireDate
                        });
                    }
                                   
                    if(auth?.token && (auth.tokenExpireDate * 1000) > Date.now()){
                        request.headers.Authorization = 'Bearer ' + auth.token;
                    }                
                    return Promise.resolve(request);
                }catch(ex){
                    
                    request.headers.Authorization = 'Bearer ' + auth.token;
                    return Promise.resolve(request);
                    
                }            
            }, error => {
                navigate(FORBIDDEN, {replace: true})
            })
    
            console.log("use effect", privateApi);
            return () => {                    
                axiosPrivate.interceptors.request.eject(privateApi);
            }
        }, [auth]);    
        return axiosPrivate;
     }
    export default useAxiosPrivate;



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source