36 lines
1.4 KiB
JavaScript
36 lines
1.4 KiB
JavaScript
import * as React from 'react';
|
|
import { createVirtualElementFromClick } from './createVirtualElementFromClick';
|
|
/**
|
|
* @internal
|
|
* A state hook that manages a popper virtual element from mouseevents.
|
|
* Useful for scenarios where a component needs to be positioned by mouse click (e.g. contextmenu)
|
|
* React synthetic events are not persisted by this hook
|
|
*
|
|
* @param initialState - initializes a user provided state similare to useState
|
|
* @returns state and dispatcher for a Popper virtual element that uses native/synthetic mouse events
|
|
*/ export const usePositioningMouseTarget = (initialState)=>{
|
|
const [virtualElement, setVirtualElement] = React.useState(initialState);
|
|
const setVirtualMouseTarget = (event)=>{
|
|
if (event === undefined || event === null) {
|
|
setVirtualElement(undefined);
|
|
return;
|
|
}
|
|
let mouseevent;
|
|
if (!(event instanceof MouseEvent)) {
|
|
mouseevent = event.nativeEvent;
|
|
} else {
|
|
mouseevent = event;
|
|
}
|
|
if (!(mouseevent instanceof MouseEvent) && process.env.NODE_ENV !== 'production') {
|
|
// eslint-disable-next-line no-console
|
|
console.error('usePositioningMouseTarget should only be used with MouseEvent');
|
|
}
|
|
const contextTarget = createVirtualElementFromClick(mouseevent);
|
|
setVirtualElement(contextTarget);
|
|
};
|
|
return [
|
|
virtualElement,
|
|
setVirtualMouseTarget
|
|
];
|
|
};
|