Este es mi axios-hoook.js y estoy usando el paquete axios-hooks .
import useAxios from 'axios-hooks'; import axios from 'axios'; import LocalStorageService from './services/local-storage.service'; import refreshToken from './refresh-token'; axios.defaults.baseURL = 'http://localhost:3000/api/v1'; axios.defaults.transformResponse = [ (responseData) => { const { data, error } = JSON.parse(responseData); return error || data; }, ]; // request interceptor to add token to request headers axios.interceptors.request.use( async (config) => { const token = LocalStorageService.getAccessToken(); if (token) { config.headers = { authorization: token, }; } return config; }, (error) => Promise.reject(error) ); // response interceptor intercepting 401 responses, refreshing token and retrying the request axios.interceptors.response.use( (response) => response, (error) => { const { config } = error; if (error.response?.status === 401 && !config._retry) { config._retry = true; refreshToken(LocalStorageService.getRefreshToken()) .then((res) => { const { accessToken } = res.data.data; LocalStorageService.setAccessToken(accessToken); return axios(config); }) .catch((err) => { if (err.response.status === 401) { LocalStorageService.setUser(null); window.location.href = '/login'; } return Promise.reject(err); }); } return Promise.reject(error); } ); export default useAxios; Este es el Course.jsx donde se está utilizando.
const Course = () => { const [{ data: courses = [] }, refetchCourse] = axiosHook(ApiConfig.COURSE.GET_COURSES.url); return ( <Datatable entity={entity} columns={courseColumns} rows={courses} deleteRow={handleDeactivate} viewRow={handleView} /> ) }En los documentos de axios-hooks hay un enlace a un ejemplo de trabajo para implementar una función de token de actualización. Se ejecuta en CodeSandbox en este enlace https://codesandbox.io/s/axios-hooks-authentication-zyeyh .
Compare eso con su ejemplo y encontrará la razón por la cual el suyo no funciona.
Hubo un error en mi código. No estaba devolviendo la promesa.
axios.interceptors.response.use( (response) => response, (error) => { const { config } = error; if (error.response?.status === 401 && !config._retry) { config._retry = true; return refreshToken(LocalStorageService.getRefreshToken()) // this line .then((res) => { const { accessToken } = res.data.data; LocalStorageService.setAccessToken(accessToken); return axios(config); }) .catch((err) => { if (err.response.status === 401) { LocalStorageService.setUser(null); window.location.href = '/login'; } return Promise.reject(err); }); } return Promise.reject(error); } );