import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18n-lite"; import { useAnnotations } from "@/context/AnnotationsContext"; import type { MarkerEntry } from "@/types"; import { CollapsibleMarkerPassage, CollapsibleMarkerThought, } from "@/components/annotations/CollapsibleMarkerText"; import { MarkerPassageActions } from "@/components/annotations/MarkerPassageActions"; interface MarkerThreadsViewProps { ebookIdFilter?: string; onGoToPassage: (ebookId: number, epubCfi: string) => void; } export function MarkerThreadsView({ ebookIdFilter, onGoToPassage, }: MarkerThreadsViewProps) { const { t } = useTranslation(); const { markersByBook, loadBookmarks, removeBookmark, state } = useAnnotations(); const [collapsed, setCollapsed] = useState>({}); useEffect(() => { void loadBookmarks(ebookIdFilter); }, [loadBookmarks, ebookIdFilter]); const groups = useMemo(() => { if (!ebookIdFilter) return markersByBook; const id = Number(ebookIdFilter); return markersByBook.filter((g) => g.ebookId === id); }, [markersByBook, ebookIdFilter]); if (state.bookmarksLoading) { return
{t("annotations.loading")}
; } if (groups.length === 0) { return (

{t("annotations.empty")}

{t("annotations.selectTextHint")}

); } const toggleBook = (ebookId: number) => { setCollapsed((prev) => ({ ...prev, [ebookId]: !prev[ebookId] })); }; return (
{groups.map((group) => { const isCollapsed = collapsed[group.ebookId] ?? false; return (
{!isCollapsed && (
    {group.markers.map((m: MarkerEntry) => (
  • {m.chapter_title ? ( {m.chapter_title} ) : ( {t("annotations.chapterIndex", { index: String(m.chapter_index + 1) })} )}
    {m.location_text && ( )} {m.content ? ( ) : ( {t("annotations.bookmarkOnly")} )} onGoToPassage(m.ebook_id, m.epub_cfi)} onDelete={() => removeBookmark(m.id)} />
  • ))}
)}
); })}
); }