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