"use client"; import { Edit, Eye, Heart, MoreHorizontal, Share2, Trash2 } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; import * as React from "react"; import { toast } from "sonner"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardFooter, CardHeader, } from "@/components/ui/card"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { useAuth } from "@/providers/auth-provider"; import { ContentService } from "@/services/content.service"; import { FavoriteService } from "@/services/favorite.service"; import type { Content } from "@/types/content"; import { UserContentEditDialog } from "./user-content-edit-dialog"; interface ContentCardProps { content: Content; onUpdate?: () => void; } export function ContentCard({ content, onUpdate }: ContentCardProps) { const { isAuthenticated, user } = useAuth(); const router = useRouter(); const [isLiked, setIsLiked] = React.useState(content.isLiked || false); const [likesCount, setLikesCount] = React.useState(content.favoritesCount); const [editDialogOpen, setEditDialogOpen] = React.useState(false); const isAuthor = user?.uuid === content.authorId; React.useEffect(() => { setIsLiked(content.isLiked || false); setLikesCount(content.favoritesCount); }, [content.isLiked, content.favoritesCount]); const handleLike = async (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if (!isAuthenticated) { toast.error("Vous devez être connecté pour liker un mème"); router.push("/login"); return; } try { if (isLiked) { await FavoriteService.remove(content.id); setIsLiked(false); setLikesCount((prev) => prev - 1); } else { await FavoriteService.add(content.id); setIsLiked(true); setLikesCount((prev) => prev + 1); } } catch (_error) { toast.error("Une erreur est survenue"); } }; const handleUse = async (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); try { await ContentService.incrementUsage(content.id); toast.success("Mème prêt à être utilisé !"); } catch (_error) { toast.error("Une erreur est survenue"); } }; const handleDelete = async () => { if (!confirm("Êtes-vous sûr de vouloir supprimer ce mème ?")) return; try { await ContentService.remove(content.id); toast.success("Mème supprimé !"); onUpdate?.(); } catch (_error) { toast.error("Erreur lors de la suppression."); } }; return ( <> {content.author.username[0].toUpperCase()} {content.author.displayName || content.author.username} {new Date(content.createdAt).toLocaleDateString("fr-FR")} {isAuthor && ( <> setEditDialogOpen(true)}> Modifier Supprimer > )} toast.success("Lien copié !")}> Partager {content.mimeType.startsWith("image/") ? ( ) : ( )} {likesCount} {content.views} Utiliser {content.title} {content.tags.slice(0, 3).map((tag, _i) => ( #{typeof tag === "string" ? tag : tag.name} ))} onUpdate?.()} /> > ); }