UNPKG

@carbon/react

Version:

React components for the Carbon Design System

76 lines (71 loc) 2.62 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. */ import { extends as _extends } from '../../_virtual/_rollupPluginBabelHelpers.js'; import React, { useState, useRef, useEffect } from 'react'; import cx from 'classnames'; import Search from '../Search/Search.js'; import '../Search/Search.Skeleton.js'; import { usePrefix } from '../../internal/usePrefix.js'; import { composeEventHandlers } from '../../tools/events.js'; import { Escape } from '../../internal/keyboard/keys.js'; import { match } from '../../internal/keyboard/match.js'; import mergeRefs from '../../tools/mergeRefs.js'; const ExpandableSearch = /*#__PURE__*/React.forwardRef(function ExpandableSearch({ onBlur, onChange, onExpand, onKeyDown, defaultValue, isExpanded, ...props }, forwardedRef) { const [expanded, setExpanded] = useState(isExpanded || false); const [hasContent, setHasContent] = useState(defaultValue ? true : false); const searchRef = useRef(null); const prefix = usePrefix(); function handleBlur(evt) { const relatedTargetIsAllowed = evt.relatedTarget && evt.relatedTarget.classList.contains(`${prefix}--search-close`); if (expanded && !relatedTargetIsAllowed && !hasContent && !isExpanded) { setExpanded(false); } } useEffect(() => { setExpanded(!!isExpanded); }, [isExpanded]); function handleChange(evt) { setHasContent(evt.target.value !== ''); } function handleExpand() { setExpanded(true); searchRef.current?.focus?.(); } function handleKeyDown(evt) { if (expanded && match(evt, 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(`${prefix}--search--expandable`, { [`${prefix}--search--expanded`]: expanded }, props.className); return /*#__PURE__*/React.createElement(Search, _extends({}, props, { defaultValue: defaultValue, isExpanded: expanded, ref: mergeRefs(searchRef, forwardedRef), className: classes, onBlur: composeEventHandlers([onBlur, handleBlur]), onChange: composeEventHandlers([onChange, handleChange]), onExpand: composeEventHandlers([onExpand, handleExpand]), onKeyDown: composeEventHandlers([onKeyDown, handleKeyDown]) })); }); ExpandableSearch.propTypes = Search.propTypes; ExpandableSearch.displayName = 'ExpandableSearch'; export { ExpandableSearch as default };