Files
metabuilder/hooks/useResponsiveSidebar.ts
johndoe6345789 78a54228df feat(hooks): Create centralized hooks npm package
- Added @metabuilder/hooks workspace package at root
- Consolidated 30 React hooks from across codebase into single module
- Implemented conditional exports for tree-shaking support
- Added comprehensive package.json with build/lint/typecheck scripts
- Created README.md documenting hook categories and usage patterns
- Updated root package.json workspaces array to include hooks
- Supports multi-version peer dependencies (React 18/19, Redux 8/9)

Usage:
  import { useDashboardLogic } from '@metabuilder/hooks'
  import { useLoginLogic } from '@metabuilder/hooks/useLoginLogic'

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-23 19:17:17 +00:00

55 lines
1.3 KiB
TypeScript

/**
* useResponsiveSidebar Hook
* Manages responsive sidebar behavior and mobile detection
*/
import { useState, useEffect, useCallback } 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 mobile
*/
export const useResponsiveSidebar = (
sidebarOpen: boolean,
onSidebarChange: (open: boolean) => void
): UseResponsiveSidebarReturn => {
const [isMobile, setIsMobile] = useState(false);
const [isCollapsed, setIsCollapsed] = useState(false);
const toggleCollapsed = useCallback(() => {
setIsCollapsed((prev) => !prev);
}, []);
// Handle window resize
useEffect(() => {
const handleResize = () => {
const mobile = window.innerWidth < 768;
setIsMobile(mobile);
// Auto-close sidebar on mobile if it's open
if (mobile && sidebarOpen) {
onSidebarChange(false);
}
};
window.addEventListener('resize', handleResize);
handleResize(); // Call on mount
return () => window.removeEventListener('resize', handleResize);
}, [sidebarOpen, onSidebarChange]);
return {
isMobile,
isCollapsed,
setIsCollapsed,
toggleCollapsed
};
};