@appbuckets/react-ui
Version:
Just Another React UI Framework
242 lines (235 loc) • 6.76 kB
JavaScript
'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;