import type { UseFetchOptions } from "#app" import defu from "defu" export function useApiFetch( url: string | Request | Ref | (() => string | Request), options: UseFetchOptions = {}, authorize: boolean = true ) { 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, headers: authorize && sessionToken.value ? { Authorization: `Bearer ${sessionToken.value}` } : {}, onResponseError: async ({ response, options }) => { if (response.status == 401 && authorize) { const newToken = await refreshSessionToken() if (!newToken) return const newOptions = { ...options, headers: { ...(options.headers || {}), Authorization: `Bearer ${newToken}`, }, } // @ts-ignore return await $fetch(url, newOptions) } }, } const config = defu(options || {}, defaults) as UseFetchOptions< DataT, ErrorT > // @ts-ignore return useFetch(url, config) }