Untitled

 avatar
unknown
plain_text
a year ago
2.6 kB
3
Indexable
//import { showToast } from 'src/utils/app.utils'
import axios from 'axios'

export const axiosBaseConfigs = () => {
  const API_V1_URL = `${process.env.NEXT_PUBLIC_API}v1/`
  axios.defaults.baseURL = API_V1_URL
  axios.defaults.timeout = 15000

  axios.interceptors.request.use(
    async function (config) {
      const token = localStorage.getItem('accessToken')
      const tokenOfSuperAdmin = localStorage.getItem('accessTokenSuperUser')

      if (tokenOfSuperAdmin && (config?.url?.includes('switch-branch') || config?.url?.includes('switch-user'))) {
        config.headers['Authorization'] = `Bearer ${tokenOfSuperAdmin}`
      } else {
        config.headers['Authorization'] = `Bearer ${token}`
      }

      return config
    },
    function (error) {
      // Do something with request error
      return Promise.reject(error)
    }
  )

  function createAxiosResponseInterceptor() {
    const interceptor = axios.interceptors.response.use(
      response => response,
      (error: any) => errorHandler(error)
    )

    // ===========================

    const errorHandler = async (error: any) => {
      console.log('error:', error)
      const isInvalidToken = error?.response?.status === 401
      const originalRequest = error.config
      const refreshToken = localStorage.getItem('refreshToken')

      if (isInvalidToken && refreshToken) {
        // ĐẦU TIÊN LÀ HỦY REQUEST ĐÃ
        axios.interceptors.response.eject(interceptor)
        localStorage.setItem('accessToken', refreshToken)
        originalRequest.headers['Authorization'] = 'Bearer ' + refreshToken

        return axios
          .get('auth/get-access-token')
          .then(refreshRes => {
            console.log('refreshRes:', refreshRes)

            if (refreshRes?.data) {
              localStorage.setItem('accessToken', refreshRes?.data.accessToken)
              originalRequest.headers['Authorization'] = 'Bearer ' + refreshRes.data.accessToken

              // Thực hiện lại request ban đầu với Access Token mới. Điều này giúp tránh lặp vô hạn và tiếp tục thực hiện request sau khi token đã được làm mới
              return axios(originalRequest)
            }
          })
          .catch((err: any) => {
            console.log('errcatch:', err)
            return Promise.reject(err)
          })
        // .finally(createAxiosResponseInterceptor)
      }

      return Promise.reject(error)
    }
  }
  createAxiosResponseInterceptor()
}
Leave a Comment