@appbuckets/react-ui
Version:
Just Another React UI Framework
206 lines (203 loc) • 5.84 kB
JavaScript
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 };