UNPKG

@appbuckets/react-ui

Version:
242 lines (235 loc) 6.76 kB
'use strict'; var tslib = require('tslib'); var React = require('react'); var clsx = require('clsx'); var reactUiCore = require('@appbuckets/react-ui-core'); require('../BucketTheme/BucketTheme.js'); var BucketContext = require('../BucketTheme/BucketContext.js'); var BackdropInner = require('./BackdropInner.js'); var Loader = require('../Loader/Loader.js'); function _interopDefaultLegacy(e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty( n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; }, } ); } }); } n['default'] = e; return Object.freeze(n); } var React__namespace = /*#__PURE__*/ _interopNamespace(React); var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx); /* -------- * Component Render * -------- */ var Backdrop = function (receivedProps) { var props = BucketContext.useWithDefaultProps('backdrop', receivedProps); // ---- // Get Backdrop Props // ---- var /** Backdrop Props */ className = props.className, closeOnBackdropClick = props.closeOnBackdropClick, children = props.children, content = props.content, loading = props.loading, loaderProps = props.loaderProps, userDefinedOnEntered = props.onEntered, userDefinedOnExited = props.onExited, page = props.page, visible = props.visible, /** Handled Portal Props */ closeOnDocumentClick = props.closeOnDocumentClick, closeOnEscape = props.closeOnEscape, onClose = props.onClose, onMount = props.onMount, onOpen = props.onOpen, onUnmount = props.onUnmount, openOnTriggerClick = props.openOnTriggerClick, openOnTriggerFocus = props.openOnTriggerFocus, openOnTriggerMouseEnter = props.openOnTriggerMouseEnter, trigger = props.trigger, triggerRef = props.triggerRef; /** OnClick must be stripped to rest props passed down to Backdrop Inner */ props.onClick; var /** All other Props */ rest = tslib.__rest(props, [ 'className', 'closeOnBackdropClick', 'children', 'content', 'loading', 'loaderProps', 'onEntered', 'onExited', 'page', 'visible', 'closeOnDocumentClick', 'closeOnEscape', 'onClose', 'onMount', 'onOpen', 'onUnmount', 'openOnTriggerClick', 'openOnTriggerFocus', 'openOnTriggerMouseEnter', 'trigger', 'triggerRef', 'onClick', ]); /** Check if code is running on browser */ var isBrowser = React__namespace.useMemo(function () { return reactUiCore.isBrowser(); }, []); // ---- // Check if this is a nested backdrop. // Nested backdrop must not change body classList // Change is demanded to primary backdrop // ---- var _a = tslib.__read( React__namespace.useState(document.body.classList.contains('dimmed')), 1 ), isNestedBackdrop = _a[0]; // ---- // Save the state of the Inner Backdrop // to close using transition // ---- var _b = tslib.__read(React__namespace.useState(!!visible), 2), backdropInnerVisible = _b[0], setBackdropInnerVisible = _b[1]; // ---- // Define Backdrop Handlers // ---- var handlePortalMount = function () { /** Set document class only if this is the first backdrop */ if (isBrowser && !isNestedBackdrop) { document.body.classList.add('dimmable'); document.body.classList.add('dimmed'); } if (onMount) { onMount(null, props); } }; var handlePortalUnmount = function () { /** Remove Document class only if this is the last backdrop */ if (isBrowser && !isNestedBackdrop) { document.body.classList.remove('dimmable'); document.body.classList.remove('dimmed'); } if (onUnmount) { onUnmount(null, props); } }; var handlePortalOpen = function (e) { if (onOpen) { onOpen(e, props); } }; var handlePortalClose = function (e) { if (onClose) { onClose(e, props); } }; var handleOutsideContentClick = function (e) { if (visible && closeOnBackdropClick) { handlePortalClose(e); } }; var handleBackdropInnerExited = function (element) { setBackdropInnerVisible(false); if (typeof userDefinedOnExited === 'function') { userDefinedOnExited(element); } }; var handleBackdropInnerEntered = function (element) { setBackdropInnerVisible(true); if (typeof userDefinedOnEntered === 'function') { userDefinedOnEntered(element, false); } }; // ---- // Define Classes // ---- var innerClasses = clsx__default['default'](className, { loading: loading, page: page, }); // ---- // Memoized Elements // ---- var innerContent = React__namespace.createElement( BackdropInner, tslib.__assign({}, rest, { className: innerClasses, visible: visible, onClickOutside: handleOutsideContentClick, onEntered: handleBackdropInnerEntered, onExited: handleBackdropInnerExited, }), loading ? Loader.create( tslib.__assign( { appearance: 'white', size: 'big', centered: true }, loaderProps ), { autoGenerateKey: false } ) : reactUiCore.childrenUtils.isNil(children) ? content : children ); /** Return the Dimmer */ if (page) { return React__namespace.createElement( reactUiCore.Portal, { closeOnEscape: closeOnEscape, closeOnDocumentClick: closeOnDocumentClick, open: visible || backdropInnerVisible, openOnTriggerClick: openOnTriggerClick, openOnTriggerMouseEnter: openOnTriggerMouseEnter, openOnTriggerFocus: openOnTriggerFocus, trigger: trigger, triggerRef: triggerRef, onClose: handlePortalClose, onOpen: handlePortalOpen, onMount: handlePortalMount, onUnmount: handlePortalUnmount, }, innerContent ); } /** Else, return the Backdrop Inner Content */ return innerContent; }; /** Properly set the Display Name */ Backdrop.displayName = 'Backdrop'; /** Append Child Component */ Backdrop.Inner = BackdropInner; /** Backdrop could be created using shorthand */ Backdrop.create = reactUiCore.createShorthandFactory( Backdrop, function (content) { return { content: content }; } ); module.exports = Backdrop;