Files
metabuilder/hooks/useResponsiveSidebar.ts
2026-03-09 22:30:41 +00:00

60 lines
1.6 KiB
TypeScript

/**
* useResponsiveSidebar Hook
* Manages responsive sidebar behavior and mobile detection
*/
import { useState, useEffect, useCallback, useRef } from 'react';
export interface UseResponsiveSidebarReturn {
isMobile: boolean;
isCollapsed: boolean;
setIsCollapsed: (collapsed: boolean) => void;
toggleCollapsed: () => void;
}
/**
* Custom hook for responsive sidebar logic
* Detects mobile screen size and auto-closes sidebar on resize transition to mobile
*/
export const useResponsiveSidebar = (
sidebarOpen: boolean,
onSidebarChange: (open: boolean) => void
): UseResponsiveSidebarReturn => {
const [isMobile, setIsMobile] = useState(false);
const [isCollapsed, setIsCollapsed] = useState(false);
const wasMobileRef = useRef(false);
const onSidebarChangeRef = useRef(onSidebarChange);
onSidebarChangeRef.current = onSidebarChange;
const toggleCollapsed = useCallback(() => {
setIsCollapsed((prev) => !prev);
}, []);
// Handle window resize — only auto-close when transitioning to mobile
useEffect(() => {
const handleResize = () => {
const mobile = window.innerWidth < 768;
const wasDesktop = !wasMobileRef.current;
wasMobileRef.current = mobile;
setIsMobile(mobile);
// Auto-close sidebar only when crossing the desktop → mobile boundary
if (mobile && wasDesktop) {
onSidebarChangeRef.current(false);
}
};
window.addEventListener('resize', handleResize);
handleResize(); // Call on mount
return () => window.removeEventListener('resize', handleResize);
}, []);
return {
isMobile,
isCollapsed,
setIsCollapsed,
toggleCollapsed
};
};