"use client"; import { useState, useRef, useEffect } from "react"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { IconHome2, IconMoon, IconSun, IconChevronsLeft, IconChevronsRight, IconMenu2, IconX, IconCode, IconKey, IconLogout, } from "@tabler/icons-react"; import { useSetTheme } from "@/stores/useThemeStore"; const LINKS = [ { href: "/", label: "Dashboard", icon: IconHome2 }, { href: "/auth", label: "Auth", icon: IconKey }, ]; const COLLAPSED_W = 52; interface SideNavProps { online: boolean; devConsoleOpen: boolean; onToggleDevConsole: () => void; } const SideNav = ({ online, devConsoleOpen, onToggleDevConsole }: SideNavProps) => { const pathname = usePathname(); const router = useRouter(); const setTheme = useSetTheme(); const [collapsed, setCollapsed] = useState(false); const [sidebarWidth, setSidebarWidth] = useState(168); const [menuOpen, setMenuOpen] = useState(false); const [auth, setAuth] = useState(false); const isDragging = useRef(false); const wrapperRef = useRef(null); useEffect(() => { setMenuOpen(false); }, [pathname]); useEffect(() => { fetch("/api/auth/check") .then((r) => setAuth(r.ok)) .catch(() => setAuth(false)); }, []); useEffect(() => { const onMove = (e: MouseEvent) => { if (!isDragging.current || !wrapperRef.current) return; const left = wrapperRef.current.getBoundingClientRect().left; setSidebarWidth(Math.max(120, Math.min(320, e.clientX - left))); }; const onUp = () => { isDragging.current = false; }; window.addEventListener("mousemove", onMove); window.addEventListener("mouseup", onUp); return () => { window.removeEventListener("mousemove", onMove); window.removeEventListener("mouseup", onUp); }; }, []); async function handleLogout() { await fetch("/api/auth/logout", { method: "POST" }); router.push("/auth"); } return ( <> {/* Desktop sidebar + drag handle */}
{/* Logo */}
logo
{/* Nav links */} {/* Online status */}
{!collapsed && (online ? "Online" : "Connecting...")}
{/* Dev console toggle */}
{/* Logout */} {auth && (
)} {/* Theme toggle */}
{/* Divider + collapse toggle */}
{/* Drag handle */} {!collapsed && (
{ isDragging.current = true; e.preventDefault(); }} className="w-[10px] shrink-0 flex items-center justify-center cursor-col-resize group" >
)}
{/* Mobile header */}
setMenuOpen(false)}> logo
{/* Mobile dropdown menu */} {menuOpen && (
{auth && ( )}
)} ); }; export default SideNav;