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 { data: T message: string | null status: string } function http( { url, data, method, headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, ) { const successHandler = (res: AxiosResponse>) => { 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) => { 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( { url, data, method = 'GET', onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, ): Promise> { return http({ url, method, data, onDownloadProgress, signal, beforeRequest, afterRequest, }) } export function post( { url, data, method = 'POST', headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, ): Promise> { return http({ url, method, data, headers, onDownloadProgress, signal, beforeRequest, afterRequest, }) } export default post