import { useEffect, useRef, useCallback } from "react"; interface Props { projectName: string; operation: "starting" | "stopping" | "resetting"; progressMsg: string | null; error: string | null; completed: boolean; onForceStop: () => void; onClose: () => void; } const operationLabels: Record = { starting: "Starting", stopping: "Stopping", resetting: "Resetting", }; export default function ContainerProgressModal({ projectName, operation, progressMsg, error, completed, onForceStop, onClose, }: Props) { const overlayRef = useRef(null); // Auto-close on success after 800ms useEffect(() => { if (completed && !error) { const timer = setTimeout(onClose, 800); return () => clearTimeout(timer); } }, [completed, error, onClose]); // Escape to close (only when completed or error) useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape" && (completed || error)) onClose(); }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [completed, error, onClose]); const handleOverlayClick = useCallback( (e: React.MouseEvent) => { if (e.target === overlayRef.current && (completed || error)) onClose(); }, [completed, error, onClose], ); const inProgress = !completed && !error; return (

{operationLabels[operation]} “{projectName}”

{/* Spinner / checkmark / error icon */}
{error ? ( ) : completed ? ( ) : (
)}
{/* Progress message */}

{error ? {error} : completed ? "Done!" : progressMsg ?? `${operationLabels[operation]}...`}

{/* Buttons */}
{inProgress && ( )} {(completed || error) && ( )}
); }