UNPKG

@blueprintjs/core

Version:

Core styles & components

60 lines 2.6 kB
"use strict"; /* ! * (c) Copyright 2024 Palantir Technologies Inc. All rights reserved. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.useInteractiveAttributes = void 0; const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const common_1 = require("../common"); const DEFAULT_OPTIONS = { defaultTabIndex: undefined, disabledTabIndex: -1 }; function useInteractiveAttributes(interactive, props, ref, options = DEFAULT_OPTIONS) { const { defaultTabIndex, disabledTabIndex } = options; const { active, onClick, onFocus, onKeyDown, onKeyUp, onBlur, tabIndex = defaultTabIndex } = props; // the current key being pressed const [currentKeyPressed, setCurrentKeyPressed] = React.useState(); // whether the button is in "active" state const [isActive, setIsActive] = React.useState(false); // our local ref for the interactive element, merged with the consumer's own ref in this hook's return value const elementRef = React.useRef(null); const handleBlur = React.useCallback((e) => { if (isActive) { setIsActive(false); } onBlur === null || onBlur === void 0 ? void 0 : onBlur(e); }, [isActive, onBlur]); const handleKeyDown = React.useCallback((e) => { if (common_1.Utils.isKeyboardClick(e)) { e.preventDefault(); if (e.key !== currentKeyPressed) { setIsActive(true); } } setCurrentKeyPressed(e.key); onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e); }, [currentKeyPressed, onKeyDown]); const handleKeyUp = React.useCallback((e) => { var _a; if (common_1.Utils.isKeyboardClick(e)) { setIsActive(false); (_a = elementRef.current) === null || _a === void 0 ? void 0 : _a.click(); } setCurrentKeyPressed(undefined); onKeyUp === null || onKeyUp === void 0 ? void 0 : onKeyUp(e); }, [onKeyUp, elementRef]); const resolvedActive = interactive && (active || isActive); return [ resolvedActive, { onBlur: handleBlur, onClick: interactive ? onClick : undefined, onFocus: interactive ? onFocus : undefined, onKeyDown: handleKeyDown, onKeyUp: handleKeyUp, ref: (0, common_1.mergeRefs)(elementRef, ref), tabIndex: interactive ? tabIndex : disabledTabIndex, }, ]; } exports.useInteractiveAttributes = useInteractiveAttributes; //# sourceMappingURL=useInteractiveAttributes.js.map