import Link from "next/link"; import Image from "next/image"; import { Star, Calendar, Database, Heart } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { useCallback } from "react"; import { PageMangaListDTO, useSetFavorite, useSetUnfavorite, } from "@/api/mangamochi"; import { useQueryClient } from "@tanstack/react-query"; import { useAuth } from "@/contexts/auth-context"; interface Manga { id: number; title: string; coverImageKey?: string; status?: string; publishedFrom?: string; publishedTo?: string; providerCount?: number; authors: string[]; genres: string[]; score: number; favorite: boolean; } interface MangaCardProps { manga: Manga; queryKey: any; } export function MangaCard({ manga, queryKey }: MangaCardProps) { const queryClient = useQueryClient(); const { isAuthenticated } = useAuth(); const formatter = new Intl.DateTimeFormat("en-US", { month: "2-digit", day: "2-digit", year: "numeric", }); const publishedTo = manga.publishedTo ? formatter.format(new Date(manga.publishedTo)) : null; const publishedFrom = manga.publishedFrom ? formatter.format(new Date(manga.publishedFrom)) : null; const dateRange = publishedTo ? `${publishedFrom} - ${publishedTo}` : `${publishedFrom} - Present`; const author = manga.authors.join(", "); const { mutate: mutateFavorite, isPending: isPendingFavorite } = useSetFavorite({ mutation: { onSuccess: () => queryClient.setQueryData( queryKey, (oldData: PageMangaListDTO | undefined) => { return { ...oldData, content: oldData?.content?.map((m) => m.id === manga.id ? { ...m, favorite: true } : m, ) || [], }; }, ), }, }); const { mutate: mutateUnfavorite, isPending: isPendingUnfavorite } = useSetUnfavorite({ mutation: { onSuccess: () => queryClient.setQueryData( queryKey, (oldData: PageMangaListDTO | undefined) => { return { ...oldData, content: oldData?.content?.map((m) => m.id === manga.id ? { ...m, favorite: false } : m, ) || [], }; }, ), }, }); const handleFavoriteClick = useCallback( (isFavorite: boolean) => { isFavorite ? mutateUnfavorite({ id: manga.id }) : mutateFavorite({ id: manga.id }); }, [mutateUnfavorite, manga.id, mutateFavorite], ); return (
{manga.title}
{manga.status}
{isAuthenticated && ( )}
{/* Info */}

{manga.title}

{author}

{publishedFrom && (
{dateRange}
)}
{manga.score && manga.score > 0 ? manga.score : "-"}
{manga.providerCount}{" "} {manga.providerCount === 1 ? "provider" : "providers"}
{manga.genres.map((genre) => ( {genre} ))}
); }