"use client"; import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from "react"; import { usePathname } from "next/navigation"; interface SidebarContextType { isCollapsed: boolean; isMobileOpen: boolean; toggleCollapse: () => void; openMobile: () => void; closeMobile: () => void; isMobile: boolean; } const SidebarContext = createContext(undefined); export function SidebarProvider({ children }: { children: ReactNode }) { const [isCollapsed, setIsCollapsed] = useState(false); const [isMobileOpen, setIsMobileOpen] = useState(false); const [isMobile, setIsMobile] = useState(false); const pathname = usePathname(); useEffect(() => { const mq = window.matchMedia("(max-width: 1023px)"); const handler = (e: MediaQueryListEvent | MediaQueryList) => { setIsMobile(e.matches); if (!e.matches) setIsMobileOpen(false); }; handler(mq); mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); }, []); // Auto-close mobile drawer on route change useEffect(() => { setIsMobileOpen(false); }, [pathname]); const toggleCollapse = useCallback(() => setIsCollapsed((v) => !v), []); const openMobile = useCallback(() => setIsMobileOpen(true), []); const closeMobile = useCallback(() => setIsMobileOpen(false), []); return ( {children} ); } export function useSidebar() { const ctx = useContext(SidebarContext); if (!ctx) throw new Error("useSidebar must be used within SidebarProvider"); return ctx; }