import { DialogContext, DialogContextType } from '../../context/DialogContextProvider'; import React, { useContext, useEffect } from 'react'; import { BaseDialogProps } from '../../utils/types'; import Modal from './Modal'; import styles from './Modal.module.scss'; export interface DialogProps extends BaseDialogProps { children?: React.ReactNode; showCloseIcon?: boolean; className?: string; onAfterClose?: (result?: T) => void; onAfterOpen?: () => void; isCanClose?: boolean; isOpen?: boolean; isStatic?: boolean; isFocusLock?: boolean; defaultBodyOverflow?: string; isBodyScrollLocked?: boolean; replaceScrollBar?: boolean; scrollBarPlaceholderColor?: string; } export default function Dialog(props: DialogProps): JSX.Element { const onClose = props.onClose; const onAfterClose = props.onAfterClose; const dialogUniqId = (~~(Math.random() * 1e8)).toString(16); const isCanClose = props.isCanClose ?? true; const { dialogState, setDialogState } = useContext(DialogContext); useEffect(() => { setDialogState({ isOpen: props.isOpen, isForce: false, }); }, [props.isOpen, setDialogState]); const close = () => { setDialogState({ isOpen: false, result: undefined, isForce: true }); }; useEffect(() => { if (!dialogState.isOpen && dialogState.isForce) { if (onClose) { onClose(dialogState.result as T); } if (onAfterClose) { onAfterClose(dialogState.result as T); } } if (dialogState.isOpen && props.onAfterOpen) { props.onAfterOpen(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [dialogState]); const onAttemptClose = () => { if (isCanClose) { onAfterClose ? onAfterClose(dialogState.result as T) : close(); } }; return ( { if (props.onCompletelyHidden) { props.onCompletelyHidden(); } }} > {props.showCloseIcon && ( )} {props.title && (

{props.title}

)}
{props.children}
); } function CloseIcon() { return ( ); }