UNPKG

@atlaskit/drawer

Version:

A drawer is a panel that slides in from the left side of the screen.

143 lines (140 loc) • 5.42 kB
/// <reference types="node" /> /* eslint-disable @repo/internal/dom-events/no-unsafe-event-listeners */ import React, { useCallback, useEffect } from 'react'; import { canUseDOM } from 'exenv'; import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next/usePlatformLeafEventHandler'; import { Layering } from '@atlaskit/layering/layering'; import { useCloseOnEscapePress } from '@atlaskit/layering/use-close-on-escape-press'; import { fg } from '@atlaskit/platform-feature-flags/fg'; import Portal from '@atlaskit/portal/portal'; import Blanket from './blanket'; import { DrawerPanel } from './drawer-panel/drawer-panel'; import { DrawerTopLayer } from './drawer-panel/drawer-top-layer'; // escape close manager for layering var EscapeCloseManager = function EscapeCloseManager(_ref) { var onClose = _ref.onClose; // wrap so that we can cast the event to a React.KeyboardEvent var handleClose = useCallback(function (evt) { onClose && onClose(evt); }, [onClose]); useCloseOnEscapePress({ onClose: handleClose }); return /*#__PURE__*/React.createElement("span", null); }; var DrawerBase = function DrawerBase(_ref2) { var _ref2$width = _ref2.width, width = _ref2$width === void 0 ? 'narrow' : _ref2$width, isOpen = _ref2.isOpen, _ref2$isFocusLockEnab = _ref2.isFocusLockEnabled, isFocusLockEnabled = _ref2$isFocusLockEnab === void 0 ? true : _ref2$isFocusLockEnab, _ref2$shouldReturnFoc = _ref2.shouldReturnFocus, shouldReturnFocus = _ref2$shouldReturnFoc === void 0 ? true : _ref2$shouldReturnFoc, _ref2$autoFocusFirstE = _ref2.autoFocusFirstElem, autoFocusFirstElem = _ref2$autoFocusFirstE === void 0 ? true : _ref2$autoFocusFirstE, onKeyDown = _ref2.onKeyDown, testId = _ref2.testId, children = _ref2.children, onClose = _ref2.onClose, onCloseComplete = _ref2.onCloseComplete, onOpenComplete = _ref2.onOpenComplete, _ref2$zIndex = _ref2.zIndex, zIndex = _ref2$zIndex === void 0 ? 'unset' : _ref2$zIndex, label = _ref2.label, titleId = _ref2.titleId, enterFrom = _ref2.enterFrom; var handleClose = usePlatformLeafEventHandler({ fn: function fn(evt, analyticsEvent) { return onClose === null || onClose === void 0 ? void 0 : onClose(evt, analyticsEvent); }, action: 'dismissed', componentName: 'drawer', packageName: "@atlaskit/drawer", packageVersion: "14.3.5", analyticsData: { trigger: 'escKey' } }); var handleKeyDown = useCallback(function (evt) { onKeyDown && onKeyDown(evt); }, [onKeyDown]); useEffect(function () { if (isOpen) { window.addEventListener('keydown', handleKeyDown); } return function () { window.removeEventListener('keydown', handleKeyDown); }; }, [handleKeyDown, isOpen]); var handleBlanketClick = usePlatformLeafEventHandler({ fn: function fn(evt, analyticsEvent) { return onClose === null || onClose === void 0 ? void 0 : onClose(evt, analyticsEvent); }, action: 'dismissed', componentName: 'drawer', packageName: "@atlaskit/drawer", packageVersion: "14.3.5", analyticsData: { trigger: 'blanket' } }); var handleBackButtonClick = usePlatformLeafEventHandler({ fn: function fn(evt, analyticsEvent) { return onClose === null || onClose === void 0 ? void 0 : onClose(evt, analyticsEvent); }, action: 'dismissed', componentName: 'drawer', packageName: "@atlaskit/drawer", packageVersion: "14.3.5", analyticsData: { trigger: 'backButton' } }); var body = canUseDOM ? document.querySelector('body') : undefined; if (!body) { return null; } return /*#__PURE__*/React.createElement(Portal, { zIndex: zIndex }, /*#__PURE__*/React.createElement(Blanket, { isOpen: isOpen, onBlanketClicked: handleBlanketClick, testId: testId && "".concat(testId, "--blanket") }), /*#__PURE__*/React.createElement(DrawerPanel, { testId: testId, isOpen: isOpen, onClose: handleBackButtonClick, onCloseComplete: onCloseComplete, onOpenComplete: onOpenComplete, width: width, enterFrom: enterFrom, label: label, titleId: titleId, autoFocusFirstElem: autoFocusFirstElem, isFocusLockEnabled: isFocusLockEnabled, shouldReturnFocus: shouldReturnFocus }, isOpen ? /*#__PURE__*/React.createElement(Layering, { isDisabled: false }, children, /*#__PURE__*/React.createElement(EscapeCloseManager, { onClose: handleClose })) : children)); }; /** * __Drawer__ * * A drawer is a panel that slides in from the left side of the screen. * * - [Examples](https://atlassian.design/components/drawer/examples) * - [Code](https://atlassian.design/components/drawer/code) * - [Usage](https://atlassian.design/components/drawer/usage) */ export var Drawer = function Drawer(props) { if (fg('platform-dst-top-layer')) { // eslint-disable-next-line @repo/internal/react/no-unsafe-spread-props -- internal implementation component takes the same DrawerProps return /*#__PURE__*/React.createElement(DrawerTopLayer, props); } // eslint-disable-next-line @repo/internal/react/no-unsafe-spread-props -- internal implementation component takes the same DrawerProps return /*#__PURE__*/React.createElement(DrawerBase, props); }; // Public API aliases preserved from an eliminated entry-point (volt-migrate-package). export { Drawer as default };