Skip to content

Instantly share code, notes, and snippets.

@swport
Last active February 25, 2023 19:21
Show Gist options
  • Save swport/742512716b9f89527d9bd8f33be01af0 to your computer and use it in GitHub Desktop.
Save swport/742512716b9f89527d9bd8f33be01af0 to your computer and use it in GitHub Desktop.
Axios react-hook to know how many network requests are currently running
import axios from 'axios';
const addToast = (message: string, type: 'success' | 'error') => {
/// add logic to show toast
};
// hook to know if there are network requests currently running
// and how many are running
export const useAxiosLoader = () => {
const [counter, setCounter] = React.useState(0);
React.useEffect(() => {
const reqInterceptor = axios.interceptors.request.use(
(config) => {
setCounter(counter => counter + 1);
return config;
}
);
const resInterceptor = axios.interceptors.response.use(
(response: AxiosResponse<ResponseType>) => {
setCounter(counter => counter - 1);
if( response.data ) {
const { message } = response.data;
if( message ) {
addToast(message, 'success');
}
}
return response;
},
(error: AxiosError<ResponseType>) => {
setCounter(counter => counter - 1);
if( error.response && error.response.data ) {
const { message } = error.response.data;
if( message ) {
// TODO: don't issue toast in some cases
addToast(message, 'error');
}
}
return Promise.reject(error);
}
);
return () => {
axios.interceptors.request.eject(reqInterceptor);
axios.interceptors.response.eject(resInterceptor);
};
}, []);
// counter greater than 0 means there's at least one network call still pending
return [counter > 0, counter];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment