UNPKG

@blueprintjs/core

Version:

Core styles & components

54 lines 2.14 kB
/* ! * (c) Copyright 2024 Palantir Technologies Inc. All rights reserved. */ import * as React from "react"; import { mergeRefs, Utils } from "../common"; const DEFAULT_OPTIONS = { defaultTabIndex: undefined, disabledTabIndex: -1 }; export 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?.(e); }, [isActive, onBlur]); const handleKeyDown = React.useCallback((e) => { if (Utils.isKeyboardClick(e)) { e.preventDefault(); if (e.key !== currentKeyPressed) { setIsActive(true); } } setCurrentKeyPressed(e.key); onKeyDown?.(e); }, [currentKeyPressed, onKeyDown]); const handleKeyUp = React.useCallback((e) => { if (Utils.isKeyboardClick(e)) { setIsActive(false); elementRef.current?.click(); } setCurrentKeyPressed(undefined); 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: mergeRefs(elementRef, ref), tabIndex: interactive ? tabIndex : disabledTabIndex, }, ]; } //# sourceMappingURL=useInteractiveAttributes.js.map