'use client'; import { useMemo } from 'react'; import { useTranslations } from 'next-intl'; import type { Part, SeverityLevel } from '@arac-hasar/types'; import { PartCard, CleanPartsBadgeRow } from '@arac-hasar/ui'; const SEV_RANK: Record = { agir: 3, orta: 2, hafif: 1, }; const STATUS_RANK: Record = { severe_damage: 3, moderate_damage: 2, minor_damage: 1, clean: 0, }; function maxSeverityRank(part: Part): number { if (part.damages.length === 0) return 0; return Math.max( ...part.damages.map((d) => SEV_RANK[d.severity.level] ?? 0), ); } interface Props { parts: Part[]; onHoverPart?: (partName: string | null) => void; onDamageClick?: (damageId: number) => void; } export function PartList({ parts, onHoverPart, onDamageClick }: Props) { const t = useTranslations('inspect.result'); const { damaged, clean } = useMemo(() => { const damagedList = parts.filter((p) => p.status !== 'clean'); const cleanList = parts.filter((p) => p.status === 'clean'); damagedList.sort((a, b) => { const statusDiff = STATUS_RANK[b.status] - STATUS_RANK[a.status]; if (statusDiff !== 0) return statusDiff; const sevDiff = maxSeverityRank(b) - maxSeverityRank(a); if (sevDiff !== 0) return sevDiff; return b.damage_count - a.damage_count; }); return { damaged: damagedList, clean: cleanList }; }, [parts]); return (
{damaged.length > 0 ? (

{t('damagedParts')}

{damaged.length} ยท {t('overallSeverity')}
{damaged.map((part) => (
onHoverPart?.(part.name)} onMouseLeave={() => onHoverPart?.(null)} onFocus={() => onHoverPart?.(part.name)} onBlur={() => onHoverPart?.(null)} > onHoverPart?.(part.name)} />
))}
) : (

{t('noDamage')}

{t('noDamageSubtitle')}

)} {clean.length > 0 && (

{t('cleanParts')}

)}
); }