import { createClient, createConfig } from "../client"; import type { ClientOptions as ClientOptions2 } from '../types.gen'; import type { Client, RequestOptions, RequestResult } from "../client"; import { refreshTokens } from "../../auth"; import type { ResponseStyle } from "../client"; let refreshPromise: Promise | null = null; async function getRefreshed(): Promise { if (!refreshPromise) { refreshPromise = (async () => { try { const res = await refreshTokens(); // consider refresh successful if res.data exists return !!res.data; } catch (err) { return false; // failed to refresh } })(); } return refreshPromise; } const baseClient = createClient(createConfig({ baseUrl: '/api/v1' })); export const authClient: Client = { ...baseClient, request: function < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields', >( options: Omit, 'method'> & Pick>, 'method'> ): RequestResult { // Wrap logic inside a Promise to satisfy RequestResult type return baseClient.request(options).catch(async (err: any) => { if (err?.status === 401) { const refreshed = await getRefreshed(); if (!refreshed) { localStorage.clear(); window.location.href = "/login"; throw err; } // Retry original request return baseClient.request(options); } throw err; }) as RequestResult; }, };