first commit
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
import axios from 'axios'
|
||||
import { toast } from 'vue3-toastify'
|
||||
|
||||
import { camelize, snakize } from '@/utils/convert-to-camel-snake'
|
||||
import { tokenService } from '@/services/api/token-service'
|
||||
|
||||
const defaultHeaders = {
|
||||
'Content-Type': 'application/json',
|
||||
Accept: 'application/json',
|
||||
}
|
||||
|
||||
const addAuthTokenInterceptor = (instance) => {
|
||||
instance.interceptors.request.use(
|
||||
(config) => {
|
||||
const token = tokenService.getToken()
|
||||
const headers = {
|
||||
...config.headers,
|
||||
Authorization: token ? `Bearer ${token}` : '',
|
||||
}
|
||||
if (config.data instanceof FormData) {
|
||||
delete headers['Content-Type']
|
||||
}
|
||||
return { ...config, headers }
|
||||
},
|
||||
null,
|
||||
{ synchronous: true }
|
||||
)
|
||||
}
|
||||
|
||||
const addSnakizeInterceptor = (instance) => {
|
||||
instance.interceptors.request.use(
|
||||
(config) => {
|
||||
if (config.data instanceof FormData || config.noSnakize) {
|
||||
return config
|
||||
}
|
||||
return {
|
||||
...config,
|
||||
params: config.params ? snakize(config.params) : {},
|
||||
data: config.data ? snakize(config.data) : undefined,
|
||||
}
|
||||
},
|
||||
(e) => Promise.reject(e)
|
||||
)
|
||||
}
|
||||
|
||||
const addResponseUnwrapInterceptor = (instance) => {
|
||||
instance.interceptors.response.use(
|
||||
(res) => {
|
||||
if (typeof res?.data === 'number' || typeof res?.data === 'boolean') {
|
||||
return { data: res.data }
|
||||
}
|
||||
return res?.data || res
|
||||
},
|
||||
(e) => Promise.reject(e)
|
||||
)
|
||||
}
|
||||
|
||||
const addCamelizeInterceptor = (instance) => {
|
||||
instance.interceptors.response.use(
|
||||
(res) => camelize(res),
|
||||
(e) => Promise.reject(e)
|
||||
)
|
||||
}
|
||||
|
||||
const addUnauthorizeInterceptor = (instance) => {
|
||||
instance.interceptors.response.use(
|
||||
(res) => res,
|
||||
async (e) => {
|
||||
if (e?.response?.status === 401) {
|
||||
tokenService.clearAll()
|
||||
toast('نشست شما تایید نشد، لطفا مجدد وارد شوید')
|
||||
try {
|
||||
const { default: router } = await import('@/router')
|
||||
router.push('/login').catch(() => {})
|
||||
} catch {}
|
||||
}
|
||||
throw e
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const createInstance = (baseUrl, { headers = {}, ...configs } = {}) => {
|
||||
const instance = axios.create({
|
||||
timeout: 15_000,
|
||||
baseURL: baseUrl,
|
||||
headers: { ...defaultHeaders, ...headers },
|
||||
...configs,
|
||||
})
|
||||
addAuthTokenInterceptor(instance)
|
||||
addResponseUnwrapInterceptor(instance)
|
||||
addCamelizeInterceptor(instance)
|
||||
addSnakizeInterceptor(instance)
|
||||
addUnauthorizeInterceptor(instance)
|
||||
return instance
|
||||
}
|
||||
|
||||
export const http = createInstance(import.meta.env.VITE_API_BASE_URL || '')
|
||||
|
||||
export { createInstance }
|
||||
Reference in New Issue
Block a user