'use client'; import { useRef, useCallback, useState, useMemo } from 'react'; import { Card } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { Icons } from '@/components/ui/Icon'; import { useKeyboardNavigation } from '@/lib/hooks/useKeyboardNavigation'; import { settingsStore } from '@/lib/store/settings-store'; interface Episode { name?: string; url: string; } interface EpisodeListProps { episodes: Episode[] | null; currentEpisode: number; isReversed?: boolean; onEpisodeClick: (episode: Episode, index: number) => void; onToggleReverse?: (reversed: boolean) => void; } export function EpisodeList({ episodes, currentEpisode, isReversed = false, onEpisodeClick, onToggleReverse }: EpisodeListProps) { const listRef = useRef(null); const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]); // Memoized display episodes - reversed if toggle is on const displayEpisodes = useMemo(() => { if (!episodes) return null; return isReversed ? [...episodes].reverse() : episodes; }, [episodes, isReversed]); // Map display index to original index const getOriginalIndex = useCallback((displayIndex: number) => { if (!episodes || !isReversed) return displayIndex; return episodes.length - 1 - displayIndex; }, [episodes, isReversed]); // Map original index to display index (for highlighting current episode) const getDisplayIndex = useCallback((originalIndex: number) => { if (!episodes || !isReversed) return originalIndex; return episodes.length - 1 - originalIndex; }, [episodes, isReversed]); // Keyboard navigation useKeyboardNavigation({ enabled: true, containerRef: listRef, currentIndex: getDisplayIndex(currentEpisode), itemCount: episodes?.length || 0, orientation: 'vertical', onNavigate: useCallback((index: number) => { buttonRefs.current[index]?.focus(); buttonRefs.current[index]?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, []), onSelect: useCallback((displayIndex: number) => { if (episodes) { const originalIndex = getOriginalIndex(displayIndex); if (episodes[originalIndex]) { onEpisodeClick(episodes[originalIndex], originalIndex); } } }, [episodes, onEpisodeClick, getOriginalIndex]), }); const showReverseToggle = episodes && episodes.length > 1; return (

选集 {episodes && ( {episodes.length} )} {/* Reverse order toggle button - only show when more than 1 episode */} {showReverseToggle && ( )}

{displayEpisodes && displayEpisodes.length > 0 ? ( displayEpisodes.map((episode, displayIndex) => { const originalIndex = getOriginalIndex(displayIndex); const isCurrentEpisode = currentEpisode === originalIndex; return ( ); }) ) : (

暂无剧集信息

)}
); }