MCPcopy Create free account
hub / github.com/adobe/react-spectrum / useSafeArea

Function useSafeArea

packages/react-aria/src/tooltip/useSafeArea.ts:51–83  ·  view source on GitHub ↗
(options: SafeAreaOptions)

Source from the content-addressed store, hash-verified

49 * for any placement of the overlay relative to the trigger.
50 */
51export function useSafeArea(options: SafeAreaOptions): void {
52 let {triggerRef, overlayRef, isOpen, isDisabled} = options;
53 let onSafeAreaChange = useEffectEvent(options.onSafeAreaChange);
54
55 useEffect(() => {
56 let trigger = triggerRef.current;
57 if (isDisabled || !isOpen || !trigger) {
58 return;
59 }
60
61 let onPointerMove = (e: PointerEvent) => {
62 if (e.pointerType === 'touch') {
63 return;
64 }
65 let point = {x: e.clientX, y: e.clientY};
66 let triggerRect = trigger!.getBoundingClientRect();
67 let overlayRect = overlayRef.current?.getBoundingClientRect();
68 onSafeAreaChange(isPointInSafeArea(point, triggerRect, overlayRect));
69 };
70
71 // If the pointer leaves the document entirely, it is no longer in the safe area.
72 let onPointerLeave = () => onSafeAreaChange(false);
73
74 let win = getOwnerWindow(trigger);
75 let doc = getOwnerDocument(trigger);
76 win.addEventListener('pointermove', onPointerMove);
77 doc.documentElement.addEventListener('pointerleave', onPointerLeave);
78 return () => {
79 win.removeEventListener('pointermove', onPointerMove);
80 doc.documentElement.removeEventListener('pointerleave', onPointerLeave);
81 };
82 }, [isDisabled, isOpen, triggerRef, overlayRef]);
83}
84
85function isPointInSafeArea(point: Point, triggerRect: DOMRect, overlayRect?: DOMRect): boolean {
86 if (rectContains(triggerRect, point)) {

Callers 1

usePreviewTriggerFunction · 0.90

Calls 5

useEffectEventFunction · 0.90
getOwnerWindowFunction · 0.90
getOwnerDocumentFunction · 0.90
addEventListenerMethod · 0.80
removeEventListenerMethod · 0.80

Tested by

no test coverage detected