import { useEffect, useMemo, useState } from 'react'; import { NavLink, Outlet, useLocation } from 'react-router-dom'; import { useProjectsQuery } from '../query/projects'; const navItems: Array<{ label: string; to: string; end?: boolean }> = [ { label: 'Projects', to: '/projects' } ]; function AppLayout() { const location = useLocation(); const { data, isLoading, isError } = useProjectsQuery(); const recentProjects = useMemo( () => [...(data?.data ?? [])] .sort( (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime() ) .slice(0, 3), [data?.data] ); const isInitialDesktop = typeof window !== 'undefined' ? window.matchMedia('(min-width: 768px)').matches : false; const [isDesktop, setIsDesktop] = useState(isInitialDesktop); const [isNavOpen, setIsNavOpen] = useState(isInitialDesktop); useEffect(() => { if (typeof window === 'undefined') { return; } const media = window.matchMedia('(min-width: 768px)'); const handleChange = (event: MediaQueryListEvent) => { setIsDesktop(event.matches); setIsNavOpen(event.matches); }; setIsDesktop(media.matches); setIsNavOpen(media.matches); media.addEventListener('change', handleChange); return () => media.removeEventListener('change', handleChange); }, []); useEffect(() => { if (!isDesktop) { setIsNavOpen(false); } }, [location.pathname, isDesktop]); const handleToggleNav = () => { setIsNavOpen((current) => !current); }; const handleNavLinkClick = () => { if (!isDesktop) { setIsNavOpen(false); } }; const asideClassName = isDesktop ? [ 'relative z-30 flex flex-shrink-0 flex-col border-r border-slate-200 bg-white shadow-sm transition-all duration-200 ease-out', isNavOpen ? 'w-64' : 'w-0 border-transparent shadow-none overflow-hidden' ].join(' ') : [ 'fixed inset-y-0 left-0 z-30 flex w-64 transform flex-col border-r border-slate-200 bg-white shadow-sm transition-transform duration-200 ease-out', isNavOpen ? 'translate-x-0' : '-translate-x-full' ].join(' '); const asideInnerClassName = [ 'flex flex-1 flex-col', isDesktop ? isNavOpen ? 'px-6 py-8' : 'px-0 py-0 opacity-0 pointer-events-none' : 'px-6 py-8' ].join(' '); return (