// ─────────────────────────────────────────────────────────── // Huio Control Panel — Disputes & Reports View (cp-disputes-view.jsx) // ─────────────────────────────────────────────────────────── if (!window.CP_STYLES) throw new Error('[cp-disputes-view] window.CP_STYLES not loaded'); const isPending = status => status === 'pending_review' || status === 'under_investigation' || status === 'pending'; const isResolved = status => status === 'resolved' || status === 'dismissed'; // Static O(1) dictionary for badge CSS classes const STATUS_BADGES = { under_investigation: 'hu-chip hu-chip-teal hu-pulse', resolved: 'hu-chip hu-chip-coral', dismissed: 'hu-chip hu-chip-gray', pending_review: 'hu-chip hu-chip-ochre', pending: 'hu-chip hu-chip-ochre', }; // Safe date formatter to prevent runtime exceptions on malformed ISO timestamps const formatResolvedAt = (isoStr) => { if (!isoStr) return ''; try { const dt = new Date(isoStr); return isNaN(dt.getTime()) ? String(isoStr) : dt.toLocaleString(); } catch { return String(isoStr); } }; function renderDisputes({ lang, t: rawT, appStyles: rawAppStyles, disputes: rawDisputes = [], disputesFilter = 'pending', setDisputesFilter, resolvingReportId = null, handleResolve, setZoomImg, }) { const appStyles = rawAppStyles || window.CP_STYLES || {}; const t = typeof rawT === 'function' ? rawT : (k) => k; const disputes = Array.isArray(rawDisputes) ? rawDisputes : []; // Senior High-Load Optimization: Single-pass zero-allocation aggregation let pendingCount = 0; let resolvedCount = 0; const isPendingFilter = disputesFilter === 'pending'; for (let i = 0; i < disputes.length; i++) { const d = disputes[i]; if (!d) continue; if (isPending(d.status)) pendingCount++; else if (isResolved(d.status)) resolvedCount++; } // Single-pass defensive filter with hoisted loop invariant const filteredDisputes = disputes.filter(d => { if (!d) return false; return isPendingFilter ? isPending(d.status) : isResolved(d.status); }); return (
{t('disputes.sub')}
{t('disputes.empty')}