import { Link, Outlet } from 'react-router-dom' import { AnimatePresence, motion } from 'framer-motion' import { Menu, MessageSquareText, Search, Sparkles } from 'lucide-react' import clsx from 'clsx' import type { PlayProfile, User } from '../types' import { AppFooter } from './AppFooter' import { LayoutSearchBox } from './LayoutSearchBox' import { LayoutSidebarContent, type LayoutSidebarContentProps } from './LayoutSidebarContent' import { LayoutThemeToggle } from './LayoutThemeToggle' import { LayoutUserMenu } from './LayoutUserMenu' import type { ThemeMode } from './useThemeMode' import type { useLayoutSearch } from './useLayoutSearch' import type { useLayoutProfiles } from './useLayoutProfiles' import type { useLayoutSidebar } from './useLayoutSidebar' import type { useThemeMode } from './useThemeMode' type LayoutSearchState = ReturnType type LayoutProfileState = ReturnType type LayoutSidebarState = ReturnType type LayoutThemeState = ReturnType type LayoutPermissionState = { can: (key: string) => boolean isAdmin: boolean } type LayoutSidebarProps = { children: React.ReactNode isSidebarOpen: boolean } type LayoutMobileSidebarProps = { children: React.ReactNode isOpen: boolean onClose: () => void } type LayoutHeaderProps = { search: LayoutSearchState permissions: LayoutPermissionState theme: LayoutThemeState onOpenMobileDrawer: () => void user: User | null | undefined activeProfileId: string | null profile: LayoutProfileState onLogout: () => void } type LayoutSidebarsProps = Omit< LayoutSidebarContentProps, 'isSidebarOpen' | 'isMobileDrawerOpen' | 'openGroups' | 'isRouteIn' | 'onToggleGroup' | 'onToggleSidebar' | 'onCloseMobileDrawer' > & { sidebar: LayoutSidebarState } type LayoutWorkspaceProps = { routeKey: string } export function LayoutDesktopSidebar({ children, isSidebarOpen }: LayoutSidebarProps) { return ( ) } export function LayoutMobileSidebar({ children, isOpen, onClose }: LayoutMobileSidebarProps) { return ( {isOpen && (
{children}
)}
) } export function LayoutSidebars({ sidebar, isAdmin, username, can, onLogout, }: LayoutSidebarsProps) { const content = ( sidebar.setIsSidebarOpen((current) => !current)} onCloseMobileDrawer={() => sidebar.setIsMobileDrawerOpen(false)} onLogout={onLogout} /> ) return ( <> {content} sidebar.setIsMobileDrawerOpen(false)} > {content} ) } export function LayoutHeader({ search, permissions, theme, onOpenMobileDrawer, user, activeProfileId, profile, onLogout, }: LayoutHeaderProps) { return (
profile.setIsProfileOpen((open) => !open)} onCloseProfile={() => profile.setIsProfileOpen(false)} onUseDefaultProfile={profile.useDefaultProfile} onSwitchProfile={profile.switchProfile} onLogout={onLogout} />
) } export function LayoutWorkspace({ routeKey }: LayoutWorkspaceProps) { return (
) } export function LayoutFrameFooter() { return ( ) } export { LayoutSidebarContent } function LayoutHeaderSearch({ search, onOpenMobileDrawer, }: { search: LayoutSearchState onOpenMobileDrawer: () => void }) { return (
) } type LayoutHeaderActionsProps = { permissions: LayoutPermissionState themeMode: ThemeMode onThemeChange: (mode: ThemeMode) => void user: User | null | undefined isProfileOpen: boolean profiles: PlayProfile[] activeProfileId: string | null activeProfile: PlayProfile | null onToggleProfile: () => void onCloseProfile: () => void onUseDefaultProfile: () => void onSwitchProfile: (profile: PlayProfile) => void onLogout: () => void } function LayoutHeaderActions({ permissions, themeMode, onThemeChange, user, isProfileOpen, profiles, activeProfileId, activeProfile, onToggleProfile, onCloseProfile, onUseDefaultProfile, onSwitchProfile, onLogout, }: LayoutHeaderActionsProps) { return (
) } function LayoutQuickActions({ permissions }: { permissions: LayoutPermissionState }) { return ( <> {permissions.can('can_view_discover') && ( 发现新片 )} {permissions.isAdmin && ( )} ) } function LayoutProfileMenu({ user, isProfileOpen, profiles, activeProfileId, activeProfile, onToggleProfile, onCloseProfile, onUseDefaultProfile, onSwitchProfile, onLogout, }: Omit) { return ( ) }