/** * Watch History Sidebar Component * 观看历史侧边栏组件 - Main layout and state management */ 'use client'; import { useState, useEffect, useRef } from 'react'; import { useHistory } from '@/lib/store/history-store'; import { Icons } from '@/components/ui/Icon'; import { ConfirmDialog } from '@/components/ui/ConfirmDialog'; import { HistoryHeader } from './HistoryHeader'; import { HistoryList } from './HistoryList'; import { HistoryFooter } from './HistoryFooter'; import { trapFocus } from '@/lib/accessibility/focus-management'; export function WatchHistorySidebar({ isPremium = false }: { isPremium?: boolean }) { const [isOpen, setIsOpen] = useState(false); const [deleteConfirm, setDeleteConfirm] = useState<{ isOpen: boolean; videoId?: string; source?: string; isClearAll?: boolean; }>({ isOpen: false }); const { viewingHistory, removeFromHistory, clearHistory } = useHistory(isPremium); const sidebarRef = useRef(null); const cleanupFocusTrapRef = useRef<(() => void) | null>(null); // Setup focus trap when sidebar opens useEffect(() => { if (isOpen && sidebarRef.current) { cleanupFocusTrapRef.current = trapFocus(sidebarRef.current); } return () => { if (cleanupFocusTrapRef.current) { cleanupFocusTrapRef.current(); cleanupFocusTrapRef.current = null; } }; }, [isOpen]); // Handle escape key to close sidebar useEffect(() => { const handleEscape = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { setIsOpen(false); } }; if (isOpen) { document.addEventListener('keydown', handleEscape); } return () => { document.removeEventListener('keydown', handleEscape); }; }, [isOpen]); // Handle delete confirmation const handleDeleteItem = (videoId: string | number, source: string) => { setDeleteConfirm({ isOpen: true, videoId: String(videoId), source }); }; const handleClearAll = () => { setDeleteConfirm({ isOpen: true, isClearAll: true }); }; const confirmDelete = () => { if (deleteConfirm.isClearAll) { clearHistory(); } else if (deleteConfirm.videoId && deleteConfirm.source) { removeFromHistory(deleteConfirm.videoId, deleteConfirm.source); } setDeleteConfirm({ isOpen: false }); }; const cancelDelete = () => { setDeleteConfirm({ isOpen: false }); }; return ( <> {/* Toggle Button */} {/* Backdrop */} {isOpen && (
setIsOpen(false)} /> )} {/* Sidebar */} {/* Confirm Dialog */} ); }