mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
c24c8a039c
Summary: By depending on react-native, these files can't be flow strict until index.js is flow strict. By depending on the internals directly they can be flow strict as soon as their dependents are flow strict. Changelog: [Internal] Refactoring some core file imports to depend on internals directly Reviewed By: zackargyle Differential Revision: D18828324 fbshipit-source-id: 2a347c4e234a64edbb3e6f0ef6387ef1ce78badc
59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
/**
|
|
* 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;
|
|
}
|