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 baseUrl = import.meta.env.VITE_PUBLIC_BACKEND if (!baseUrl) throw new Error("BACKEND URL not set") const { sessionToken, refreshSessionToken } = useAuth() const defaults: UseFetchOptions = { baseURL: baseUrl, 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 options.headers = { ...(options.headers as unknown as Record), // @ts-ignore Authorization: `Bearer ${newToken}`, } } }, } const config: UseFetchOptions = defu(options ?? {}, defaults) // @ts-ignore return useFetch(url, config) }