import type { AxiosError, CreateAxiosDefaults, CustomAxiosRequestConfig, MappedType, RequestInstanceCommon, RequestOption, ResponseType, } from '@sa/axios' import type { Ref } from 'vue' import { createFlatRequest } from '@sa/axios' import { ref } from 'vue' import useLoading from './use-loading' export interface HookRequestInstanceResponseSuccessData { data: Ref error: Ref } export interface HookRequestInstanceResponseFailData { data: Ref error: Ref> } export type HookRequestInstanceResponseData = { loading: Ref } & (HookRequestInstanceResponseSuccessData | HookRequestInstanceResponseFailData) export interface HookRequestInstance< ResponseData, ApiData, State extends Record, > extends RequestInstanceCommon { ( config: CustomAxiosRequestConfig ): HookRequestInstanceResponseData> } /** * create a hook request instance * * @param axiosConfig * @param options */ export default function createHookRequest>( axiosConfig?: CreateAxiosDefaults, options?: Partial>, ) { const request = createFlatRequest(axiosConfig, options) const hookRequest: HookRequestInstance = function hookRequest< T extends ApiData = ApiData, R extends ResponseType = 'json', >(config: CustomAxiosRequestConfig) { const { loading, startLoading, endLoading } = useLoading() const data = ref(null) as Ref> const error = ref(null) as Ref | null> startLoading() request(config).then((res) => { if (res.data) { data.value = res.data as MappedType } else { error.value = res.error } endLoading() }) return { loading, data, error, } } as HookRequestInstance hookRequest.cancelAllRequest = request.cancelAllRequest return hookRequest }