fix: AuthClient

This commit is contained in:
nihonium 2025-12-20 03:10:03 +03:00
parent 63b3435117
commit ca68f8bdf5
Signed by: nihonium
GPG key ID: 0251623741027CFC

View file

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