UNPKG

@carbon/react

Version:

React components for the Carbon Design System

85 lines (76 loc) 3.09 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 React = require('react'); var cx = require('classnames'); var Search = require('../Search/Search.js'); require('../Search/Search.Skeleton.js'); var usePrefix = require('../../internal/usePrefix.js'); var events = require('../../tools/events.js'); var keys = require('../../internal/keyboard/keys.js'); var match = require('../../internal/keyboard/match.js'); var mergeRefs = require('../../tools/mergeRefs.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx); const ExpandableSearch = /*#__PURE__*/React__default["default"].forwardRef(function ExpandableSearch({ onBlur, onChange, onExpand, onKeyDown, defaultValue, isExpanded, ...props }, forwardedRef) { const [expanded, setExpanded] = React.useState(isExpanded || false); const [hasContent, setHasContent] = React.useState(defaultValue ? true : false); const searchRef = React.useRef(null); const prefix = usePrefix.usePrefix(); function handleBlur(evt) { const relatedTargetIsAllowed = evt.relatedTarget && evt.relatedTarget.classList.contains(`${prefix}--search-close`); if (expanded && !relatedTargetIsAllowed && !hasContent && !isExpanded) { setExpanded(false); } } React.useEffect(() => { setExpanded(!!isExpanded); }, [isExpanded]); function handleChange(evt) { setHasContent(evt.target.value !== ''); } function handleExpand() { setExpanded(true); searchRef.current?.focus?.(); } function handleKeyDown(evt) { if (expanded && match.match(evt, keys.Escape)) { evt.stopPropagation(); // escape key only clears if the input is empty, otherwise it clears the input if (!evt.target?.value && !isExpanded) { setExpanded(false); } } } const classes = cx__default["default"](`${prefix}--search--expandable`, { [`${prefix}--search--expanded`]: expanded }, props.className); return /*#__PURE__*/React__default["default"].createElement(Search["default"], _rollupPluginBabelHelpers["extends"]({}, props, { defaultValue: defaultValue, isExpanded: expanded, ref: mergeRefs["default"](searchRef, forwardedRef), className: classes, onBlur: events.composeEventHandlers([onBlur, handleBlur]), onChange: events.composeEventHandlers([onChange, handleChange]), onExpand: events.composeEventHandlers([onExpand, handleExpand]), onKeyDown: events.composeEventHandlers([onKeyDown, handleKeyDown]) })); }); ExpandableSearch.propTypes = Search["default"].propTypes; ExpandableSearch.displayName = 'ExpandableSearch'; exports["default"] = ExpandableSearch;