Files
ReelShortWeb/src/axios/index.ts
T

55 lines
1.9 KiB
TypeScript

// Author: fruit.com.cn
import service from './service'
import { CONTENT_TYPE } from '@/constants'
import { useUserStoreWithOut } from '@/store/modules/user'
import { creatorCenterHeaders } from '@/utils/creatorImpersonation'
const request = (option: AxiosConfig) => {
const { url, method, params, data, headers, responseType, silent } = option
const userStore = useUserStoreWithOut()
// FormData 不能带 JSON 的 Content-Type,否则 axios 会把表单转成 JSON,浏览器也无法补上 boundary
const isFormData = typeof FormData !== 'undefined' && data instanceof FormData
// 创作者中心的请求统一带上代看目标头(超管选了代看创作者时才有值;
// 后端只对具备 impersonate 权限的账号认这个头,创作者带了也不生效)
const impersonationHeaders =
typeof url === 'string' && url.startsWith('/admin/creator-center') ? creatorCenterHeaders() : {}
return service.request({
url: url,
method,
params,
data,
responseType: responseType,
silent,
headers: {
...(isFormData ? {} : { 'Content-Type': CONTENT_TYPE }),
[userStore.getTokenKey ?? 'Authorization']: userStore.getToken
? `Bearer ${userStore.getToken}`
: '',
...impersonationHeaders,
...headers
}
})
}
export default {
get: <T = any>(option: AxiosConfig) => {
return request({ method: 'get', ...option }) as Promise<IResponse<T>>
},
post: <T = any>(option: AxiosConfig) => {
return request({ method: 'post', ...option }) as Promise<IResponse<T>>
},
delete: <T = any>(option: AxiosConfig) => {
return request({ method: 'delete', ...option }) as Promise<IResponse<T>>
},
put: <T = any>(option: AxiosConfig) => {
return request({ method: 'put', ...option }) as Promise<IResponse<T>>
},
cancelRequest: (url: string | string[]) => {
return service.cancelRequest(url)
},
cancelAllRequest: () => {
return service.cancelAllRequest()
}
}