"use client"; import { useRouter } from "next/navigation"; import type { KomgaBook, KomgaSeries } from "@/types/komga"; import { BookCover } from "../ui/book-cover"; import { SeriesCover } from "../ui/series-cover"; import { useTranslate } from "@/hooks/useTranslate"; import { ScrollContainer } from "@/components/ui/scroll-container"; import { Section } from "@/components/ui/section"; import type { LucideIcon } from "lucide-react"; import { Card } from "@/components/ui/card"; import { useBookOfflineStatus } from "@/hooks/useBookOfflineStatus"; import { cn } from "@/lib/utils"; interface BaseItem { id: string; metadata: { title: string; }; } interface OptimizedSeries extends BaseItem { booksCount: number; booksReadCount: number; } interface OptimizedBook extends BaseItem { readProgress: { page: number; }; media: { pagesCount: number; }; metadata: { title: string; number?: string; }; } interface MediaRowProps { title: string; items: (OptimizedSeries | OptimizedBook)[]; icon?: LucideIcon; } export function MediaRow({ title, items, icon }: MediaRowProps) { const router = useRouter(); const { t } = useTranslate(); const onItemClick = (item: OptimizedSeries | OptimizedBook) => { const path = "booksCount" in item ? `/series/${item.id}` : `/books/${item.id}`; router.push(path); }; if (!items.length) return null; return (
{items.map((item) => ( onItemClick?.(item)} /> ))}
); } interface MediaCardProps { item: OptimizedSeries | OptimizedBook; onClick?: () => void; } function MediaCard({ item, onClick }: MediaCardProps) { const { t } = useTranslate(); const isSeries = "booksCount" in item; const { isAccessible } = useBookOfflineStatus(isSeries ? "" : item.id); const title = isSeries ? item.metadata.title : item.metadata.title || (item.metadata.number ? t("navigation.volume", { number: item.metadata.number }) : ""); const handleClick = () => { // Pour les séries, toujours autoriser le clic // Pour les livres, vérifier si accessible if (isSeries || isAccessible) { onClick?.(); } }; return (
{isSeries ? ( <>

{title}

{t("series.books", { count: item.booksCount })}

) : ( <> )}
); }