import Badge from '@/components/ui/Badge'; import { Card } from '@/components/ui/Card'; import { Flex, Grid, Stack } from '@/components/ui/layout'; import { useTranslation } from '@/hooks/useI18n'; import type { BackendMatch } from '@/schemas/backend/match'; import { AlertTriangle, MapPin, TrendingUp } from 'lucide-react'; import React from 'react'; import { formatCurrency } from '../../lib/fin'; interface MatchCardProps { match: BackendMatch; onViewDetails?: (matchId: string) => void; } const MatchCard: React.FC = ({ match, onViewDetails }) => { const { t } = useTranslation(); const getStatusColor = () => { switch (match.Status) { case 'suggested': return 'default'; case 'negotiating': return 'outline'; case 'contracted': case 'live': return 'default'; case 'failed': case 'cancelled': return 'destructive'; default: return 'outline'; } }; const formatScore = (score: number) => { return `${(score * 100).toFixed(0)}%`; }; // use central fin utilities return ( onViewDetails?.(match.ID)} >
{match.Status} Priority: {match.Priority}

{t('matches.compatibility')}

{formatScore(match.CompatibilityScore)}

{t('matches.economicValue')}

{formatCurrency(match.EconomicValue)}

{match.DistanceKm.toFixed(1)} km
{match.RiskAssessment && (
Risk:{' '} {formatScore( (match.RiskAssessment.technical_risk + match.RiskAssessment.regulatory_risk) / 2 )}
)}
{match.EconomicImpact && match.EconomicImpact.annual_savings && (
{t('matches.annualSavings')}: {formatCurrency(match.EconomicImpact.annual_savings)}
)}
); }; export default React.memo(MatchCard);