@clayui/shared
Version:
ClayShared component
76 lines (74 loc) • 2.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useHover = useHover;
var _react = require("react");
/**
* SPDX-FileCopyrightText: © 2022 Liferay, Inc. <https://liferay.com>
* SPDX-License-Identifier: BSD-3-Clause
*/
// Handles pointer hover interactions for an element.
// Adapted from https://github.com/adobe/react-spectrum/blob/0182ad0748bcdddf7eb010540c453f9a35a7c753/packages/%40react-aria/interactions/src/useHover.ts
function useHover(_ref) {
let {
disabled,
onHover
} = _ref;
const state = (0, _react.useRef)({
isEmulatedMouseEvents: false,
isHovered: false,
pointerType: undefined,
target: null
}).current;
return (0, _react.useMemo)(() => {
const props = {};
const onStart = (event, pointerType) => {
if (disabled || pointerType === 'touch' || state.isHovered || !event.currentTarget.contains(event.target)) {
return;
}
state.isHovered = true;
const target = event.currentTarget;
state.target = target;
onHover({
pointerType,
target,
type: 'hoverstart'
});
};
const onEnd = pointerType => {
state.pointerType = undefined;
state.target = null;
if (pointerType === 'touch' || !state.isHovered) {
return;
}
state.isHovered = false;
};
if (typeof PointerEvent !== 'undefined') {
props.onPointerEnter = event => {
onStart(event, event.pointerType);
};
props.onPointerLeave = event => {
if (!disabled && event.currentTarget.contains(event.target)) {
onEnd(event.pointerType);
}
};
} else {
props.onTouchStart = () => {
state.isEmulatedMouseEvents = true;
};
props.onMouseEnter = event => {
if (!state.isEmulatedMouseEvents) {
onStart(event, 'mouse');
}
state.isEmulatedMouseEvents = false;
};
props.onMouseLeave = event => {
if (!disabled && event.currentTarget.contains(event.target)) {
onEnd('mouse');
}
};
}
return props;
}, [onHover]);
}