UNPKG

@geist-ui/react

Version:

Modern and minimalist React UI library.

98 lines (86 loc) 3.26 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import React, { useEffect, useMemo, useState } from 'react'; import { createPortal } from 'react-dom'; import usePortal from '../utils/use-portal'; import ModalWrapper from './modal-wrapper'; import ModalAction from './modal-action'; import ModalActions from './modal-actions'; import Backdrop from '../shared/backdrop'; import { ModalContext } from './modal-context'; import { pickChild } from '../utils/collections'; import useBodyScroll from '../utils/use-body-scroll'; import useScaleable, { withScaleable } from '../use-scaleable'; import useKeyboard, { KeyCode } from '../use-keyboard'; var defaultProps = { wrapClassName: '', keyboard: true, disableBackdropClick: false }; var ModalComponent = function ModalComponent(_ref) { var customVisible = _ref.visible, onClose = _ref.onClose, children = _ref.children, keyboard = _ref.keyboard, wrapClassName = _ref.wrapClassName, onContentClick = _ref.onContentClick, disableBackdropClick = _ref.disableBackdropClick; var portal = usePortal('modal'); var _useScaleable = useScaleable(), SCALES = _useScaleable.SCALES; var _useBodyScroll = useBodyScroll(null, { scrollLayer: true }), _useBodyScroll2 = _slicedToArray(_useBodyScroll, 2), setBodyHidden = _useBodyScroll2[1]; var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), visible = _useState2[0], setVisible = _useState2[1]; var _pickChild = pickChild(children, ModalAction), _pickChild2 = _slicedToArray(_pickChild, 2), withoutActionsChildren = _pickChild2[0], ActionsChildren = _pickChild2[1]; var hasActions = ActionsChildren && React.Children.count(ActionsChildren) > 0; var closeModal = function closeModal() { onClose && onClose(); setVisible(false); setBodyHidden(false); }; useEffect(function () { if (typeof customVisible === 'undefined') return; setVisible(customVisible); setBodyHidden(customVisible); }, [customVisible]); var _useKeyboard = useKeyboard(function () { keyboard && closeModal(); }, KeyCode.Escape, { disableGlobalEvent: true }), bindings = _useKeyboard.bindings; var closeFromBackdrop = function closeFromBackdrop() { if (disableBackdropClick) return; closeModal(); }; var modalConfig = useMemo(function () { return { close: closeModal }; }, []); if (!portal) return null; return /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(ModalContext.Provider, { value: modalConfig }, /*#__PURE__*/React.createElement(Backdrop, _extends({ onClick: closeFromBackdrop, onContentClick: onContentClick, visible: visible, width: SCALES.width(26) }, bindings), /*#__PURE__*/React.createElement(ModalWrapper, { visible: visible, className: wrapClassName }, withoutActionsChildren, hasActions && /*#__PURE__*/React.createElement(ModalActions, null, ActionsChildren)))), portal); }; ModalComponent.defaultProps = defaultProps; ModalComponent.displayName = 'GeistModal'; var Modal = withScaleable(ModalComponent); export default Modal;