From 1d819cd532b83c26ad97ca8ab14d1f01b0f58e2c Mon Sep 17 00:00:00 2001 From: alij Date: Sun, 16 Jun 2024 01:21:57 +0430 Subject: [PATCH] feat : add hook axios --- src/hooks/useAxios.ts | 45 +++++++++++++++++++++++++++++++++++++++++++ src/http.ts | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/hooks/useAxios.ts create mode 100644 src/http.ts diff --git a/src/hooks/useAxios.ts b/src/hooks/useAxios.ts new file mode 100644 index 0000000..fe281fb --- /dev/null +++ b/src/hooks/useAxios.ts @@ -0,0 +1,45 @@ +// src/hooks/useAxios.ts +import { useNavigate } from "react-router-dom"; +import axios from "axios"; +import store from "../redux/store"; +import { setToken } from "../redux/slices/token"; + +const useAxios = () => { + const navigate = useNavigate(); + + const instance = axios.create({ + baseURL: "https://ping.soheilkhaledabadi.ir/api/v1", + maxBodyLength: Infinity, + }); + + instance.interceptors.request.use( + (config) => { + const state = store.getState(); + const token = state.token.token; + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => { + return Promise.reject(error); + } + ); + + instance.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + if (error.response && error.response.status === 401) { + store.dispatch(setToken('')); + navigate('/login'); + } + return Promise.reject(error); + } + ); + + return instance; +}; + +export default useAxios; diff --git a/src/http.ts b/src/http.ts new file mode 100644 index 0000000..f701e37 --- /dev/null +++ b/src/http.ts @@ -0,0 +1,41 @@ +import axios from "axios"; +import store from "./redux/store"; +import { setToken } from "./redux/slices/token"; +import { useNavigate } from "react-router-dom"; + + +const navigate = useNavigate() + +const instance = axios.create({ + baseURL: "https://ping.soheilkhaledabadi.ir/api/v1", + maxBodyLength: Infinity, +}); + +axios.interceptors.request.use( + (config) => { + const state = store.getState(); + const token = state.token.token; + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => { + return Promise.reject(error); + } +); + +axios.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + if (error.response && error.response.status === 401) { + navigate('/login') + store.dispatch(setToken('')); + } + return Promise.reject(error); + } +); + +export default instance;