Files
banu-front/src/services/api/http.js
T
sajjadtalkhabi 9660e3fe8f
Deploy banu-front / deploy (push) Successful in 1m28s
fix: linter
2026-05-28 15:52:48 +03:30

99 lines
2.5 KiB
JavaScript

import axios from 'axios'
import { toast } from 'vue3-toastify'
import { tokenService } from '@/services/api/token-service'
import { camelize, snakize } from '@/utils/convert-to-camel-snake'
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 }