UNPKG

@coreui/react

Version:

UI Components Library for React.js

78 lines (74 loc) 4.87 kB
'use strict'; var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js'); var React = require('react'); var PropTypes = require('prop-types'); var index = require('../../_virtual/index.js'); var useForkedRef = require('../../hooks/useForkedRef.js'); require('@popperjs/core'); var utils = require('./utils.js'); const CSearchButton = React.forwardRef((_a, ref) => { var { children, className, disabled, icon, onClick, onTrigger, placeholder = 'Search', preventDefault = true, shortcut = 'meta+/,ctrl+/', type = 'button' } = _a, rest = tslib_es6.__rest(_a, ["children", "className", "disabled", "icon", "onClick", "onTrigger", "placeholder", "preventDefault", "shortcut", "type"]); const buttonRef = React.useRef(null); const forkedRef = useForkedRef.useForkedRef(ref, buttonRef); const [activeKeys, setActiveKeys] = React.useState([]); const shortcuts = React.useMemo(() => utils.parseShortcut(shortcut), [shortcut]); const preferredShortcut = React.useMemo(() => utils.getPreferredShortcut(shortcuts), [shortcuts]); const shortcutTokens = React.useMemo(() => utils.formatShortcutTokens((preferredShortcut === null || preferredShortcut === void 0 ? void 0 : preferredShortcut.shortcut) || ''), [preferredShortcut]); const handleShortcut = React.useCallback((event) => { if (disabled || event.defaultPrevented || event.repeat || utils.shouldIgnoreShortcut(event)) { return; } const matchedShortcut = shortcuts.find((shortcut) => utils.matchesShortcut(shortcut, event)); if (!matchedShortcut) { return; } if (preventDefault) { event.preventDefault(); } onTrigger === null || onTrigger === void 0 ? void 0 : onTrigger(); }, [disabled, onTrigger, preventDefault, shortcuts]); const handleDocumentKeydown = React.useCallback((event) => { setActiveKeys(Array.from(utils.getPressedKeys(event))); handleShortcut(event); }, [handleShortcut]); const handleDocumentKeyup = React.useCallback((event) => { setActiveKeys(Array.from(utils.getPressedKeys(event))); }, []); const handleWindowBlur = React.useCallback(() => { setActiveKeys([]); }, []); React.useEffect(() => { if (typeof document === 'undefined' || typeof window === 'undefined') { return; } document.addEventListener('keydown', handleDocumentKeydown); document.addEventListener('keyup', handleDocumentKeyup); window.addEventListener('blur', handleWindowBlur); return () => { document.removeEventListener('keydown', handleDocumentKeydown); document.removeEventListener('keyup', handleDocumentKeyup); window.removeEventListener('blur', handleWindowBlur); }; }, [handleDocumentKeydown, handleDocumentKeyup, handleWindowBlur]); const handleClick = (event) => { onClick === null || onClick === void 0 ? void 0 : onClick(event); onTrigger === null || onTrigger === void 0 ? void 0 : onTrigger(); }; return (React.createElement("button", Object.assign({ type: type, className: index.default('search-button', className), disabled: disabled, onClick: handleClick }, rest, { ref: forkedRef }), children !== null && children !== void 0 ? children : (React.createElement(React.Fragment, null, icon !== null && icon !== void 0 ? icon : (React.createElement("svg", { className: "search-button-icon", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", "aria-hidden": "true" }, React.createElement("path", { fill: "currentColor", d: "m479.6 399.716-81.084-81.084-62.368-25.767A175 175 0 0 0 368 192c0-97.047-78.953-176-176-176S16 94.953 16 192s78.953 176 176 176a175.03 175.03 0 0 0 101.619-32.377l25.7 62.2 81.081 81.088a56 56 0 1 0 79.2-79.195M48 192c0-79.4 64.6-144 144-144s144 64.6 144 144-64.6 144-144 144S48 271.4 48 192m408.971 264.284a24.03 24.03 0 0 1-33.942 0l-76.572-76.572-23.894-57.835 57.837 23.894 76.573 76.572a24.03 24.03 0 0 1-.002 33.941" }))), React.createElement("span", { className: "search-button-placeholder" }, placeholder))), React.createElement("span", { className: "search-button-keys", "aria-hidden": "true" }, shortcutTokens.map((key) => (React.createElement("span", { className: index.default('search-button-key', { active: activeKeys.includes(key) }), "data-coreui-search-button-key": key, key: key }, key)))))); }); CSearchButton.propTypes = { children: PropTypes.node, className: PropTypes.string, disabled: PropTypes.bool, icon: PropTypes.node, onTrigger: PropTypes.func, placeholder: PropTypes.node, preventDefault: PropTypes.bool, shortcut: PropTypes.string, }; CSearchButton.displayName = 'CSearchButton'; exports.CSearchButton = CSearchButton; //# sourceMappingURL=CSearchButton.js.map