({ isSidebarOpen, setIsSidebarOpen })
| 6 | import { FolderOpenIcon, LayoutDashboardIcon, SettingsIcon, UsersIcon } from 'lucide-react' |
| 7 | |
| 8 | const Sidebar = ({ isSidebarOpen, setIsSidebarOpen }) => { |
| 9 | |
| 10 | const menuItems = [ |
| 11 | { name: 'Dashboard', href: '/', icon: LayoutDashboardIcon }, |
| 12 | { name: 'Projects', href: '/projects', icon: FolderOpenIcon }, |
| 13 | { name: 'Team', href: '/team', icon: UsersIcon }, |
| 14 | ] |
| 15 | |
| 16 | const sidebarRef = useRef(null); |
| 17 | |
| 18 | useEffect(() => { |
| 19 | function handleClickOutside(event) { |
| 20 | if (sidebarRef.current && !sidebarRef.current.contains(event.target)) { |
| 21 | setIsSidebarOpen(false); |
| 22 | } |
| 23 | } |
| 24 | document.addEventListener("mousedown", handleClickOutside); |
| 25 | return () => document.removeEventListener("mousedown", handleClickOutside); |
| 26 | }, [setIsSidebarOpen]); |
| 27 | |
| 28 | return ( |
| 29 | <div ref={sidebarRef} className={`z-10 bg-white dark:bg-zinc-900 min-w-68 flex flex-col h-screen border-r border-gray-200 dark:border-zinc-800 max-sm:absolute transition-all ${isSidebarOpen ? 'left-0' : '-left-full'} `} > |
| 30 | <WorkspaceDropdown /> |
| 31 | <hr className='border-gray-200 dark:border-zinc-800' /> |
| 32 | <div className='flex-1 overflow-y-scroll no-scrollbar flex flex-col'> |
| 33 | <div> |
| 34 | <div className='p-4'> |
| 35 | {menuItems.map((item) => ( |
| 36 | <NavLink to={item.href} key={item.name} className={({ isActive }) => `flex items-center gap-3 py-2 px-4 text-gray-800 dark:text-zinc-100 cursor-pointer rounded transition-all ${isActive ? 'bg-gray-100 dark:bg-zinc-900 dark:bg-gradient-to-br dark:from-zinc-800 dark:to-zinc-800/50 dark:ring-zinc-800' : 'hover:bg-gray-50 dark:hover:bg-zinc-800/60'}`} > |
| 37 | <item.icon size={16} /> |
| 38 | <p className='text-sm truncate'>{item.name}</p> |
| 39 | </NavLink> |
| 40 | ))} |
| 41 | <button className='flex w-full items-center gap-3 py-2 px-4 text-gray-800 dark:text-zinc-100 cursor-pointer rounded hover:bg-gray-50 dark:hover:bg-zinc-800/60 transition-all'> |
| 42 | <SettingsIcon size={16} /> |
| 43 | <p className='text-sm truncate'>Settings</p> |
| 44 | </button> |
| 45 | </div> |
| 46 | <MyTasksSidebar /> |
| 47 | <ProjectSidebar /> |
| 48 | </div> |
| 49 | |
| 50 | |
| 51 | </div> |
| 52 | |
| 53 | </div> |
| 54 | ) |
| 55 | } |
| 56 | |
| 57 | export default Sidebar |
nothing calls this directly
no outgoing calls
no test coverage detected