import {useEffectEvent as $ispOf$useEffectEvent, getOwnerDocument as $ispOf$getOwnerDocument} from "@react-aria/utils"; import {useRef as $ispOf$useRef, useEffect as $ispOf$useEffect} from "react"; /* * Copyright 2020 Adobe. All rights reserved. * This file is licensed to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ // Portions of the code in this file are based on code from react. // Original licensing for the following can be found in the // NOTICE file in the root directory of this source tree. // See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions function $e0b6e0b68ec7f50f$export$872b660ac5a1ff98(props) { let { ref: ref, onInteractOutside: onInteractOutside, isDisabled: isDisabled, onInteractOutsideStart: onInteractOutsideStart } = props; let stateRef = (0, $ispOf$useRef)({ isPointerDown: false, ignoreEmulatedMouseEvents: false }); let onPointerDown = (0, $ispOf$useEffectEvent)((e)=>{ if (onInteractOutside && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) { if (onInteractOutsideStart) onInteractOutsideStart(e); stateRef.current.isPointerDown = true; } }); let triggerInteractOutside = (0, $ispOf$useEffectEvent)((e)=>{ if (onInteractOutside) onInteractOutside(e); }); (0, $ispOf$useEffect)(()=>{ let state = stateRef.current; if (isDisabled) return; const element = ref.current; const documentObject = (0, $ispOf$getOwnerDocument)(element); // Use pointer events if available. Otherwise, fall back to mouse and touch events. if (typeof PointerEvent !== 'undefined') { let onPointerUp = (e)=>{ if (state.isPointerDown && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) triggerInteractOutside(e); state.isPointerDown = false; }; // changing these to capture phase fixed combobox documentObject.addEventListener('pointerdown', onPointerDown, true); documentObject.addEventListener('pointerup', onPointerUp, true); return ()=>{ documentObject.removeEventListener('pointerdown', onPointerDown, true); documentObject.removeEventListener('pointerup', onPointerUp, true); }; } else { let onMouseUp = (e)=>{ if (state.ignoreEmulatedMouseEvents) state.ignoreEmulatedMouseEvents = false; else if (state.isPointerDown && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) triggerInteractOutside(e); state.isPointerDown = false; }; let onTouchEnd = (e)=>{ state.ignoreEmulatedMouseEvents = true; if (state.isPointerDown && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) triggerInteractOutside(e); state.isPointerDown = false; }; documentObject.addEventListener('mousedown', onPointerDown, true); documentObject.addEventListener('mouseup', onMouseUp, true); documentObject.addEventListener('touchstart', onPointerDown, true); documentObject.addEventListener('touchend', onTouchEnd, true); return ()=>{ documentObject.removeEventListener('mousedown', onPointerDown, true); documentObject.removeEventListener('mouseup', onMouseUp, true); documentObject.removeEventListener('touchstart', onPointerDown, true); documentObject.removeEventListener('touchend', onTouchEnd, true); }; } }, [ ref, isDisabled, onPointerDown, triggerInteractOutside ]); } function $e0b6e0b68ec7f50f$var$isValidEvent(event, ref) { if (event.button > 0) return false; if (event.target) { // if the event target is no longer in the document, ignore const ownerDocument = event.target.ownerDocument; if (!ownerDocument || !ownerDocument.documentElement.contains(event.target)) return false; // If the target is within a top layer element (e.g. toasts), ignore. if (event.target.closest('[data-react-aria-top-layer]')) return false; } return ref.current && !ref.current.contains(event.target); } export {$e0b6e0b68ec7f50f$export$872b660ac5a1ff98 as useInteractOutside}; //# sourceMappingURL=useInteractOutside.module.js.map