import { useState } from 'react'; import { BASE_URL } from '../../lib/api-client'; import { formatDuration, formatRelativeDate, formatNumber } from '../../lib/formatters'; import { getSessionDisplayWordCount } from '../../lib/session-word-count'; import type { SessionSummary } from '../../types/stats'; interface SessionRowProps { session: SessionSummary; isExpanded: boolean; detailsId: string; onToggle: () => void; onDelete: () => void; deleteDisabled?: boolean; onNavigateToMediaDetail?: (videoId: number) => void; } function CoverThumbnail({ animeId, videoId, title, }: { animeId: number | null; videoId: number | null; title: string; }) { const [failed, setFailed] = useState(false); const fallbackChar = title.charAt(0) || '?'; if ((!animeId && !videoId) || failed) { return (
{fallbackChar}
); } const src = animeId != null ? `${BASE_URL}/api/stats/anime/${animeId}/cover` : `${BASE_URL}/api/stats/media/${videoId}/cover`; return ( setFailed(true)} /> ); } export function SessionRow({ session, isExpanded, detailsId, onToggle, onDelete, deleteDisabled = false, onNavigateToMediaDetail, }: SessionRowProps) { const displayWordCount = getSessionDisplayWordCount(session); const knownWordsSeen = session.knownWordsSeen; return (
{onNavigateToMediaDetail != null && session.videoId != null ? ( ) : null}
); }