import type { UseFetchOptions } from '#app'
import type { NitroFetchRequest } from 'nitropack'
export function useRequest<
T,
R extends NitroFetchRequest = NitroFetchRequest
>(
request: R,
options: UseFetchOptions<T, R> = {}
) {
const config = useRuntimeConfig()
const token = useCookie<string | null>('token')
const method = String(
options.method ?? 'GET'
).toUpperCase()
const isMutation = ![
'GET',
'HEAD'
].includes(method)
const customFetch = $fetch.create({
baseURL: config.public.apiBase,
timeout: 10_000,
onRequest({ options }) {
const headers = new Headers(options.headers)
if (token.value) {
headers.set(
'Authorization',
`Bearer ${token.value}`
)
}
headers.set('X-Client', 'web')
options.headers = headers
},
onResponse({ request, response }) {
if (import.meta.dev) {
console.debug(
'[Request]',
request,
response.status
)
}
},
onResponseError({ request, response }) {
console.error(
'[Request Error]',
{
request,
status: response.status,
data: response._data
}
)
if (response.status === 401) {
}
if (response.status >= 500) {
}
}
})
return useFetch<T, R>(request, {
server: !isMutation,
immediate: !isMutation,
lazy: false,
dedupe: 'cancel',
...options,
$fetch: customFetch
})
}