73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
"use client";
|
||
|
||
import React, { useState } from "react";
|
||
import { ThemeProvider } from "next-themes";
|
||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||
import { Toaster } from "sonner";
|
||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// QueryClient – created once per client session
|
||
// ---------------------------------------------------------------------------
|
||
function makeQueryClient() {
|
||
return new QueryClient({
|
||
defaultOptions: {
|
||
queries: {
|
||
// Don't refetch on window focus in development
|
||
refetchOnWindowFocus: process.env.NODE_ENV === "production",
|
||
// 30 second stale time by default
|
||
staleTime: 30_000,
|
||
// Retry failed queries up to 2 times
|
||
retry: 2,
|
||
retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 30_000),
|
||
},
|
||
mutations: {
|
||
// Don't retry mutations by default
|
||
retry: 0,
|
||
},
|
||
},
|
||
});
|
||
}
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// Providers
|
||
// ---------------------------------------------------------------------------
|
||
interface ProvidersProps {
|
||
children: React.ReactNode;
|
||
}
|
||
|
||
export function Providers({ children }: ProvidersProps) {
|
||
// useState ensures the QueryClient is only created once per component mount
|
||
// and is not shared between different users on SSR.
|
||
const [queryClient] = useState(() => makeQueryClient());
|
||
|
||
return (
|
||
<ThemeProvider
|
||
attribute="class"
|
||
defaultTheme="dark"
|
||
enableSystem
|
||
disableTransitionOnChange
|
||
>
|
||
<QueryClientProvider client={queryClient}>
|
||
<TooltipProvider delay={400}>
|
||
{children}
|
||
<Toaster
|
||
position="bottom-right"
|
||
theme="dark"
|
||
richColors
|
||
closeButton
|
||
toastOptions={{
|
||
style: {
|
||
background: "oklch(0.205 0 0)",
|
||
border: "1px solid oklch(1 0 0 / 10%)",
|
||
color: "oklch(0.985 0 0)",
|
||
},
|
||
className: "cubeadmin-toast",
|
||
}}
|
||
/>
|
||
</TooltipProvider>
|
||
</QueryClientProvider>
|
||
</ThemeProvider>
|
||
);
|
||
}
|