'use client';
import { Fragment, ReactNode, useEffect, useSyncExternalStore } from 'react';
import { createPortal } from 'react-dom';
interface ModalProps {
isOpen: boolean;
onClose: () => void;
title?: string;
children: ReactNode;
size?: 'sm' | 'md' | 'lg' | 'xl';
}
const sizeStyles = {
sm: 'max-w-sm',
md: 'max-w-md',
lg: 'max-w-lg',
xl: 'max-w-xl',
};
function subscribe() {
return () => {};
}
function useIsMounted() {
return useSyncExternalStore(
subscribe,
() => true,
() => false
);
}
export function Modal({ isOpen, onClose, title, children, size = 'md' }: ModalProps) {
const isMounted = useIsMounted();
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape') onClose();
};
if (isOpen) {
document.addEventListener('keydown', handleEscape);
document.body.style.overflow = 'hidden';
}
return () => {
document.removeEventListener('keydown', handleEscape);
document.body.style.overflow = 'unset';
};
}, [isOpen, onClose]);
if (!isMounted || !isOpen) return null;
return createPortal(
{title}