/** * FavoritesSidebar - Main favorites sidebar component * Positioned on the left side of the screen (opposite to WatchHistorySidebar) */ 'use client'; import { useState, useEffect, useRef } from 'react'; import { useFavorites } from '@/lib/store/favorites-store'; import { WatchHistorySidebar } from '@/components/history/WatchHistorySidebar'; import { Icons } from '@/components/ui/Icon'; import { ConfirmDialog } from '@/components/ui/ConfirmDialog'; import { FavoritesHeader } from './FavoritesHeader'; import { FavoritesList } from './FavoritesList'; import { FavoritesFooter } from './FavoritesFooter'; import { trapFocus } from '@/lib/accessibility/focus-management'; export function FavoritesSidebar({ isPremium = false }: { isPremium?: boolean }) { const [isOpen, setIsOpen] = useState(false); const [deleteConfirm, setDeleteConfirm] = useState<{ isOpen: boolean; videoId?: string; source?: string; isClearAll?: boolean; }>({ isOpen: false }); const { favorites, removeFavorite, clearFavorites } = useFavorites(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) { clearFavorites(); } else if (deleteConfirm.videoId && deleteConfirm.source) { removeFavorite(deleteConfirm.videoId, deleteConfirm.source); } setDeleteConfirm({ isOpen: false }); }; const cancelDelete = () => { setDeleteConfirm({ isOpen: false }); }; return ( <> {/* Toggle Button - Left side */} {/* Backdrop */} {isOpen && (
setIsOpen(false)} /> )} {/* Sidebar - Left side */} {/* Watch History Sidebar - Right side */} {/* Confirm Dialog */} ); }