import type { UseFetchOptions } from "#app" import defu from "defu" export function useApiFetch( url: string | Request | Ref | (() => string | Request), options?: UseFetchOptions, authorize: boolean = true, ): ReturnType> { const { sessionToken, refreshSessionToken } = useAuth() const defaults: UseFetchOptions = { // The migrated API lives in this Nuxt app under server/api. baseURL: "/api", retry: 1, retryDelay: 0, retryStatusCodes: [401], headers: authorize && sessionToken.value ? { Authorization: `Bearer ${sessionToken.value}` } : {}, onResponseError: async ({ request, response, options }) => { if (response.status == 401 && authorize) { const newToken = await refreshSessionToken() if (!newToken) return const headers = new Headers(options.headers as HeadersInit) headers.set("Authorization", `Bearer ${newToken}`) options.headers = headers } }, } const config: UseFetchOptions = defu(options ?? {}, defaults) // @ts-ignore return useFetch(url, config) }