import { Progress, Space, Tag, Tooltip } from "antd"; import { useTranslation } from "react-i18next"; const parseConfidence = (confidenceStr) => { if (!confidenceStr || typeof confidenceStr !== "string") return null; const match = confidenceStr.match(/T([\d.]+)\s*-\s*O([\d.]+)\s*-\s*J([\d.]+)/); if (!match) return null; return { total: parseFloat(match[1]), ocr: parseFloat(match[2]), jobMatch: parseFloat(match[3]) }; }; const getConfidenceColor = (value) => { if (value >= 80) return "green"; if (value >= 60) return "orange"; if (value >= 40) return "gold"; return "red"; }; const ConfidenceDisplay = ({ rowValue: { confidence, actual_price, actual_cost } }) => { const { t } = useTranslation(); const parsed = parseConfidence(confidence); const parsed_actual_price = parseFloat(actual_price); const parsed_actual_cost = parseFloat(actual_cost); if (!parsed) { return N/A; } const { total, ocr, jobMatch } = parsed; const color = getConfidenceColor(total); return (
{t("bills.labels.ai.confidence.breakdown")}
{t("bills.labels.ai.confidence.overall")}: {total.toFixed(1)}%
{t("bills.labels.ai.confidence.ocr")}: {ocr.toFixed(1)}%
{t("bills.labels.ai.confidence.match")}: {jobMatch.toFixed(1)}%
} > {!parsed_actual_cost || !parsed_actual_price || parsed_actual_cost === 0 || parsed_actual_price === 0 ? ( {t("bills.labels.ai.confidence.missing_data")} ) : null} {total.toFixed(0)}%
); }; export default ConfidenceDisplay;