"use client"; import { useEffect, useState, createContext, useContext, type ReactNode } from "react"; import { useRouter, usePathname } from "next/navigation"; import { Menu, PanelLeft } from "lucide-react"; import { Sidebar } from "./sidebar"; import { CommandPalette } from "./command-palette"; import { usePrefs, setPrefs, applyTheme } from "@/lib/client/prefs"; import { resetDraft } from "@/lib/client/use-chat"; import { cn } from "./ui"; import { Logo } from "./logo"; const ShellCtx = createContext<{ openPalette: () => void; openDrawer: () => void }>({ openPalette: () => {}, openDrawer: () => {} }); export const useShell = () => useContext(ShellCtx); export function AppShell({ children }: { children: ReactNode }) { const prefs = usePrefs(); const router = useRouter(); const pathname = usePathname(); const [drawer, setDrawer] = useState(false); const [palette, setPalette] = useState(false); useEffect(() => { applyTheme(prefs.theme); }, [prefs.theme]); useEffect(() => { document.documentElement.dataset.fontsize = prefs.fontSize; }, [prefs.fontSize]); useEffect(() => { setDrawer(false); }, [pathname]); useEffect(() => { if ("serviceWorker" in navigator && process.env.NODE_ENV === "production") navigator.serviceWorker.register("/sw.js").catch(() => {}); }, []); useEffect(() => { const onKey = (e: KeyboardEvent) => { const mod = e.metaKey || e.ctrlKey; if (mod && e.key.toLowerCase() === "k") { e.preventDefault(); setPalette(p => !p); } else if (mod && e.shiftKey && e.key.toLowerCase() === "o") { e.preventDefault(); resetDraft(); router.push("/"); } else if (mod && e.key === "\\") { e.preventDefault(); setPrefs({ sidebarCollapsed: !prefs.sidebarCollapsed }); } }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [prefs.sidebarCollapsed, router]); const collapsed = prefs.sidebarCollapsed; return ( setPalette(true), openDrawer: () => setDrawer(true) }}>
{/* desktop sidebar */} {/* mobile drawer */} {drawer &&
setDrawer(false)}>
}
{/* top bar (mobile + collapsed) */}
Chat SPBoucher AI
{children}
setPalette(false)} /> ); }