import { useEffect, useState } from 'react'; import { Alert, EmptyState, LoadingBlock, errorMessage } from '../../components/Feedback'; import { getInspectionFindingEvidenceBlob, listInspectionFindingEvidence, listInspectionFindings, } from '../../lib/api'; import type { InspectionFinding, InspectionFindingEvidence } from '../../lib/api'; import { formatDate } from '../../lib/format'; type FindingWithPhotos = { finding: InspectionFinding; photos: InspectionFindingEvidence[] }; function Photo({ id, title, caption, load }: { id: string; title: string; caption: string; load: (id: string) => Promise }) { const [url, setUrl] = useState(''); useEffect(() => { let active = true; let objectUrl = ''; load(id).then((blob) => { if (!active) return; objectUrl = URL.createObjectURL(blob); setUrl(objectUrl); }).catch(() => undefined); return () => { active = false; if (objectUrl) URL.revokeObjectURL(objectUrl); }; }, [id, load]); return
{url ? {title} : Cargando foto…}
{caption}
; } function Finding({ item }: { item: FindingWithPhotos }) { const { finding, photos } = item; const hierarchy = finding.asset.hierarchy; return
{finding.code}

{finding.title}

Elemento afectado: {finding.asset.typeName} · {finding.asset.name} · {finding.asset.code}

{hierarchy &&
Departamento{hierarchy.department?.name ?? '—'}
Área{hierarchy.area?.name ?? '—'}
Yacimiento{hierarchy.yacimiento?.name ?? '—'}
Empresa{hierarchy.company?.name ?? '—'}
Instalación{hierarchy.installation?.name ?? 'No corresponde'}
Subinstalación{hierarchy.subinstallation?.name ?? 'No corresponde'}
}

Constatación: {finding.description}

{finding.legalBasis &&

Normativa: {finding.legalBasis}

} {finding.severity != null &&

Gravedad {finding.severity}/10

} {photos.length > 0 &&
{photos.map((photo) => )}
} {photos.length === 0 && Sin fotografías vinculadas al hallazgo.}
; } export function InspectionActMediaPanel({ actId }: { actId: string }) { const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); useEffect(() => { let active = true; setLoading(true); setError(''); listInspectionFindings(actId) .then(async (findings) => { const records = await Promise.all(findings.map(async (finding) => ({ finding, photos: (await listInspectionFindingEvidence(finding.id)).filter((evidence) => evidence.kind === 'PHOTO' && evidence.purpose === 'OBSERVATION'), }))); if (active) setItems(records); }) .catch((requestError) => active && setError(errorMessage(requestError))) .finally(() => active && setLoading(false)); return () => { active = false; }; }, [actId]); return

Hallazgos del Acta

El Acta muestra únicamente Hallazgos y la evidencia fotográfica vinculada a cada uno.

{items.length}
{error && {error}} {loading ? : items.length ?
{items.map((item) => )}
: }
; }