@react-aria/interactions 3.22.4 → 3.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/usePress.ts CHANGED
@@ -433,7 +433,13 @@ export function usePress(props: PressHookProps): PressResult {
433
433
 
434
434
  shouldStopPropagation = triggerPressStart(e, state.pointerType);
435
435
 
436
- addGlobalListener(getOwnerDocument(e.currentTarget), 'pointermove', onPointerMove, false);
436
+ // Release pointer capture so that touch interactions can leave the original target.
437
+ // This enables onPointerLeave and onPointerEnter to fire.
438
+ let target = e.target as Element;
439
+ if ('releasePointerCapture' in target) {
440
+ target.releasePointerCapture(e.pointerId);
441
+ }
442
+
437
443
  addGlobalListener(getOwnerDocument(e.currentTarget), 'pointerup', onPointerUp, false);
438
444
  addGlobalListener(getOwnerDocument(e.currentTarget), 'pointercancel', onPointerCancel, false);
439
445
  }
@@ -467,27 +473,20 @@ export function usePress(props: PressHookProps): PressResult {
467
473
  }
468
474
 
469
475
  // Only handle left clicks
470
- // Safari on iOS sometimes fires pointerup events, even
471
- // when the touch isn't over the target, so double check.
472
- if (e.button === 0 && isOverTarget(e, e.currentTarget)) {
476
+ if (e.button === 0) {
473
477
  triggerPressUp(e, state.pointerType || e.pointerType);
474
478
  }
475
479
  };
476
480
 
477
- // Safari on iOS < 13.2 does not implement pointerenter/pointerleave events correctly.
478
- // Use pointer move events instead to implement our own hit testing.
479
- // See https://bugs.webkit.org/show_bug.cgi?id=199803
480
- let onPointerMove = (e: PointerEvent) => {
481
- if (e.pointerId !== state.activePointerId) {
482
- return;
481
+ pressProps.onPointerEnter = (e) => {
482
+ if (e.pointerId === state.activePointerId && state.target && !state.isOverTarget && state.pointerType != null) {
483
+ state.isOverTarget = true;
484
+ triggerPressStart(createEvent(state.target, e), state.pointerType);
483
485
  }
486
+ };
484
487
 
485
- if (state.target && isOverTarget(e, state.target)) {
486
- if (!state.isOverTarget && state.pointerType != null) {
487
- state.isOverTarget = true;
488
- triggerPressStart(createEvent(state.target, e), state.pointerType);
489
- }
490
- } else if (state.target && state.isOverTarget && state.pointerType != null) {
488
+ pressProps.onPointerLeave = (e) => {
489
+ if (e.pointerId === state.activePointerId && state.target && state.isOverTarget && state.pointerType != null) {
491
490
  state.isOverTarget = false;
492
491
  triggerPressEnd(createEvent(state.target, e), state.pointerType, false);
493
492
  cancelOnPointerExit(e);
@@ -496,7 +495,7 @@ export function usePress(props: PressHookProps): PressResult {
496
495
 
497
496
  let onPointerUp = (e: PointerEvent) => {
498
497
  if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0 && state.target) {
499
- if (isOverTarget(e, state.target) && state.pointerType != null) {
498
+ if (state.target.contains(e.target as Element) && state.pointerType != null) {
500
499
  triggerPressEnd(createEvent(state.target, e), state.pointerType);
501
500
  } else if (state.isOverTarget && state.pointerType != null) {
502
501
  triggerPressEnd(createEvent(state.target, e), state.pointerType, false);
@@ -787,7 +786,7 @@ export function usePress(props: PressHookProps): PressResult {
787
786
  ]);
788
787
 
789
788
  // Remove user-select: none in case component unmounts immediately after pressStart
790
- // eslint-disable-next-line arrow-body-style
789
+
791
790
  useEffect(() => {
792
791
  return () => {
793
792
  if (!allowTextSelectionOnPress) {
package/src/utils.ts CHANGED
@@ -68,7 +68,7 @@ export function useSyntheticBlurEvent<Target = Element>(onBlur: (e: ReactFocusEv
68
68
  });
69
69
 
70
70
  // Clean up MutationObserver on unmount. See below.
71
- // eslint-disable-next-line arrow-body-style
71
+
72
72
  useLayoutEffect(() => {
73
73
  const state = stateRef.current;
74
74
  return () => {