import React, {useLayoutEffect, useRef, PropsWithChildren, KeyboardEvent} from 'react'; import cls from 'classnames'; import {Breadcrumb} from '@core0/breadcrumb'; import {renderForeground} from '@core0/utils'; import {RoundButton} from '@core0/round-button'; import {Transition, TransitionType} from '@core0/transition'; import {Backdrop} from '@core0/backdrop'; import cn from './modal.module.styl'; export interface ModalProps extends Partial { onClose?(output?: Output): void; canBackdropCloseModal?: boolean; canEscapeCloseModal?: boolean; hasCloseButton?: boolean; locations?: string[]; } export interface ModalStyles { backdropBackground: string; backdropOpacity: string; contentContainerMaxWidth: string; contentContainerWidth: string; contentContainerHeight: string; contentContainerMaxHeight: string; transitionType: TransitionType; zIndex: number; } export function Modal(props: PropsWithChildren>): JSX.Element { const { onClose = () => {}, canBackdropCloseModal = false, canEscapeCloseModal = false, hasCloseButton = false, backdropBackground = 'white', backdropOpacity = '0.98', contentContainerWidth = 'auto', contentContainerMaxWidth = '100%', contentContainerHeight = 'auto', contentContainerMaxHeight = '100%', transitionType = 'zoom-in-inward', zIndex, locations = [], children } = props; const hostElmRef = useRef(null); const backdropElmRef = useRef(null); /* **************************************** * Effect Hooks **************************************** */ useLayoutEffect(() => { const requestId = requestAnimationFrame(() => { if (backdropElmRef.current) { backdropElmRef.current.style.opacity = backdropOpacity; } }); return () => cancelAnimationFrame(requestId); }, []); useLayoutEffect(() => { hostElmRef?.current?.focus(); }, []); /* **************************************** * Event Handlers **************************************** */ function backdropClickHandler() { if (canBackdropCloseModal) onClose(); } function closeButtonClickHandler() { onClose(); } function hostElmKeyDownHandler(evt: KeyboardEvent) { if (canEscapeCloseModal && evt.key.toLowerCase() === 'escape') onClose(); } return renderForeground(
{children}
); }