UNPKG

@base-ui/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

53 lines (51 loc) 1.98 kB
"use strict"; 'use client'; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.useOpenInteractionType = useOpenInteractionType; exports.useOpenMethodTriggerProps = useOpenMethodTriggerProps; var React = _interopRequireWildcard(require("react")); var _useStableCallback = require("@base-ui/utils/useStableCallback"); var _useEnhancedClickHandler = require("@base-ui/utils/useEnhancedClickHandler"); var _detectBrowser = require("@base-ui/utils/detectBrowser"); var _useValueChanged = require("../internals/useValueChanged"); function useOpenMethodTriggerProps(open, setOpenMethod) { const handleTriggerClick = (0, _useStableCallback.useStableCallback)((_, interactionType) => { const isOpen = typeof open === 'function' ? open() : open; if (!isOpen) { setOpenMethod(interactionType || ( // On iOS Safari, the hitslop around touch targets means tapping outside an element's // bounds does not fire `pointerdown` but does fire `mousedown`. The `interactionType` // will be "" in that case. _detectBrowser.isIOS ? 'touch' : '')); } }); const { onClick, onPointerDown } = (0, _useEnhancedClickHandler.useEnhancedClickHandler)(handleTriggerClick); return React.useMemo(() => ({ onClick, onPointerDown }), [onClick, onPointerDown]); } /** * Determines the interaction type (keyboard, mouse, touch, etc.) that opened the component. * * @param open The open state of the component. */ function useOpenInteractionType(open) { const [openMethod, setOpenMethod] = React.useState(null); const triggerProps = useOpenMethodTriggerProps(open, setOpenMethod); (0, _useValueChanged.useValueChanged)(open, previousOpen => { if (previousOpen && !open) { setOpenMethod(null); } }); return React.useMemo(() => ({ openMethod, triggerProps }), [openMethod, triggerProps]); }