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 { refreshSession } = useAuth() const defaults: UseFetchOptions = { // The migrated API lives in this Nuxt app under server/api. baseURL: "/api", retry: 1, retryDelay: 0, retryStatusCodes: [401], headers: {}, onResponseError: async ({ request, response, options }) => { if (response.status == 401 && authorize) { const refreshed = await refreshSession() if (!refreshed.ok) return if (import.meta.server && refreshed.sessionCookie) { const headers = new Headers(options.headers as HeadersInit) const cookies = (headers.get("cookie") ?? "") .split(";") .map((cookie) => cookie.trim()) .filter((cookie) => cookie && !cookie.startsWith("musicSession=")) cookies.push(refreshed.sessionCookie) headers.set("cookie", cookies.join("; ")) options.headers = headers } } }, } const config: UseFetchOptions = defu(options ?? {}, defaults) // @ts-ignore return useFetch(url, config) }