import React, {useRef, useState, useEffect} from 'react' // eslint-disable-line import {ModalDialogProps} from './types' // eslint-disable-line import './remix-ui-modal-dialog.css' declare global { // eslint-disable-next-line no-unused-vars interface Window { testmode: boolean } } export const ModalDialog = (props: ModalDialogProps) => { const [state, setState] = useState({ toggleBtn: true }) const calledHideFunctionOnce = useRef() const modal = useRef(null) const handleHide = () => { if (!calledHideFunctionOnce.current) { props.handleHide() } calledHideFunctionOnce.current = true } useEffect(() => { calledHideFunctionOnce.current = props.hide modal.current.focus() if (modal.current) { modal.current.removeEventListener('blur', handleBlur) modal.current.addEventListener('blur', handleBlur) } return () => { modal.current && modal.current.removeEventListener('blur', handleBlur) } }, [props.hide]) function handleBlur(e) { if (!e.currentTarget.contains(e.relatedTarget)) { e.stopPropagation() if (document.activeElement !== this) { !window.testmode && handleHide() !window.testmode && props.cancelFn && props.cancelFn() } } } const modalKeyEvent = (keyCode) => { if (keyCode === 27) { // Esc if (props.cancelFn) props.cancelFn() handleHide() } else if (keyCode === 13) { // Enter enterHandler() } else if (keyCode === 37) { // todo && footerIsActive) { // Arrow Left setState((prevState) => { return { ...prevState, toggleBtn: true } }) } else if (keyCode === 39) { // todo && footerIsActive) { // Arrow Right setState((prevState) => { return { ...prevState, toggleBtn: false } }) } } const enterHandler = () => { if (state.toggleBtn) { if (props.okFn) props.okFn() } else { if (props.cancelFn) props.cancelFn() } handleHide() } return (
{ modalKeyEvent(keyCode) }} >
{props.title && props.title}
{!props.showCancelIcon && ( handleHide()}> )}
{props.children ? props.children : props.message}
{/* todo add autofocus ^^ */} {props.okLabel && ( )} {props.cancelLabel && ( )}
) } export default ModalDialog