import { useState, useMemo } from 'react'; import { useMediaLibrary } from '../../hooks/useMediaLibrary'; import { formatDuration, formatNumber } from '../../lib/formatters'; import { groupMediaLibraryItems, summarizeMediaLibraryGroups, } from '../../lib/media-library-grouping'; import { CoverImage } from './CoverImage'; import { MediaCard } from './MediaCard'; import { MediaDetailView } from './MediaDetailView'; interface LibraryTabProps { onNavigateToSession: (sessionId: number) => void; } export function LibraryTab({ onNavigateToSession }: LibraryTabProps) { const { media, loading, error } = useMediaLibrary(); const [search, setSearch] = useState(''); const [selectedVideoId, setSelectedVideoId] = useState(null); const filtered = useMemo(() => { if (!search.trim()) return media; const q = search.toLowerCase(); return media.filter((m) => { const haystacks = [ m.canonicalTitle, m.videoTitle, m.channelName, m.uploaderId, m.channelId, ].filter(Boolean); return haystacks.some((value) => value!.toLowerCase().includes(q)); }); }, [media, search]); const grouped = useMemo(() => groupMediaLibraryItems(filtered), [filtered]); const summary = useMemo(() => summarizeMediaLibraryGroups(grouped), [grouped]); if (selectedVideoId !== null) { return setSelectedVideoId(null)} />; } if (loading) return
Loading...
; if (error) return
Error: {error}
; return (
setSearch(e.target.value)} className="flex-1 bg-ctp-surface0 border border-ctp-surface1 rounded-lg px-3 py-2 text-sm text-ctp-text placeholder:text-ctp-overlay2 focus:outline-none focus:border-ctp-blue" />
{grouped.length} group{grouped.length !== 1 ? 's' : ''} · {summary.totalVideos} video {summary.totalVideos !== 1 ? 's' : ''} · {formatDuration(summary.totalMs)}
{filtered.length === 0 ? (
No media found
) : (
{grouped.map((group) => (
{group.channelUrl ? ( {group.title} ) : (

{group.title}

)}
{group.subtitle ? (
{group.subtitle}
) : null}
{group.items.length} video{group.items.length !== 1 ? 's' : ''} ·{' '} {formatDuration(group.totalActiveMs)} · {formatNumber(group.totalCards)} cards
{group.items.map((item) => ( setSelectedVideoId(item.videoId)} /> ))}
))}
)}
); }