"use client"; import { usePathname } from "next/navigation"; import { Suspense, useEffect, useState } from "react"; import { SWRConfig } from "swr"; import { ChatbotContainer } from "@/components/chatbot/chatbot-container"; import { ChatbotProvider, useChatbot, } from "@/components/chatbot/chatbot-context"; import { DashLeftRail } from "@/components/layout/dash-left-rail"; import { DashTopBar } from "@/components/layout/dash-top-bar"; import { Spine } from "@/components/layout/spine"; import { StatusBar } from "@/components/layout/status-bar"; import { MiniPlayer } from "@/components/media/mini-player"; import { RouteTransition } from "@/components/motion/route-transition"; import { MediaPlayerProvider } from "@/lib/hooks/use-media-player"; import { useWebSocket, WsProvider } from "@/lib/ws/context"; function ChatbotGuildSync({ guildId }: { guildId: string }) { const { setGuildId } = useChatbot(); useEffect(() => { setGuildId(guildId); }, [guildId, setGuildId]); return null; } function ChatbotExpressionSync() { const ws = useWebSocket(); const { setExpression } = useChatbot(); useEffect(() => { const unsub1 = ws.on("message_created", (data: any) => { if (data.ai_status === "flagged" || data.ai_status === "warn") { setExpression("surprise"); setTimeout(() => setExpression("idle"), 2000); } }); const unsub2 = ws.on("voice_active_user", () => setExpression("listening")); return () => { unsub1(); unsub2(); }; }, [ws, setExpression]); return null; } /** * New Event Horizon shell — used only on /dashboard. * * No `Spine`, no `StatusBar`, no padded `
`, no 1440px max-width. * Full-bleed single-screen layout. Other dashboard routes keep the * classic shell so the rest of the app is untouched. */ function ConsoleShell({ children }: { children: React.ReactNode }) { return (
{children}
); } /** * Classic shell — used on every other route under /(dashboard). */ function ClassicShell({ children, guildId, setGuildId, }: { children: React.ReactNode; guildId: string; setGuildId: (g: string) => void; }) { return (
setGuildId(g)} />
} > {children}
); } export default function DashboardLayout({ children, }: { children: React.ReactNode; }) { const [guildId, setGuildId] = useState(""); const pathname = usePathname(); // Match exact /dashboard or /dashboard/ but not /dashboard/ const isConsole = pathname === "/dashboard" || pathname === "/dashboard/"; return ( (err as { statusCode?: number })?.statusCode !== 404, }} > {isConsole ? ( {children} ) : ( {children} )} ); }