'use client'; import { FC, useCallback, useState, MouseEvent, useRef, useEffect } from 'react'; import { resolveColor } from '@/utils/colorPalette'; import { cn } from '@/utils/styling'; import { ModalProps } from '.'; import { CloseIcon } from './close-icon'; import { getCloseButtonClasses, getDialogClasses, getFormClasses } from './style-utils'; export const Modal: FC = ({ trigger, content, actions, maxWidth, backgroundColor, closeIconColor, disableCloseModalOnClickOutside, onChangeModalState, className, }) => { const modalActionsRef = useRef(null); const [showModal, setShowModal] = useState(false); useEffect(() => { if (onChangeModalState) { onChangeModalState(showModal); } }, [showModal, onChangeModalState]); const handleClickOutside = useCallback(() => { if (!disableCloseModalOnClickOutside) setShowModal(false); }, [disableCloseModalOnClickOutside]); const toggleModal = useCallback(() => { setShowModal(prev => !prev); }, []); const handleClickContent = useCallback((e: MouseEvent) => { e.stopPropagation(); }, []); const closeIcon = resolveColor(closeIconColor, 'fill'); const formClasses = getFormClasses({ maxWidth, backgroundColor }); useEffect(() => { if (!modalActionsRef.current) return; const currentActions = modalActionsRef.current.querySelectorAll('button, a'); const handleClickButton = () => setShowModal(false); currentActions.forEach(button => { button.addEventListener('click', handleClickButton); }); return () => currentActions.forEach(button => { button.removeEventListener('click', handleClickButton); }); }, []); return (
{trigger}
{content}
{actions && (
{actions}
)}
); };