Compare commits

..

No commits in common. "2bf268cbef0672eadd7fe2cbae4a87ae54b1b910" and "27acfab0cda4cdb50df388a63f6bc86142d730c8" have entirely different histories.

View file

@ -10,13 +10,15 @@ async function getRefreshed(): Promise<boolean> {
if (!refreshPromise) { if (!refreshPromise) {
refreshPromise = (async () => { refreshPromise = (async () => {
try { try {
const res = await refreshTokens({ throwOnError: true }); const res = await refreshTokens();
// consider refresh successful if res.data exists
return !!res.data; return !!res.data;
} catch { } catch (err) {
return false; return false; // failed to refresh
} }
})(); })();
} }
return refreshPromise; return refreshPromise;
} }
@ -25,33 +27,29 @@ const baseClient = createClient(createConfig<ClientOptions2>({ baseUrl: '/api/v1
export const authClient: Client = { export const authClient: Client = {
...baseClient, ...baseClient,
// Force the function to match the expected signature exactly request: function <
request: (async <
TData = unknown, TData = unknown,
TError = unknown, TError = unknown,
ThrowOnError extends boolean = false, ThrowOnError extends boolean = true,
TResponseStyle extends ResponseStyle = 'fields', TResponseStyle extends ResponseStyle = 'fields',
>( >(
options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'> & options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'> &
Pick<Required<RequestOptions<TData, TResponseStyle, ThrowOnError>>, 'method'> Pick<Required<RequestOptions<TData, TResponseStyle, ThrowOnError>>, 'method'>
): Promise<RequestResult<TData, TError, ThrowOnError, TResponseStyle>> => { ): RequestResult<TData, TError, ThrowOnError, TResponseStyle> {
// Initial request // Wrap logic inside a Promise to satisfy RequestResult type
let result = await baseClient.request<TData, TError, ThrowOnError, TResponseStyle>(options); return baseClient.request<TData, TError, ThrowOnError, TResponseStyle>(options).catch(async (err: any) => {
if (err?.status === 401) {
// Check for 401 const refreshed = await getRefreshed();
if ((result as any)?.error?.response?.status === 401) { if (!refreshed) {
const refreshed = await getRefreshed(); localStorage.clear();
window.location.href = "/login";
if (refreshed) { throw err;
// Retry }
result = await baseClient.request<TData, TError, ThrowOnError, TResponseStyle>(options); // Retry original request
} else { return baseClient.request<TData, TError, ThrowOnError, TResponseStyle>(options);
localStorage.clear();
window.location.href = "/login";
} }
} throw err;
}) as RequestResult<TData, TError, ThrowOnError, TResponseStyle>;
return result as RequestResult<TData, TError, ThrowOnError, TResponseStyle>; },
}) as Client['request'], // Cast the function itself to match the Client interface
}; };