import React, { FC, PropsWithChildren, useCallback, useEffect } from 'react'; import { Portal } from '../Portal/Portal'; import { cx } from 'emotion'; import { useTheme } from '../../themes'; import { IconName } from '../../types'; import { getModalStyles } from './getModalStyles'; import { ModalHeader } from './ModalHeader'; import { IconButton } from '../IconButton/IconButton'; export interface Props { icon?: IconName; iconTooltip?: string; /** Title for the modal or custom header element */ title: string | JSX.Element; className?: string; contentClassName?: string; closeOnEscape?: boolean; isOpen?: boolean; onDismiss?: () => void; /** If not set will call onDismiss if that is set. */ onClickBackdrop?: () => void; } export function Modal(props: PropsWithChildren): ReturnType> { const { title, children, isOpen = false, closeOnEscape = true, className, contentClassName, onDismiss: propsOnDismiss, onClickBackdrop, } = props; const theme = useTheme(); const styles = getModalStyles(theme); const onDismiss = useCallback(() => { if (propsOnDismiss) { propsOnDismiss(); } }, [propsOnDismiss]); useEffect(() => { const onEscKey = (ev: KeyboardEvent) => { if (ev.key === 'Esc' || ev.key === 'Escape') { onDismiss(); } }; if (isOpen && closeOnEscape) { document.addEventListener('keydown', onEscKey, false); } else { document.removeEventListener('keydown', onEscKey, false); } return () => { document.removeEventListener('keydown', onEscKey, false); }; }, [closeOnEscape, isOpen, onDismiss]); if (!isOpen) { return null; } return (
{typeof title === 'string' && } {typeof title !== 'string' && title}
{children}
); } interface DefaultModalHeaderProps { title: string; icon?: IconName; iconTooltip?: string; } function DefaultModalHeader({ icon, iconTooltip, title }: DefaultModalHeaderProps): JSX.Element { return ; }