UNPKG

@appbuckets/react-ui

Version:
206 lines (203 loc) 5.84 kB
import { __rest, __read, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import { createShorthandFactory, isBrowser, childrenUtils, Portal, } from '@appbuckets/react-ui-core'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import BackdropInner from './BackdropInner.js'; import Loader from '../Loader/Loader.js'; /* -------- * Component Render * -------- */ var Backdrop = function (receivedProps) { var props = 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 = __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$1 = React.useMemo(function () { return isBrowser(); }, []); // ---- // Check if this is a nested backdrop. // Nested backdrop must not change body classList // Change is demanded to primary backdrop // ---- var _a = __read( React.useState(document.body.classList.contains('dimmed')), 1 ), isNestedBackdrop = _a[0]; // ---- // Save the state of the Inner Backdrop // to close using transition // ---- var _b = __read(React.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$1 && !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$1 && !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(className, { loading: loading, page: page }); // ---- // Memoized Elements // ---- var innerContent = React.createElement( BackdropInner, __assign({}, rest, { className: innerClasses, visible: visible, onClickOutside: handleOutsideContentClick, onEntered: handleBackdropInnerEntered, onExited: handleBackdropInnerExited, }), loading ? Loader.create( __assign( { appearance: 'white', size: 'big', centered: true }, loaderProps ), { autoGenerateKey: false } ) : childrenUtils.isNil(children) ? content : children ); /** Return the Dimmer */ if (page) { return React.createElement( 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 = createShorthandFactory(Backdrop, function (content) { return { content: content }; }); export { Backdrop as default };