import React, { ReactNode, useEffect, useRef } from 'react'; import Icon from 'wdk-client/Components/Icon/Icon'; import { useBodyScrollManager } from 'wdk-client/Components/Overlays/BodyScrollManager'; import Popup from 'wdk-client/Components/Overlays/Popup'; import { makeClassNameHelper, wrappable } from 'wdk-client/Utils/ComponentUtils'; import 'wdk-client/Components/Overlays/Dialog.css'; type Props = { open: boolean; children: ReactNode; modal?: boolean; title?: ReactNode; leftButtons?: ReactNode[]; buttons?: ReactNode[]; draggable?: boolean; resizable?: boolean; className?: string; onOpen?: () => void; onClose?: () => void; }; function Dialog(props: Props) { const headerNode = useRef(null); useBodyScrollManager(props.open && !!props.modal); useRestorePrevoiusFocus(props.open); if (!props.open) return null; const { onClose = () => {}, buttons = [( )], leftButtons } = props; const content = (
{leftButtons}
{props.title}
{buttons}
{props.children}
); return ( headerNode.current as HTMLDivElement} open={props.open} resizable={props.resizable} > {content} ); function handleKeyDown(event: React.KeyboardEvent) { if (event.key === 'Escape' || event.key === 'Esc') { onClose(); } } } let c = makeClassNameHelper('wdk-Dialog'); let c2 = makeClassNameHelper(' '); function makeClassName(className?: string, suffix = '', ...modifiers: any[]) { return c(suffix, ...modifiers) + ( className ? c2(className + suffix, ...modifiers) : '' ); } function useRestorePrevoiusFocus(isOpen: boolean) { const previousActiveRef = useRef(); useEffect(() => { if (isOpen) { previousActiveRef.current = document.activeElement; } else { restoreFocus(); } return restoreFocus; function restoreFocus() { if (previousActiveRef.current instanceof HTMLElement) { previousActiveRef.current.focus(); } } }, [isOpen]) } export default wrappable(Dialog);