import { type ReactNode, useEffect, useId, useRef } from "react"; import { createPortal } from "react-dom"; import { X } from "lucide-react"; import { useFocusTrap } from "@/client/hooks"; interface DialogProps { open: boolean; onClose(): void; title: string; description?: string; icon?: ReactNode; dismissDisabled?: boolean; children: ReactNode; } const DialogInner = ({ onClose, title, description, icon, dismissDisabled, children }: Omit) => { const titleId = useId(); const descId = useId(); const panelRef = useRef(null); const previousFocusRef = useRef(null); useFocusTrap(panelRef); useEffect(() => { previousFocusRef.current = document.activeElement as HTMLElement | null; return () => { previousFocusRef.current?.focus(); }; }, []); useEffect(() => { if (dismissDisabled) return; const onKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", onKeyDown); return () => document.removeEventListener("keydown", onKeyDown); }, [dismissDisabled, onClose]); return createPortal(
{icon ? ( ) : null}

{title}

{description ? (

{description}

) : null}
{dismissDisabled ? null : ( )}
{children}
, document.body, ); }; export const Dialog = ({ open, ...rest }: DialogProps) => { if (!open) return null; return ; };