Spaces:
Runtime error
Runtime error
import type { AxiosProgressEvent, AxiosResponse, GenericAbortSignal } from 'axios' | |
import request from './axios' | |
import { useAuthStore } from '@/store' | |
export interface HttpOption { | |
url: string | |
data?: any | |
method?: string | |
headers?: any | |
onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void | |
signal?: GenericAbortSignal | |
beforeRequest?: () => void | |
afterRequest?: () => void | |
} | |
export interface Response<T = any> { | |
data: T | |
message: string | null | |
status: string | |
} | |
function http<T = any>( | |
{ url, data, method, headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, | |
) { | |
const successHandler = (res: AxiosResponse<Response<T>>) => { | |
const authStore = useAuthStore() | |
if (res.data.status === 'Success' || typeof res.data === 'string') | |
return res.data | |
if (res.data.status === 'Unauthorized') { | |
authStore.removeToken() | |
window.location.reload() | |
} | |
return Promise.reject(res.data) | |
} | |
const failHandler = (error: Response<Error>) => { | |
afterRequest?.() | |
throw new Error(error?.message || 'Error') | |
} | |
beforeRequest?.() | |
method = method || 'GET' | |
const params = Object.assign(typeof data === 'function' ? data() : data ?? {}, {}) | |
return method === 'GET' | |
? request.get(url, { params, signal, onDownloadProgress }).then(successHandler, failHandler) | |
: request.post(url, params, { headers, signal, onDownloadProgress }).then(successHandler, failHandler) | |
} | |
export function get<T = any>( | |
{ url, data, method = 'GET', onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, | |
): Promise<Response<T>> { | |
return http<T>({ | |
url, | |
method, | |
data, | |
onDownloadProgress, | |
signal, | |
beforeRequest, | |
afterRequest, | |
}) | |
} | |
export function post<T = any>( | |
{ url, data, method = 'POST', headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, | |
): Promise<Response<T>> { | |
return http<T>({ | |
url, | |
method, | |
data, | |
headers, | |
onDownloadProgress, | |
signal, | |
beforeRequest, | |
afterRequest, | |
}) | |
} | |
export default post | |