"use client"; import React, { useEffect, useState } from "react"; import { usePathname } from "next/navigation"; import dynamic from "next/dynamic"; import { ToastProvider } from "@/components/Toast"; import ErrorBoundary from "@/components/ErrorBoundary"; import { ConsentProvider } from "./ConsentProvider"; import { ThemeProvider } from "./ThemeProvider"; const BackgroundBlobs = dynamic( () => import("@/components/BackgroundBlobs").catch(() => ({ default: () => null })), { ssr: false, loading: () => null } ); export default function ClientProviders({ children, }: { children: React.ReactNode; }) { const [mounted, setMounted] = useState(false); const pathname = usePathname(); useEffect(() => { setMounted(true); }, [pathname]); return ( {children} ); } function GatedProviders({ children, mounted, }: { children: React.ReactNode; mounted: boolean; }) { // Defer animated background blobs until after LCP const [deferredReady, setDeferredReady] = useState(false); useEffect(() => { if (!mounted) return; let id: ReturnType | number; if (typeof requestIdleCallback !== "undefined") { id = requestIdleCallback(() => setDeferredReady(true), { timeout: 5000 }); return () => cancelIdleCallback(id as number); } else { id = setTimeout(() => setDeferredReady(true), 200); return () => clearTimeout(id); } }, [mounted]); return ( {deferredReady && }
{children}
); }