You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.6 KiB
64 lines
2.6 KiB
import type { AsyncData, UseFetchOptions } from '#app'
|
|
import type { KeysOf, PickFrom } from '#app/composables/asyncData'
|
|
import type { NitroFetchRequest, TypedInternalResponse, AvailableRouterMethod } from 'nitropack/types'
|
|
import type { FetchError } from 'ofetch'
|
|
import type { Ref } from 'vue'
|
|
import { _useHttpFetch, _useLazyHttpFetch, type UnwrapApiResponse } from './http/factory'
|
|
|
|
type DefaultMethod<ReqT extends NitroFetchRequest> = 'get' extends AvailableRouterMethod<ReqT>
|
|
? 'get'
|
|
: AvailableRouterMethod<ReqT>
|
|
|
|
type HttpFetchOptions<
|
|
_ResT,
|
|
DataT,
|
|
PickKeys extends KeysOf<DataT>,
|
|
DefaultT,
|
|
ReqT extends NitroFetchRequest,
|
|
Method extends AvailableRouterMethod<ReqT>,
|
|
> = Omit<UseFetchOptions<_ResT, DataT, PickKeys, DefaultT, ReqT, Method>, 'transform'>
|
|
|
|
/**
|
|
* 带项目默认选项的 `useFetch`,并在类型上将 `data` 视为接口 `{ code, data, message }` 中的内层 `data`。
|
|
*
|
|
* 说明:Nuxt的 `createUseFetch` 在类型上不会把工厂里的 `transform` 的出参当作 `AsyncData['data']`,
|
|
* 因此这里用薄包装修正 `DataT`(见 `UnwrapApiResponse`)。
|
|
*/
|
|
export function useHttpFetch<
|
|
ResT = void,
|
|
ErrorT = FetchError,
|
|
ReqT extends NitroFetchRequest = NitroFetchRequest,
|
|
Method extends AvailableRouterMethod<ReqT> = ResT extends void
|
|
? DefaultMethod<ReqT>
|
|
: AvailableRouterMethod<ReqT>,
|
|
_ResT = ResT extends void ? TypedInternalResponse<ReqT, unknown, Lowercase<Method>> : ResT,
|
|
DataT = UnwrapApiResponse<_ResT>,
|
|
PickKeys extends KeysOf<DataT> = KeysOf<DataT>,
|
|
DefaultT = undefined,
|
|
>(
|
|
url: ReqT | Ref<ReqT, ReqT> | (() => ReqT),
|
|
opts?: HttpFetchOptions<_ResT, DataT, PickKeys, DefaultT, ReqT, Method>,
|
|
): AsyncData<DefaultT | PickFrom<DataT, PickKeys>, ErrorT | undefined> {
|
|
return _useHttpFetch(url, opts) as AsyncData<DefaultT | PickFrom<DataT, PickKeys>, ErrorT | undefined>
|
|
}
|
|
|
|
export function useLazyHttpFetch<
|
|
ResT = void,
|
|
ErrorT = FetchError,
|
|
ReqT extends NitroFetchRequest = NitroFetchRequest,
|
|
Method extends AvailableRouterMethod<ReqT> = ResT extends void
|
|
? DefaultMethod<ReqT>
|
|
: AvailableRouterMethod<ReqT>,
|
|
_ResT = ResT extends void ? TypedInternalResponse<ReqT, unknown, Lowercase<Method>> : ResT,
|
|
DataT = UnwrapApiResponse<_ResT>,
|
|
PickKeys extends KeysOf<DataT> = KeysOf<DataT>,
|
|
DefaultT = undefined,
|
|
>(
|
|
url: ReqT | Ref<ReqT, ReqT> | (() => ReqT),
|
|
opts?: HttpFetchOptions<_ResT, DataT, PickKeys, DefaultT, ReqT, Method>,
|
|
): AsyncData<DefaultT | PickFrom<DataT, PickKeys>, ErrorT | undefined> {
|
|
return _useLazyHttpFetch(url, opts) as AsyncData<
|
|
DefaultT | PickFrom<DataT, PickKeys>,
|
|
ErrorT | undefined
|
|
>
|
|
}
|
|
|