"use client"; import { Book, BookOpen, BookMarked, Star, StarOff } from "lucide-react"; import type { KomgaSeries } from "@/types/komga"; import { useState, useEffect } from "react"; import { useToast } from "@/components/ui/use-toast"; import { RefreshButton } from "@/components/library/RefreshButton"; import { AppError } from "@/utils/errors"; import { ERROR_CODES } from "@/constants/errorCodes"; import { getErrorMessage } from "@/utils/errors"; import { useTranslate } from "@/hooks/useTranslate"; import { SeriesCover } from "@/components/ui/series-cover"; import { StatusBadge } from "@/components/ui/status-badge"; import { IconButton } from "@/components/ui/icon-button"; import logger from "@/lib/logger"; import { addToFavorites, removeFromFavorites } from "@/app/actions/favorites"; interface SeriesHeaderProps { series: KomgaSeries; refreshSeries: (seriesId: string) => Promise<{ success: boolean; error?: string }>; initialIsFavorite: boolean; } export const SeriesHeader = ({ series, refreshSeries, initialIsFavorite }: SeriesHeaderProps) => { const { toast } = useToast(); const [isFavorite, setIsFavorite] = useState(initialIsFavorite); const { t } = useTranslate(); useEffect(() => { setIsFavorite(initialIsFavorite); }, [series.id, initialIsFavorite]); const handleToggleFavorite = async () => { try { const action = isFavorite ? removeFromFavorites : addToFavorites; const result = await action(series.id); if (result.success) { setIsFavorite(!isFavorite); // Dispatcher l'événement avec le seriesId pour mise à jour optimiste de la sidebar const event = new CustomEvent("favoritesChanged", { detail: { seriesId: series.id, action: isFavorite ? "remove" : "add", series: isFavorite ? undefined : series, }, }); window.dispatchEvent(event); toast({ title: t(isFavorite ? "series.header.favorite.remove" : "series.header.favorite.add"), description: series.metadata.title, }); } else { throw new AppError( isFavorite ? ERROR_CODES.FAVORITE.DELETE_ERROR : ERROR_CODES.FAVORITE.ADD_ERROR ); } } catch (error) { logger.error({ err: error }, "Erreur lors de la modification des favoris:"); toast({ title: "Erreur", description: error instanceof AppError ? error.message : getErrorMessage(ERROR_CODES.FAVORITE.NETWORK_ERROR), variant: "destructive", }); } }; const getReadingStatusInfo = () => { const { booksCount, booksReadCount, booksUnreadCount } = series; const booksInProgressCount = booksCount - (booksReadCount + booksUnreadCount); if (booksReadCount === booksCount) { return { label: t("series.header.status.read"), status: "success" as const, icon: BookMarked, }; } if (booksInProgressCount > 0 || (booksReadCount > 0 && booksReadCount < booksCount)) { return { label: t("series.header.status.progress", { read: booksReadCount, total: booksCount, }), status: "reading" as const, icon: BookOpen, }; } return { label: t("series.header.status.unread"), status: "unread" as const, icon: Book, }; }; const statusInfo = getReadingStatusInfo(); return (
{/* Image de fond */}
{/* Contenu */}
{/* Image principale */}
{/* Informations */}

{series.metadata.title}

{series.metadata.summary && (

{series.metadata.summary}

)}
{statusInfo.label} {series.booksCount === 1 ? t("series.header.books", { count: series.booksCount }) : t("series.header.books_plural", { count: series.booksCount })}
); };