Repository Public
1'use client';2import { useEffect, useState } from 'react';3import { QueryClient, QueryClientProvider } from '@tanstack/react-query';4import { TooltipProvider } from '@/components/ui/tooltip';5import { Toaster } from '@/components/ui/toast';6import { ApiRequestError } from '@/lib/api';7import { useConn } from '@/stores/conn';89export function Providers({ children }: { children: React.ReactNode }) {10 const [client] = useState(11 () =>12 new QueryClient({13 defaultOptions: {14 queries: {15 staleTime: 15_000,16 refetchOnWindowFocus: false,17 retry: (count, err) => !(err instanceof ApiRequestError && err.status >= 400 && err.status < 500) && count < 2,18 },19 },20 }),21 );22 useEffect(() => {23 const on = () => useConn.getState().set({ online: true });24 const off = () => useConn.getState().set({ online: false });25 window.addEventListener('online', on);26 window.addEventListener('offline', off);27 // The service worker caches the static shell only; it is registered in production builds.28 if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {29 navigator.serviceWorker.register('/sw.js').catch(() => undefined);30 }31 return () => {32 window.removeEventListener('online', on);33 window.removeEventListener('offline', off);34 };35 }, []);36 return (37 <QueryClientProvider client={client}>38 <TooltipProvider delayDuration={350} skipDelayDuration={200}>39 {children}40 <Toaster />41 </TooltipProvider>42 </QueryClientProvider>43 );44}45