| 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 |
|
|