Description
The React application in src/main.tsx is wrapped with QueryClientProvider from TanStack Query, but the QueryClient is initialized with default configuration and no error handlers, retry logic, or cache strategies:
const queryClient = new QueryClient();
const container = document.getElementById("root");
const root = createRoot(container!);
root.render(
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<App />
</ThemeProvider>
</QueryClientProvider>,
);
This means:
-
No retry logic on network failures: If an API request fails, TanStack Query will not retry automatically. A transient network error (timeout, temporary unavailability) will immediately show an error to the user instead of retrying.
-
No error boundary: Failed API requests have no centralized error handler. Each component must manually handle errors, leading to inconsistent error UI and potential crashes.
-
Aggressive cache invalidation: With default settings, cached data is discarded immediately, causing excessive API calls when navigating between views.
-
No stale-while-revalidate pattern: The app doesn't leverage TanStack Query's ability to show stale data while fetching fresh data in the background.
-
Missing mutation defaults: Form submissions and other mutations have no centralized error or success handling.
Users will experience:
- Frequent errors on weak network connections
- Slow performance due to redundant API calls
- Inconsistent error handling across screens
- Poor offline UX
Steps to Reproduce
- Open CommDesk on a slow or unstable network (simulate with browser DevTools throttling)
- Perform an API call (login, load community data, etc.)
- While the request is in flight, introduce a network error (disable network)
- Observe that the request fails immediately and shows an error to the user
- Re-enable network; the app does NOT retry automatically
Expected result: TanStack Query automatically retries failed requests with exponential backoff.
Actual result: Failed request shows error immediately with no retry.
Expected Behavior
QueryClient should be configured with:
- Default retry strategy (3 retries with exponential backoff for 5xx errors)
- Cache stale time (5 minutes before data is considered stale)
- Garbage collection time (10 minutes before unused cache is deleted)
- Default error handler for all queries and mutations
- Stale-while-revalidate behavior
Root Cause
QueryClient was initialized with defaults without considering the Tauri desktop environment, which has network instability concerns and limited bandwidth.
Proposed Fix
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { createRoot } from "react-dom/client";
import { ThemeProvider } from "./theme/provider";
import App from "./App";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 5 * 60 * 1000, // 5 minutes
gcTime: 10 * 60 * 1000, // 10 minutes (cache time)
retry: (failureCount, error) => {
// Retry on network errors and 5xx, but not on 4xx client errors
if (failureCount > 3) return false;
if (error instanceof Error && error.message.includes("401")) return false;
if (error instanceof Error && error.message.includes("403")) return false;
return true;
},
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
},
mutations: {
retry: 1,
retryDelay: 1000,
},
},
});
const container = document.getElementById("root");
const root = createRoot(container!);
root.render(
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<App />
</ThemeProvider>
</QueryClientProvider>,
);
Additionally, implement a global query error boundary in App.tsx:
import { useQueryErrorResetBoundary } from "@tanstack/react-query";
import { ErrorBoundary } from "react-error-boundary";
function App() {
const { reset } = useQueryErrorResetBoundary();
return (
<ErrorBoundary onReset={reset} fallback={<ErrorFallback />}>
{/* App content */}
</ErrorBoundary>
);
}
Environment
- File:
src/main.tsx
- Severity: Medium (poor UX on network instability, excessive API calls)
Checklist
@NexGenStudioDev Could you please /assign this issue to me? I would like to configure TanStack Query with proper defaults and error handling under NSOC '26.
/assign
Description
The React application in
src/main.tsxis wrapped withQueryClientProviderfrom TanStack Query, but theQueryClientis initialized with default configuration and no error handlers, retry logic, or cache strategies:This means:
No retry logic on network failures: If an API request fails, TanStack Query will not retry automatically. A transient network error (timeout, temporary unavailability) will immediately show an error to the user instead of retrying.
No error boundary: Failed API requests have no centralized error handler. Each component must manually handle errors, leading to inconsistent error UI and potential crashes.
Aggressive cache invalidation: With default settings, cached data is discarded immediately, causing excessive API calls when navigating between views.
No stale-while-revalidate pattern: The app doesn't leverage TanStack Query's ability to show stale data while fetching fresh data in the background.
Missing mutation defaults: Form submissions and other mutations have no centralized error or success handling.
Users will experience:
Steps to Reproduce
Expected result: TanStack Query automatically retries failed requests with exponential backoff.
Actual result: Failed request shows error immediately with no retry.
Expected Behavior
QueryClient should be configured with:
Root Cause
QueryClient was initialized with defaults without considering the Tauri desktop environment, which has network instability concerns and limited bandwidth.
Proposed Fix
Additionally, implement a global query error boundary in App.tsx:
Environment
src/main.tsxChecklist
@NexGenStudioDev Could you please /assign this issue to me? I would like to configure TanStack Query with proper defaults and error handling under NSOC '26.
/assign