mc-dashboard/app/providers.tsx

56 lines
1.6 KiB
TypeScript
Raw Normal View History

"use client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { SessionProvider } from "next-auth/react";
import { Toaster } from "sonner";
import { useEffect, useState } from "react";
2026-04-13 05:30:23 -06:00
import { CommandPalette } from "@/components/CommandPalette";
import { PlayerDrawer } from "@/components/PlayerDrawer";
import { EventsBridge } from "@/components/EventsBridge";
import { OfflineBanner } from "@/components/OfflineBanner";
import { ServiceWorkerRegister } from "@/components/ServiceWorkerRegister";
export function Providers({ children }: { children: React.ReactNode }) {
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
},
},
})
);
const [theme, setTheme] = useState<"light" | "dark">("dark");
useEffect(() => {
const sync = () => {
setTheme(document.documentElement.classList.contains("dark") ? "dark" : "light");
};
sync();
const obs = new MutationObserver(sync);
obs.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] });
return () => obs.disconnect();
}, []);
return (
<SessionProvider>
<QueryClientProvider client={queryClient}>
<EventsBridge />
<ServiceWorkerRegister />
<OfflineBanner />
{children}
2026-04-13 05:30:23 -06:00
<CommandPalette />
<PlayerDrawer />
<Toaster
theme={theme}
position="bottom-right"
richColors
closeButton
toastOptions={{ duration: 4000 }}
/>
</QueryClientProvider>
</SessionProvider>
);
}