packages/sdk/src/context/app/queryClient.tsx
import { MutationCache, QueryCache, QueryClient } from '@tanstack/react-query';
import type { IHttpError } from '@teable/core';
import { toast } from '@teable/ui-lib';
import {
UsageLimitModalType,
useUsageLimitModalStore,
} from '../../components/billing/store/usage-limit-modal';
export const errorRequestHandler = (error: unknown) => {
const { code, message, status } = error as IHttpError;
// no authentication
if (status === 401) {
window.location.href = `/auth/login?redirect=${encodeURIComponent(window.location.href)}`;
return;
}
if (status === 402) {
useUsageLimitModalStore.setState({ modalType: UsageLimitModalType.Upgrade, modalOpen: true });
return;
}
if (status === 460) {
useUsageLimitModalStore.setState({ modalType: UsageLimitModalType.User, modalOpen: true });
return;
}
toast({
variant: 'destructive',
title: code || 'Unknown Error',
description: message,
});
};
export const createQueryClient = () => {
return new QueryClient({
defaultOptions: {
queries: {
// With SSR, we usually want to set some default staleTime
// above 0 to avoid refetching immediately on the client
staleTime: 10 * 1000,
retry: false,
networkMode: 'always',
},
mutations: {
networkMode: 'always',
},
},
queryCache: new QueryCache({
onError: errorRequestHandler,
}),
mutationCache: new MutationCache({
onError: errorRequestHandler,
}),
});
};