UNPKG

@carbon/react

Version:

React components for the Carbon Design System

116 lines (108 loc) 4.32 kB
/** * Copyright IBM Corp. 2016, 2023 * * This source code is licensed under the Apache-2.0 license found in the * LICENSE file in the root directory of this source tree. */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js'); var cx = require('classnames'); var PropTypes = require('prop-types'); var React = require('react'); var usePrefix = require('../../internal/usePrefix.js'); var keys = require('../../internal/keyboard/keys.js'); var match = require('../../internal/keyboard/match.js'); var useEvent = require('../../internal/useEvent.js'); var useMergedRefs = require('../../internal/useMergedRefs.js'); var Switcher = require('./Switcher.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx); var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); var React__default = /*#__PURE__*/_interopDefaultLegacy(React); const noopFn = () => {}; const HeaderPanel = /*#__PURE__*/React__default["default"].forwardRef(function HeaderPanel({ children, className: customClassName, expanded, addFocusListeners = true, onHeaderPanelFocus = noopFn, href, ...rest }, ref) { const prefix = usePrefix.usePrefix(); const headerPanelReference = React.useRef(null); const headerPanelRef = useMergedRefs.useMergedRefs([headerPanelReference, ref]); const controlled = React.useRef(expanded !== undefined).current; const [expandedState, setExpandedState] = React.useState(expanded); const expandedProp = controlled ? expanded : expandedState; const [lastClickedElement, setLastClickedElement] = React.useState(null); const className = cx__default["default"](`${prefix}--header-panel`, { [`${prefix}--header-panel--expanded`]: expandedProp, [customClassName]: !!customClassName }); const eventHandlers = {}; if (addFocusListeners) { eventHandlers.onBlur = event => { if (!event.currentTarget.contains(event.relatedTarget) && !lastClickedElement?.classList?.contains(`${prefix}--switcher__item-link`)) { setExpandedState(false); setLastClickedElement(null); if (expanded) { onHeaderPanelFocus(); } } }; eventHandlers.onKeyDown = event => { if (match.match(event, keys.Escape)) { setExpandedState(false); onHeaderPanelFocus(); if (href) { window.location.href = href; } } }; } useEvent.useWindowEvent('click', event => { const target = event.target; if (!(target instanceof HTMLElement)) return; setLastClickedElement(target); const isChildASwitcher = /*#__PURE__*/React.isValidElement(children) && typeof children.type !== 'string' && children.type === Switcher["default"]; if (isChildASwitcher && !target.closest(`.${prefix}--header-panel--expanded`) && !target.closest(`.${prefix}--header__action`) && !headerPanelReference?.current?.classList.contains(`${prefix}--switcher`) && expanded) { setExpandedState(false); onHeaderPanelFocus(); } }); return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({}, rest, { className: className, ref: headerPanelRef }, eventHandlers), children); }); HeaderPanel.propTypes = { /** * Specify whether focus and blur listeners are added. They are by default. */ addFocusListeners: PropTypes__default["default"].bool, /** * The content that will render inside of the `HeaderPanel` */ children: PropTypes__default["default"].node, /** * Optionally provide a custom class to apply to the underlying `<li>` node */ className: PropTypes__default["default"].string, /** * Specify whether the panel is expanded */ expanded: PropTypes__default["default"].bool, /** * Provide the `href` to the id of the element on your package that could * be target. */ href: PropTypes__default["default"].string, /** * An optional listener that is called a callback to collapse the HeaderPanel */ onHeaderPanelFocus: PropTypes__default["default"].func }; HeaderPanel.displayName = 'HeaderPanel'; exports["default"] = HeaderPanel;