import { formatEventSeconds, type SessionChartMarker, type SessionEventNoteInfo, } from '../../lib/session-events'; interface SessionEventPopoverProps { marker: SessionChartMarker; noteInfos: Map; loading: boolean; pinned: boolean; onTogglePinned: () => void; onClose: () => void; onOpenNote: (noteId: number) => void; } function formatEventTime(tsMs: number): string { return new Date(tsMs).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', }); } export function SessionEventPopover({ marker, noteInfos, loading, pinned, onTogglePinned, onClose, onOpenNote, }: SessionEventPopoverProps) { return (
{marker.kind === 'pause' && 'Paused'} {marker.kind === 'card' && 'Card mined'}
{formatEventTime(marker.eventTsMs)}
{pinned ? ( Pinned ) : null} {pinned ? ( ) : null}
{marker.kind === 'pause' && '||'} {marker.kind === 'card' && '\u26CF'}
{marker.kind === 'pause' && (
Duration: {formatEventSeconds(marker.durationMs)}
)} {marker.kind === 'card' && (
+{marker.cardsDelta} {marker.cardsDelta === 1 ? 'card' : 'cards'}
{loading ? (
Loading Anki note info...
) : null}
{marker.noteIds.length > 0 ? ( marker.noteIds.map((noteId) => { const info = noteInfos.get(noteId); const hasPreview = Boolean(info?.expression || info?.context || info?.meaning); const showUnavailableFallback = !loading && !hasPreview; return (
Note {noteId}
{showUnavailableFallback ? (
Preview unavailable
) : null}
{info?.expression ? (
{info.expression}
) : null} {info?.context ? (
{info.context}
) : null} {info?.meaning ? (
{info.meaning}
) : null} {showUnavailableFallback ? (
Preview unavailable from AnkiConnect.
) : null}
); }) ) : (
No linked note ids recorded.
)}
)}
); }