'use client'; import React, { useState, useEffect, useRef } from 'react'; export type IncidentModalAction = 'close' | 'reopen' | 'archive'; interface OperationsIncidentModalProps { isOpen: boolean; action: IncidentModalAction; caseReference: string; initialResolution?: string; isSubmitting: boolean; onConfirm: (resolution?: string) => void; onClose: () => void; } export function OperationsIncidentModal({ isOpen, action, caseReference, initialResolution = '', isSubmitting, onConfirm, onClose, }: OperationsIncidentModalProps) { const [resolution, setResolution] = useState(initialResolution); const [error, setError] = useState(null); const modalRef = useRef(null); const textareaRef = useRef(null); useEffect(() => { setResolution(initialResolution); setError(null); }, [isOpen, initialResolution, action]); useEffect(() => { if (isOpen) { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape' && !isSubmitting) { onClose(); } }; window.addEventListener('keydown', handleKeyDown); // Auto-focus appropriate element setTimeout(() => { if (action === 'close' && textareaRef.current) { textareaRef.current.focus(); } else if (modalRef.current) { modalRef.current.focus(); } }, 50); return () => window.removeEventListener('keydown', handleKeyDown); } }, [isOpen, isSubmitting, action, onClose]); if (!isOpen) return null; function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (action === 'close') { if (!resolution.trim()) { setError('Resolution summary is required before closing this incident.'); return; } onConfirm(resolution.trim()); } else { onConfirm(); } } const titles: Record = { close: 'Close Incident', reopen: 'Reopen Incident', archive: 'Archive Incident', }; const descriptions: Record = { close: `Closing incident ${caseReference} requires an authoritative resolution record.`, reopen: `Reopening incident ${caseReference} will transition status back to INVESTIGATING. (Owner authorization required)`, archive: `Archiving incident ${caseReference} is terminal. No further mutations will be permitted. (Owner authorization required)`, }; return (
{/* Modal Header */}
{action === 'close' ? 'task_alt' : action === 'reopen' ? 'replay' : 'archive'}

{caseReference}

{descriptions[action]}

{error && (
error {error}
)}
{action === 'close' && (
{resolution.length} / 4000