import { useActionMutation } from "@agent-native/core/client/hooks"; import { IconHeart, IconHeartFilled } from "@tabler/icons-react"; import { useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardFooter } from "@/components/ui/card"; import { cn } from "@/lib/utils"; import { useVisitorId } from "@/lib/visitor-id"; export type QuoteCardData = { id: number; text: string; tags: string[]; poem: { title: string; author: string; source: string | null; year: number | null; }; favoriteCount: number; isFavorited: boolean; }; interface QuoteCardProps { quote: QuoteCardData; onTagClick?: (tag: string) => void; className?: string; } export function QuoteCard({ quote, onTagClick, className }: QuoteCardProps) { const visitorId = useVisitorId(); const [optimistic, setOptimistic] = useState<{ favorited: boolean; count: number } | null>( null, ); const { mutate, isPending } = useActionMutation("toggle-favorite", { onSuccess: (result) => { setOptimistic({ favorited: result.favorited, count: result.favoriteCount }); }, onError: () => setOptimistic(null), }); const favorited = optimistic?.favorited ?? quote.isFavorited; const count = optimistic?.count ?? quote.favoriteCount; return (
“{quote.text}”

— {quote.poem.author}, {quote.poem.title} {quote.poem.year ? ` (${quote.poem.year})` : ""}

{quote.tags.length > 0 && (
{quote.tags.map((tag) => ( onTagClick?.(tag)} > {tag} ))}
)}
{count} {count === 1 ? "favorite" : "favorites"}
); }