'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import { computeDoshObligation } from '@/lib/incidents/dosh' interface Props { incidentId: string currentSeverity: number | null } const SEVERITY_LABELS: Record = { 1: 'Minor', 2: 'Low', 3: 'Moderate', 4: 'Serious', 5: 'Critical / Fatality', } export function TriageForm({ incidentId, currentSeverity }: Props) { const router = useRouter() const [severity, setSeverity] = useState(currentSeverity ?? 1) const [isFatality, setIsFatality] = useState(false) const [isSBI, setIsSBI] = useState(false) const [isDO, setIsDO] = useState(false) const [isOD, setIsOD] = useState(false) const [triageNotes, setTriageNotes] = useState('') const [saving, setSaving] = useState(false) const [error, setError] = useState(null) const [aiLoading, setAiLoading] = useState(false) const [aiRationale, setAiRationale] = useState(null) const dosh = computeDoshObligation({ is_fatality: isFatality, is_serious_bodily_injury: isSBI, is_dangerous_occurrence: isDO, is_occupational_disease: isOD, lost_days: null, }) async function getAiSuggestion() { setAiLoading(true) setAiRationale(null) try { const res = await fetch(`/api/incidents/${incidentId}/ai/triage-suggest`, { method: 'POST' }) if (!res.ok) return const data = await res.json() as { severity: number is_fatality: boolean is_serious_bodily_injury: boolean is_dangerous_occurrence: boolean is_occupational_disease: boolean rationale: string } setSeverity(data.severity) setIsFatality(data.is_fatality) setIsSBI(data.is_serious_bodily_injury) setIsDO(data.is_dangerous_occurrence) setIsOD(data.is_occupational_disease) setAiRationale(data.rationale) } catch { // Non-blocking — user can still triage manually } finally { setAiLoading(false) } } async function handleSubmit(e: React.FormEvent) { e.preventDefault() setSaving(true) setError(null) const res = await fetch(`/api/incidents/${incidentId}/triage`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ severity, is_fatality: isFatality, is_serious_bodily_injury: isSBI, is_dangerous_occurrence: isDO, is_occupational_disease: isOD, triage_notes: triageNotes || null, }), }) if (!res.ok) { const data = await res.json() setError(data.error ?? 'Triage failed') setSaving(false) return } router.push(`/hse/incidents/${incidentId}`) router.refresh() } return (
setSeverity(Number(e.target.value))} className="w-full accent-blue-600" />
1 Minor3 Moderate5 Critical
DOSH Regulatory Checklist (NADOPOD 2004) {[ { id: 'fatality', label: 'Fatality', value: isFatality, set: setIsFatality }, { id: 'sbi', label: 'Serious bodily injury', value: isSBI, set: setIsSBI }, { id: 'do', label: 'Dangerous occurrence', value: isDO, set: setIsDO }, { id: 'od', label: 'Occupational disease', value: isOD, set: setIsOD }, ].map(({ id, label, value, set }) => ( ))}
{dosh.reasons.length > 0 && (

DOSH Reporting Required

{dosh.reasons.map(r => (

{r}

))} {dosh.requires_immediate_notification && (

⚠ Immediate notification required (within 24h)

)}
)}