import React, { useState, useEffect, useCallback } from 'react' import { useLocation } from 'react-router-dom' import Header from './Header' import Sidebar from './Sidebar' import ScrollToTop from './ScrollToTop' import KeyboardShortcutPanel from './KeyboardShortcutPanel' import { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts' import { AnnounceProvider, useAnnounceContext } from '../contexts/AnnounceContext' import { useIdleTimer } from '../hooks/useIdleTimer' import { useTranslation } from '../i18n' interface LayoutProps { children: React.ReactNode } /** * 内部布局组件 - 在 AnnounceProvider 内部使用 context 和 hooks */ function LayoutInner({ children }: LayoutProps) { const [sidebarOpen, setSidebarOpen] = useState(false) const [shortcutPanelOpen, setShortcutPanelOpen] = useState(false) const location = useLocation() const { politeRef, assertiveRef } = useAnnounceContext() const { t } = useTranslation() // 注册全局键盘快捷键 useKeyboardShortcuts() // 空闲检测:15 分钟无操作后提示 useIdleTimer({ timeout: 15 * 60 * 1000, onIdle: () => { console.warn('[Layout] 用户长时间未操作') // 可通过向用户展示提示或触发自动锁定 }, enabled: true, }) // 监听快捷键面板触发事件 useEffect(() => { const handleShortcutPanel = (e: Event) => { e.preventDefault() setShortcutPanelOpen((prev) => !prev) } window.addEventListener('vetcopilot:shortcutPanel', handleShortcutPanel) return () => window.removeEventListener('vetcopilot:shortcutPanel', handleShortcutPanel) }, []) const toggleSidebar = () => setSidebarOpen(prev => !prev) const closeSidebar = () => setSidebarOpen(false) // 路由切换时关闭移动端侧边栏 useEffect(() => { setSidebarOpen(false) }, [location.pathname]) return (
{/* 屏幕阅读器通知区域 */}