UNPKG

@onesy/ui-react

Version:
244 lines (241 loc) 10.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _utils = require("@onesy/utils"); var _styleReact = require("@onesy/style-react"); var _Modal = _interopRequireDefault(require("../Modal")); var _Slide = _interopRequireDefault(require("../Slide")); var _useSwipe = _interopRequireDefault(require("../useSwipe")); var _utils2 = require("../utils"); var _jsxRuntime = require("react/jsx-runtime"); const _excluded = ["tonal", "color", "version", "open", "openDefault", "position", "direction", "swipe", "swipeTouchAnywhere", "swipeBackgroundFollow", "min", "removeOnExited", "onClose", "TransitionComponentProps", "Component", "className", "children"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } const useStyle = (0, _styleReact.style)(theme => ({ root: { '& .onesy-Modal-surface': { display: 'flex', flexDirection: 'column', margin: '0', maxHeight: 'unset', maxWidth: 'unset', minWidth: 'unset', flex: '1 0 auto', padding: '0' } }, position_fixed: { position: 'fixed' }, position_absolute: { position: 'absolute' }, version_modal_position_fixed: { '& .onesy-Modal-surface': { position: 'fixed' } }, version_modal_position_absolute: { '& .onesy-Modal-surface': { position: 'absolute' } }, version_standard: { '&.onesy-Modal-root': { position: 'unset', inset: 'unset' }, '& .onesy-Modal-surface': { position: 'relative' } }, direction_top: { '& .onesy-Modal-surface': { top: '0', width: '100%', borderRadius: `0 0 ${theme.methods.shape.radius.value(2, 'px')} ${theme.methods.shape.radius.value(2, 'px')}` } }, direction_left: { '& .onesy-Modal-surface': { left: '0', height: '100%', borderRadius: `0 ${theme.methods.shape.radius.value(2, 'px')} ${theme.methods.shape.radius.value(2, 'px')} 0` } }, direction_right: { '& .onesy-Modal-surface': { right: '0', height: '100%', borderRadius: `${theme.methods.shape.radius.value(2, 'px')} 0 0 ${theme.methods.shape.radius.value(2, 'px')}` } }, direction_bottom: { '& .onesy-Modal-surface': { bottom: '0', width: '100%', borderRadius: `${theme.methods.shape.radius.value(2, 'px')} ${theme.methods.shape.radius.value(2, 'px')} 0 0` } } }), { name: 'onesy-NavigationDrawer' }); const NavigationDrawer = props_ => { var _theme$ui, _theme$ui2, _theme$elements, _theme$elements2, _swipeValue, _swipeValue2; const theme = (0, _styleReact.useOnesyTheme)(); const props = _objectSpread(_objectSpread(_objectSpread({}, theme === null || theme === void 0 || (_theme$ui = theme.ui) === null || _theme$ui === void 0 || (_theme$ui = _theme$ui.elements) === null || _theme$ui === void 0 || (_theme$ui = _theme$ui.all) === null || _theme$ui === void 0 || (_theme$ui = _theme$ui.props) === null || _theme$ui === void 0 ? void 0 : _theme$ui.default), theme === null || theme === void 0 || (_theme$ui2 = theme.ui) === null || _theme$ui2 === void 0 || (_theme$ui2 = _theme$ui2.elements) === null || _theme$ui2 === void 0 || (_theme$ui2 = _theme$ui2.onesyNavigationDrawer) === null || _theme$ui2 === void 0 || (_theme$ui2 = _theme$ui2.props) === null || _theme$ui2 === void 0 ? void 0 : _theme$ui2.default), props_); const Modal = (theme === null || theme === void 0 || (_theme$elements = theme.elements) === null || _theme$elements === void 0 ? void 0 : _theme$elements.Modal) || _Modal.default; const Slide = (theme === null || theme === void 0 || (_theme$elements2 = theme.elements) === null || _theme$elements2 === void 0 ? void 0 : _theme$elements2.Slide) || _Slide.default; const { tonal = false, color = [undefined, 'modal'].includes(props.version) ? 'themed' : 'default', version = 'modal', open: open_, openDefault, position = 'fixed', direction: direction_ = 'left', swipe = true, swipeTouchAnywhere = true, swipeBackgroundFollow = true, min, removeOnExited, onClose: onClose_, TransitionComponentProps = {}, Component = 'nav', className, children } = props, other = (0, _objectWithoutProperties2.default)(props, _excluded); const [, setEntered] = _react.default.useState(false); const [open, setOpen] = _react.default.useState(false); const refs = { modal: _react.default.useRef(undefined), background: _react.default.useRef(undefined) }; const { classes } = useStyle(); let direction = direction_; if (theme.direction === 'rtl') { if (direction === 'left') direction = 'right';else if (direction === 'right') direction = 'left'; } let swipeValue; if (swipe) { const swipeOptions = { open, min, direction, touchAnywhere: swipeTouchAnywhere }; swipeValue = (0, _useSwipe.default)(refs.modal.current, swipeOptions); } _react.default.useEffect(() => { if (open_ !== open) setOpen(open_); }, [open_]); _react.default.useEffect(() => { if (swipeValue && version === 'modal') { const valueSwipe = swipeValue.value; const valuePercentageSwipe = (0, _utils.clamp)(swipeValue.valuePercentage, 0, 100); const position_ = swipeValue.position; if (position_ !== undefined) { let value_; if (direction === 'top') value_ = `translateY(${valueSwipe}px)`; if (direction === 'left') value_ = `translateX(${valueSwipe}px)`; if (direction === 'right') value_ = `translateX(${valueSwipe}px)`; if (direction === 'bottom') value_ = `translateY(${valueSwipe}px)`; // Add transitions if (refs.modal.current) { refs.modal.current.style.transition = theme.methods.transitions.make('transform', { duration: 'xs' }); refs.modal.current.style.transform = value_; } if (refs.background.current) { refs.background.current.style.transition = theme.methods.transitions.make('opacity', { duration: 'xs' }); } if (position_ === 'min') { if (refs.background.current) { refs.background.current.style.opacity = '0'; } if (refs.modal.current) setTimeout(() => { onClose(); }, theme.transitions.duration.xs + 14); } if (position_ === 'max') { if (refs.background.current) { refs.background.current.style.opacity = '1'; } } } else { let value__0 = ''; if (refs.modal.current) { if (direction === 'top') value__0 = `translateY(${valueSwipe}px)`; if (direction === 'left') value__0 = `translateX(${valueSwipe}px)`; if (direction === 'right') value__0 = `translateX(${valueSwipe}px)`; if (direction === 'bottom') value__0 = `translateY(${valueSwipe}px)`; // No transition refs.modal.current.style.transition = 'none'; refs.modal.current.style.transform = value__0; } if (swipeBackgroundFollow && refs.background.current) { // No transition refs.background.current.style.transition = 'none'; refs.background.current.style.opacity = `${valuePercentageSwipe / 100}`; } else { // Add transition refs.background.current.style.transition = theme.methods.transitions.make('opacity', { duration: 'xs' }); } } } }, [version, (_swipeValue = swipeValue) === null || _swipeValue === void 0 ? void 0 : _swipeValue.value, (_swipeValue2 = swipeValue) === null || _swipeValue2 === void 0 ? void 0 : _swipeValue2.position]); const onClose = () => { if ((0, _utils.is)('function', onClose_)) onClose_(); }; if (version === 'standard') { other.portal = other.portal !== undefined ? other.portal : false; other.freezeScroll = other.freezeScroll !== undefined ? other.freezeScroll : false; other.background = other.background !== undefined ? other.background : false; other.focus = other.focus !== undefined ? other.focus : false; other.disableKeyboardClose = other.disableKeyboardClose !== undefined ? other.disableKeyboardClose : true; } TransitionComponentProps.direction = TransitionComponentProps.direction !== undefined ? TransitionComponentProps.direction : direction; TransitionComponentProps.removeOnExited = TransitionComponentProps.removeOnExited !== undefined ? TransitionComponentProps.removeOnExited : min === undefined; if (min !== undefined) { other.freezeScroll = other.freezeScroll !== undefined ? other.freezeScroll : false; other.openDefault = false; TransitionComponentProps.min = TransitionComponentProps.min !== undefined ? TransitionComponentProps.min : min; } return /*#__PURE__*/(0, _jsxRuntime.jsx)(Modal, _objectSpread(_objectSpread({ open: open, mainRef: refs.modal, backgroundRef: refs.background, partialyOpened: min !== undefined, tonal: tonal, color: color, onClose: onClose, TransitionComponentProps: _objectSpread({ onAdded: () => setEntered(true), onEntered: () => setEntered(true), onExited: () => setEntered(false), enterOnAdd: false }, TransitionComponentProps), TransitionComponent: Slide, Component: Component, portal: position === 'fixed', className: (0, _styleReact.classNames)([(0, _utils2.staticClassName)('NavigationDrawer', theme) && ['onesy-NavigationDrawer-root'], className, classes.root, classes[`position_${position}`], classes[`direction_${direction}`], classes[`version_${version}`], classes[`version_${version}_position_${position}`]]) }, other), {}, { children: children })); }; NavigationDrawer.displayName = 'onesy-NavigationDrawer'; var _default = exports.default = NavigationDrawer;