@braineet/ui
Version:
Braineet design system
162 lines • 5.35 kB
JavaScript
var _excluded = ["width", "innerStyles"];
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
/* eslint-disable no-param-reassign */
/* eslint-disable no-underscore-dangle */
import React, { useEffect, forwardRef, createContext, useContext, useRef } from 'react';
import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock';
import { useSpring } from 'react-spring';
import Box from '../box';
import { Slide } from '../transition';
import { Wrapper, Content, Overlay, Body, Footer } from './styles';
import { jsx as _jsx } from "react/jsx-runtime";
var disableContainerScroll = function disableContainerScroll(containerRef) {
if (containerRef.current) {
containerRef.current.style.overflow = 'hidden';
}
};
var enableContainerScroll = function enableContainerScroll(containerRef) {
if (containerRef.current) {
containerRef.current.style.overflow = '';
}
};
var DrawerContext = /*#__PURE__*/createContext({});
export var useDrawerContext = function useDrawerContext() {
return useContext(DrawerContext);
};
var Drawer = function Drawer(_ref) {
var children = _ref.children,
isOpen = _ref.isOpen,
onClose = _ref.onClose,
isFullHeight = _ref.isFullHeight,
initialFocusRef = _ref.initialFocusRef,
container = _ref.container,
placement = _ref.placement,
forceUpdate = _ref.forceUpdate,
strategy = _ref.strategy,
zIndex = _ref.zIndex;
var contentRef = useRef(null);
useEffect(function () {
var func = function func(event) {
if (event.key === 'Escape') {
onClose();
}
};
if (isOpen && initialFocusRef && initialFocusRef.current) {
initialFocusRef.current.focus();
}
if (isOpen) {
document.addEventListener('keydown', func);
}
return function () {
document.removeEventListener('keydown', func);
};
}, [isOpen, onClose, forceUpdate]);
useEffect(function () {
var drawerNode = contentRef.current;
if (isOpen) {
if (container && container.current) {
disableContainerScroll(container);
} else {
disableBodyScroll(drawerNode);
}
}
return function () {
if (container && container.current) {
enableContainerScroll(container);
} else {
enableBodyScroll(drawerNode);
}
};
}, [isOpen]);
var drawerContext = React.useMemo(function () {
return {
container: container,
contentRef: contentRef,
isOpen: isOpen,
placement: placement,
onClose: onClose,
finalHeight: isFullHeight ? '100%' : 'auto',
zIndex: zIndex,
strategy: strategy
};
}, [container, contentRef, isOpen, placement, onClose, isFullHeight, zIndex, strategy]);
return /*#__PURE__*/_jsx(DrawerContext.Provider, {
value: drawerContext,
children: children
});
};
var DrawerWrapper = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
var width = _ref2.width,
innerStyles = _ref2.innerStyles,
restProps = _objectWithoutPropertiesLoose(_ref2, _excluded);
var _useDrawerContext = useDrawerContext(),
strategy = _useDrawerContext.strategy,
zIndex = _useDrawerContext.zIndex,
contentRef = _useDrawerContext.contentRef,
isOpen = _useDrawerContext.isOpen,
placement = _useDrawerContext.placement,
finalHeight = _useDrawerContext.finalHeight;
return /*#__PURE__*/_jsx(Slide, {
isOpen: isOpen,
placement: placement,
finalHeight: finalHeight,
width: width,
children: function children(_ref3) {
var stylesProps = _ref3.stylesProps;
return /*#__PURE__*/_jsx(Wrapper, {
ref: contentRef,
$position: strategy,
$zIndex: zIndex,
style: stylesProps,
children: /*#__PURE__*/_jsx(Box, {
ref: ref,
height: "100%",
width: width,
children: /*#__PURE__*/_jsx(Content, _extends({
innerStyles: innerStyles
}, restProps))
})
});
}
});
});
var DrawerOverlay = /*#__PURE__*/forwardRef(function (props, ref) {
var _useDrawerContext2 = useDrawerContext(),
isOpen = _useDrawerContext2.isOpen,
onClose = _useDrawerContext2.onClose,
zIndex = _useDrawerContext2.zIndex;
var stylesProps = useSpring({
opacity: isOpen ? 1 : 0,
display: isOpen ? 'block' : 'none'
});
return /*#__PURE__*/_jsx(Overlay, _extends({
ref: ref,
$zIndex: zIndex,
onClick: onClose
}, props, {
style: stylesProps
}));
});
DrawerOverlay.defaultProps = {
onClose: function onClose() {}
};
DrawerWrapper.defaultProps = {
width: '100%',
innerStyles: {}
};
Drawer.defaultProps = {
initialFocusRef: null,
container: null,
isOpen: false,
forceUpdate: false,
placement: 'right',
strategy: 'absolute',
isFullHeight: true,
onClose: function onClose() {}
};
Drawer.Wrapper = DrawerWrapper;
Drawer.Body = Body;
Drawer.Footer = Footer;
Drawer.Overlay = DrawerOverlay;
export default Drawer;