import { useEffect, useRef } from "react";
import { useNavigate } from "react-router";
interface ModalProps {
isOpen: boolean;
onClose: () => void;
title: string;
children: React.ReactNode;
}
export function Modal({ isOpen, onClose, title, children }: ModalProps) {
const closeButtonRef = useRef<HTMLButtonElement>(null);
useEffect(() => {
if (isOpen) {
// Focus close button when modal opens
closeButtonRef.current?.focus();
// Trap focus within modal
const handleKeyDown = (e: KeyboardEvent) => {
if (e.key === "Escape") {
onClose();
}
};
document.addEventListener("keydown", handleKeyDown);
return () => document.removeEventListener("keydown", handleKeyDown);
}
}, [isOpen, onClose]);
if (!isOpen) return null;
return (
<div
className="modal-overlay"
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
>
<div className="modal-content">
<div className="modal-header">
<h2 id="modal-title">{title}</h2>
<button
ref={closeButtonRef}
onClick={onClose}
aria-label="Close dialog"
>
×
</button>
</div>
<div className="modal-body">{children}</div>
</div>
</div>
);
}