12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- * @flow strict-local
- * @format
- */
- 'use strict';
- import Platform from '../Utilities/Platform';
- let isEnabled = false;
- if (Platform.OS === 'web') {
- const canUseDOM = Boolean(
- typeof window !== 'undefined' &&
- window.document &&
- window.document.createElement,
- );
- if (canUseDOM) {
- /**
- * Web browsers emulate mouse events (and hover states) after touch events.
- * This code infers when the currently-in-use modality supports hover
- * (including for multi-modality devices) and considers "hover" to be enabled
- * if a mouse movement occurs more than 1 second after the last touch event.
- * This threshold is long enough to account for longer delays between the
- * browser firing touch and mouse events on low-powered devices.
- */
- const HOVER_THRESHOLD_MS = 1000;
- let lastTouchTimestamp = 0;
- const enableHover = () => {
- if (isEnabled || Date.now() - lastTouchTimestamp < HOVER_THRESHOLD_MS) {
- return;
- }
- isEnabled = true;
- };
- const disableHover = () => {
- lastTouchTimestamp = Date.now();
- if (isEnabled) {
- isEnabled = false;
- }
- };
- document.addEventListener('touchstart', disableHover, true);
- document.addEventListener('touchmove', disableHover, true);
- document.addEventListener('mousemove', enableHover, true);
- }
- }
- export function isHoverEnabled(): boolean {
- return isEnabled;
- }
|