'use client'; import * as Dialog from '@radix-ui/react-dialog'; import Link from 'next/link'; import { useEffect, useRef, useState } from 'react'; import { ClassicCollapsedSidebar } from '@/components/layout/ClassicCollapsedSidebar'; import { IconSidebarLayout } from '@/components/layout/IconSidebarLayout'; import { NavTooltip } from '@/components/layout/nav-tooltip'; import { SidebarNav } from '@/components/layout/SidebarNav'; import { TenantSwitcher } from '@/components/layout/TenantSwitcher'; import { UserMenu } from '@/components/layout/UserMenu'; import { useMenuNavigation } from '@/lib/hooks/use-menu-navigation'; import { useNavMenu } from '@/lib/hooks/use-nav-menu'; import { redirectToAuthorize } from '@/lib/oauth/browser'; import { useAuthStore } from '@/stores/auth-store'; import { useLayoutStore } from '@/stores/layout-store'; export function AppChrome({ children }: { children: React.ReactNode }) { const authed = useAuthStore((s) => Boolean(s.accessToken)); const sidebarMode = useLayoutStore((s) => s.sidebarMode); const classicNavRailCollapsed = useLayoutStore((s) => s.classicNavRailCollapsed); const toggleClassicNavRail = useLayoutStore((s) => s.toggleClassicNavRail); const { items: nav, loading: navLoading, error: navError } = useNavMenu(); const onMenuNavigate = useMenuNavigation(); const [mobileNavOpen, setMobileNavOpen] = useState(false); const [showClassicNarrowUi, setShowClassicNarrowUi] = useState(classicNavRailCollapsed); const classicAsideRef = useRef(null); useEffect(() => { const mq = window.matchMedia('(min-width: 768px)'); const onChange = () => { if (mq.matches) setMobileNavOpen(false); }; mq.addEventListener('change', onChange); return () => mq.removeEventListener('change', onChange); }, []); useEffect(() => { if (!classicNavRailCollapsed) setShowClassicNarrowUi(false); }, [classicNavRailCollapsed]); useEffect(() => { if (!classicNavRailCollapsed || showClassicNarrowUi) return; const el = classicAsideRef.current; const finish = () => { if (useLayoutStore.getState().classicNavRailCollapsed) setShowClassicNarrowUi(true); }; const onEnd = (e: TransitionEvent) => { if (e.propertyName === 'width') { finish(); el?.removeEventListener('transitionend', onEnd); } }; el?.addEventListener('transitionend', onEnd); const t = window.setTimeout(finish, 600); return () => { el?.removeEventListener('transitionend', onEnd); window.clearTimeout(t); }; }, [classicNavRailCollapsed, showClassicNarrowUi]); const classicAsideMotion = 'min-w-0 shrink-0 transition-[width] duration-500 ease-in-out motion-reduce:transition-none'; const asideClass = sidebarMode === 'icon' ? 'hidden min-h-0 shrink-0 overflow-hidden border-r border-neutral-200 bg-white md:flex md:flex-col' : `relative hidden h-full min-h-0 flex-col overflow-visible border-r border-neutral-200 bg-white md:flex ${classicAsideMotion}`; const classicAsideStyle = sidebarMode !== 'icon' ? { width: classicNavRailCollapsed ? '72px' : '14rem' } : undefined; const showExpandedClassicChrome = !classicNavRailCollapsed || !showClassicNarrowUi; const sidebarProps = { items: nav, loading: navLoading, error: navError, authed, onMenuNavigate, }; return (
Smart Admin {authed ? : null}
{authed ? ( ) : ( <> 账号登录 )}
{children}
导航菜单 浏览并选择页面,关闭按钮在右上角。
setMobileNavOpen(false)} />
); }