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}
);
}