import { useNavigate } from "@tanstack/react-router"; import { useTranslation } from "react-i18next"; import { useFormatters } from "../hooks/useFormatters"; import type { CandidateDelta } from "../hooks/useImpactDeltas"; import { LucideIcon } from "../lib/iconData"; import { useUIStore } from "../stores/uiStore"; import { RankBadge } from "./CandidateListItem"; import { GearImage, imageContainerBg } from "./GearImage"; import { ImpactDeltaBadge } from "./ImpactDeltaBadge"; import { StatusBadge } from "./StatusBadge"; interface CandidateCardProps { id: number; name: string; weightGrams: number | null; priceCents: number | null; categoryName: string; categoryIcon: string; imageFilename: string | null; imageUrl?: string | null; productUrl?: string | null; dominantColor?: string | null; cropZoom?: number | null; cropX?: number | null; cropY?: number | null; threadId: number; isActive: boolean; status: "researching" | "ordered" | "arrived"; onStatusChange: (status: "researching" | "ordered" | "arrived") => void; pros?: string | null; cons?: string | null; rank?: number; delta?: CandidateDelta; } export function CandidateCard({ id, name, weightGrams, priceCents, categoryName, categoryIcon, imageFilename: _imageFilename, imageUrl, productUrl, dominantColor, cropZoom, cropX, cropY, threadId, isActive, status, onStatusChange, pros, cons, rank, delta, }: CandidateCardProps) { const { t } = useTranslation("threads"); const { weight, price } = useFormatters(); const navigate = useNavigate(); const openConfirmDeleteCandidate = useUIStore( (s) => s.openConfirmDeleteCandidate, ); const openResolveDialog = useUIStore((s) => s.openResolveDialog); const openExternalLink = useUIStore((s) => s.openExternalLink); return ( ); }