Skip to content

Commit 9f11ca1

Browse files
committed
simplify and add special cases
1 parent d03d579 commit 9f11ca1

10 files changed

Lines changed: 54 additions & 44 deletions

File tree

packages/@react-aria/dnd/src/DragManager.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -257,25 +257,26 @@ class DragSession {
257257

258258
onFocus(e: FocusEvent): void {
259259
let activateButton = this.getCurrentActivateButton();
260-
if (getEventTarget(e) === activateButton) {
260+
let eventTarget = getEventTarget(e);
261+
if (eventTarget === activateButton) {
261262
// TODO: canceling this breaks the focus ring. Revisit when we support tabbing.
262263
this.cancelEvent(e);
263264
return;
264265
}
265266

266267
// Prevent focus events, except to the original drag target.
267-
if (getEventTarget(e) !== this.dragTarget.element) {
268+
if (eventTarget !== this.dragTarget.element) {
268269
this.cancelEvent(e);
269270
}
270271

271272
// Ignore focus events on the window/document (JSDOM). Will be handled in onBlur, below.
272-
if (!(getEventTarget(e) instanceof HTMLElement) || getEventTarget(e) === this.dragTarget.element) {
273+
if (!(eventTarget instanceof HTMLElement) || eventTarget === this.dragTarget.element) {
273274
return;
274275
}
275276

276277
let dropTarget =
277-
this.validDropTargets.find(target => target.element === getEventTarget(e) as HTMLElement) ||
278-
this.validDropTargets.find(target => nodeContains(target.element, getEventTarget(e) as HTMLElement));
278+
this.validDropTargets.find(target => target.element === eventTarget) ||
279+
this.validDropTargets.find(target => nodeContains(target.element, eventTarget));
279280

280281
if (!dropTarget) {
281282
// if (e.target === activateButton) {
@@ -289,7 +290,7 @@ class DragSession {
289290
return;
290291
}
291292

292-
let item = dropItems.get(getEventTarget(e) as HTMLElement);
293+
let item = dropItems.get(eventTarget);
293294
if (dropTarget) {
294295
this.setCurrentDropTarget(dropTarget, item);
295296
}
@@ -321,10 +322,11 @@ class DragSession {
321322
this.cancelEvent(e);
322323
if (isVirtualClick(e) || this.isVirtualClick) {
323324
let dropElements = dropItems.values();
324-
let item = [...dropElements].find(item => item.element === getEventTarget(e) as HTMLElement || nodeContains(item.activateButtonRef?.current, getEventTarget(e) as HTMLElement));
325-
let dropTarget = this.validDropTargets.find(target => nodeContains(target.element, getEventTarget(e) as HTMLElement));
325+
let eventTarget = getEventTarget(e) as HTMLElement;
326+
let item = [...dropElements].find(item => item.element === eventTarget || nodeContains(item.activateButtonRef?.current, eventTarget));
327+
let dropTarget = this.validDropTargets.find(target => nodeContains(target.element, eventTarget));
326328
let activateButton = item?.activateButtonRef?.current ?? dropTarget?.activateButtonRef?.current;
327-
if (nodeContains(activateButton, getEventTarget(e) as HTMLElement) && dropTarget) {
329+
if (nodeContains(activateButton, eventTarget) && dropTarget) {
328330
this.activate(dropTarget, item);
329331
return;
330332
}
@@ -350,7 +352,8 @@ class DragSession {
350352

351353
cancelEvent(e: Event): void {
352354
// Allow focusin and focusout on the drag target so focus ring works properly.
353-
if ((e.type === 'focusin' || e.type === 'focusout') && (getEventTarget(e) === this.dragTarget?.element || getEventTarget(e) === this.getCurrentActivateButton())) {
355+
let eventTarget = getEventTarget(e);
356+
if ((e.type === 'focusin' || e.type === 'focusout') && (eventTarget === this.dragTarget?.element || eventTarget === this.getCurrentActivateButton())) {
354357
return;
355358
}
356359

packages/@react-aria/dnd/src/useDrag.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import {DragEndEvent, DragItem, DragMoveEvent, DragPreviewRenderer, DragStartEve
1515
import {DragEvent, HTMLAttributes, version as ReactVersion, useEffect, useRef, useState} from 'react';
1616
import * as DragManager from './DragManager';
1717
import {DROP_EFFECT_TO_DROP_OPERATION, DROP_OPERATION, EFFECT_ALLOWED} from './constants';
18+
import {getEventTarget, isVirtualClick, isVirtualPointerEvent, useDescription, useGlobalListeners} from '@react-aria/utils';
1819
import {globalDropEffect, setGlobalAllowedDropOperations, setGlobalDropEffect, useDragModality, writeToDataTransfer} from './utils';
1920
// @ts-ignore
2021
import intlMessages from '../intl/*.json';
21-
import {isVirtualClick, isVirtualPointerEvent, useDescription, useGlobalListeners} from '@react-aria/utils';
2222
import {useLocalizedStringFormatter} from '@react-aria/i18n';
2323

2424
export interface DragOptions {
@@ -102,7 +102,7 @@ export function useDrag(options: DragOptions): DragResult {
102102
// If this drag was initiated by a mobile screen reader (e.g. VoiceOver or TalkBack), enter virtual dragging mode.
103103
if (modalityOnPointerDown.current === 'virtual') {
104104
e.preventDefault();
105-
startDragging(e.target as HTMLElement);
105+
startDragging(getEventTarget(e) as HTMLElement);
106106
modalityOnPointerDown.current = null;
107107
return;
108108
}
@@ -188,9 +188,9 @@ export function useDrag(options: DragOptions): DragResult {
188188

189189
// Wait a frame before we set dragging to true so that the browser has time to
190190
// render the preview image before we update the element that has been dragged.
191-
let target = e.target;
191+
let target = getEventTarget(e);
192192
requestAnimationFrame(() => {
193-
setDragging(target as Element);
193+
setDragging(target);
194194
});
195195
};
196196

@@ -340,24 +340,24 @@ export function useDrag(options: DragOptions): DragResult {
340340
}
341341
},
342342
onKeyDownCapture(e) {
343-
if (e.target === e.currentTarget && e.key === 'Enter') {
343+
if (getEventTarget(e) === e.currentTarget && e.key === 'Enter') {
344344
e.preventDefault();
345345
e.stopPropagation();
346346
}
347347
},
348348
onKeyUpCapture(e) {
349-
if (e.target === e.currentTarget && e.key === 'Enter') {
349+
if (getEventTarget(e) === e.currentTarget && e.key === 'Enter') {
350350
e.preventDefault();
351351
e.stopPropagation();
352-
startDragging(e.target as HTMLElement);
352+
startDragging(getEventTarget(e));
353353
}
354354
},
355355
onClick(e) {
356356
// Handle NVDA/JAWS in browse mode, and touch screen readers. In this case, no keyboard events are fired.
357357
if (isVirtualClick(e.nativeEvent) || modalityOnPointerDown.current === 'virtual') {
358358
e.preventDefault();
359359
e.stopPropagation();
360-
startDragging(e.target as HTMLElement);
360+
startDragging(getEventTarget(e));
361361
}
362362
}
363363
};

packages/@react-aria/dnd/src/useDrop.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {DragEvent, useRef, useState} from 'react';
1616
import * as DragManager from './DragManager';
1717
import {DragTypes, globalAllowedDropOperations, globalDndState, readFromDataTransfer, setGlobalDnDState, setGlobalDropEffect} from './utils';
1818
import {DROP_EFFECT_TO_DROP_OPERATION, DROP_OPERATION, DROP_OPERATION_ALLOWED, DROP_OPERATION_TO_DROP_EFFECT} from './constants';
19-
import {isIPad, isMac, nodeContains, useEffectEvent, useLayoutEffect} from '@react-aria/utils';
19+
import {getEventTarget, isIPad, isMac, nodeContains, useEffectEvent, useLayoutEffect} from '@react-aria/utils';
2020
import {useVirtualDrop} from './useVirtualDrop';
2121

2222
export interface DropOptions {
@@ -186,7 +186,7 @@ export function useDrop(options: DropOptions): DropResult {
186186
let onDragEnter = (e: DragEvent) => {
187187
e.preventDefault();
188188
e.stopPropagation();
189-
state.dragOverElements.add(e.target as Element);
189+
state.dragOverElements.add(getEventTarget(e));
190190
if (state.dragOverElements.size > 1) {
191191
return;
192192
}
@@ -232,7 +232,7 @@ export function useDrop(options: DropOptions): DropResult {
232232
// events will never be fired for these. This can happen, for example, with drop
233233
// indicators between items, which disappear when the drop target changes.
234234

235-
state.dragOverElements.delete(e.target as Element);
235+
state.dragOverElements.delete(getEventTarget(e));
236236
for (let element of state.dragOverElements) {
237237
if (!nodeContains(e.currentTarget, element)) {
238238
state.dragOverElements.delete(element);

packages/@react-aria/interactions/src/useFocus.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ export function useFocus<Target extends FocusableElement = FocusableElement>(pro
6363
// Double check that document.activeElement actually matches e.target in case a previously chained
6464
// focus handler already moved focus somewhere else.
6565

66-
const ownerDocument = getOwnerDocument(getEventTarget(e));
66+
let eventTarget = getEventTarget(e);
67+
const ownerDocument = getOwnerDocument(eventTarget);
6768
const activeElement = ownerDocument ? getActiveElement(ownerDocument) : getActiveElement();
68-
if (getEventTarget(e) === e.currentTarget && activeElement === getEventTarget(e)) {
69+
if (eventTarget === e.currentTarget && eventTarget === activeElement) {
6970
if (onFocusProp) {
7071
onFocusProp(e);
7172
}

packages/@react-aria/interactions/src/useFocusVisible.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,11 @@ const nonTextInputTypes = new Set([
303303
*/
304304
function isKeyboardFocusEvent(isTextInput: boolean, modality: Modality, e: HandlerEvent) {
305305
let document = getOwnerDocument(e ? getEventTarget(e) as Element : undefined);
306-
const IHTMLInputElement = typeof window !== 'undefined' ? getOwnerWindow(e ? getEventTarget(e) as Element : undefined).HTMLInputElement : HTMLInputElement;
307-
const IHTMLTextAreaElement = typeof window !== 'undefined' ? getOwnerWindow(e ? getEventTarget(e) as Element : undefined).HTMLTextAreaElement : HTMLTextAreaElement;
308-
const IHTMLElement = typeof window !== 'undefined' ? getOwnerWindow(e ? getEventTarget(e) as Element : undefined).HTMLElement : HTMLElement;
309-
const IKeyboardEvent = typeof window !== 'undefined' ? getOwnerWindow(e ? getEventTarget(e) as Element : undefined).KeyboardEvent : KeyboardEvent;
306+
let eventTarget = e ? getEventTarget(e) as Element : undefined;
307+
const IHTMLInputElement = typeof window !== 'undefined' ? getOwnerWindow(eventTarget).HTMLInputElement : HTMLInputElement;
308+
const IHTMLTextAreaElement = typeof window !== 'undefined' ? getOwnerWindow(eventTarget).HTMLTextAreaElement : HTMLTextAreaElement;
309+
const IHTMLElement = typeof window !== 'undefined' ? getOwnerWindow(eventTarget).HTMLElement : HTMLElement;
310+
const IKeyboardEvent = typeof window !== 'undefined' ? getOwnerWindow(eventTarget).KeyboardEvent : KeyboardEvent;
310311

311312
// For keyboard events that occur on a non-input element that will move focus into input element (aka ArrowLeft going from Datepicker button to the main input group)
312313
// we need to rely on the user passing isTextInput into here. This way we can skip toggling focus visiblity for said input element

packages/@react-aria/interactions/src/useFocusWithin.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,10 @@ export function useFocusWithin(props: FocusWithinProps): FocusWithinResult {
8484

8585
// Double check that document.activeElement actually matches e.target in case a previously chained
8686
// focus handler already moved focus somewhere else.
87-
const ownerDocument = getOwnerDocument(getEventTarget(e));
87+
let eventTarget = getEventTarget(e);
88+
const ownerDocument = getOwnerDocument(eventTarget);
8889
const activeElement = getActiveElement(ownerDocument);
89-
if (!state.current.isFocusWithin && activeElement === getEventTarget(e)) {
90+
if (!state.current.isFocusWithin && activeElement === eventTarget) {
9091
if (onFocusWithin) {
9192
onFocusWithin(e);
9293
}
@@ -103,8 +104,9 @@ export function useFocusWithin(props: FocusWithinProps): FocusWithinResult {
103104
// can manually fire onBlur.
104105
let currentTarget = e.currentTarget;
105106
addGlobalListener(ownerDocument, 'focus', e => {
106-
if (state.current.isFocusWithin && !nodeContains(currentTarget, getEventTarget(e) as Element)) {
107-
let nativeEvent = new ownerDocument.defaultView!.FocusEvent('blur', {relatedTarget: getEventTarget(e)});
107+
let eventTarget = getEventTarget(e);
108+
if (state.current.isFocusWithin && !nodeContains(currentTarget, eventTarget as Element)) {
109+
let nativeEvent = new ownerDocument.defaultView!.FocusEvent('blur', {relatedTarget: eventTarget});
108110
setEventTarget(nativeEvent, currentTarget);
109111
let event = createSyntheticEvent<FocusEvent>(nativeEvent);
110112
onBlur(event);

packages/@react-aria/overlays/src/useCloseOnScroll.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export function useCloseOnScroll(opts: CloseOnScrollOptions): void {
4747
// Ignore scroll events on any input or textarea as the cursor position can cause it to scroll
4848
// such as in a combobox. Clicking the dropdown button places focus on the input, and if the
4949
// text inside the input extends beyond the 'end', then it will scroll so the cursor is visible at the end.
50-
if (getEventTarget(e) instanceof HTMLInputElement || getEventTarget(e) instanceof HTMLTextAreaElement) {
50+
if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {
5151
return;
5252
}
5353

packages/@react-aria/select/src/HiddenSelect.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,10 @@ export function useHiddenSelect<T, M extends SelectionMode = 'single'>(props: Ar
9292

9393
let setValue = state.setValue;
9494
let onChange = useCallback((e: React.ChangeEvent<HTMLSelectElement>) => {
95-
if (getEventTarget(e).multiple) {
95+
let eventTarget = getEventTarget(e);
96+
if (eventTarget.multiple) {
9697
setValue(Array.from(
97-
getEventTarget(e).selectedOptions,
98+
eventTarget.selectedOptions,
9899
(option) => option.value
99100
) as any);
100101
} else {

packages/@react-aria/utils/src/runAfterTransition.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,20 @@ function setupGlobalEvents() {
3232
}
3333

3434
let onTransitionStart = (e: Event) => {
35-
if (!isTransitionEvent(e) || !getEventTarget(e)) {
35+
let eventTarget = getEventTarget(e);
36+
if (!isTransitionEvent(e) || !eventTarget) {
3637
return;
3738
}
3839
// Add the transitioning property to the list for this element.
39-
let transitions = transitionsByElement.get(getEventTarget(e));
40+
let transitions = transitionsByElement.get(eventTarget);
4041
if (!transitions) {
4142
transitions = new Set();
42-
transitionsByElement.set(getEventTarget(e), transitions);
43+
transitionsByElement.set(eventTarget, transitions);
4344

4445
// The transitioncancel event must be registered on the element itself, rather than as a global
4546
// event. This enables us to handle when the node is deleted from the document while it is transitioning.
4647
// In that case, the cancel event would have nowhere to bubble to so we need to handle it directly.
47-
getEventTarget(e).addEventListener('transitioncancel', onTransitionEnd, {
48+
eventTarget.addEventListener('transitioncancel', onTransitionEnd, {
4849
once: true
4950
});
5051
}
@@ -53,11 +54,12 @@ function setupGlobalEvents() {
5354
};
5455

5556
let onTransitionEnd = (e: Event) => {
56-
if (!isTransitionEvent(e) || !getEventTarget(e)) {
57+
let eventTarget = getEventTarget(e);
58+
if (!isTransitionEvent(e) || !eventTarget) {
5759
return;
5860
}
5961
// Remove property from list of transitioning properties.
60-
let properties = transitionsByElement.get(getEventTarget(e));
62+
let properties = transitionsByElement.get(eventTarget);
6163
if (!properties) {
6264
return;
6365
}
@@ -66,8 +68,8 @@ function setupGlobalEvents() {
6668

6769
// If empty, remove transitioncancel event, and remove the element from the list of transitioning elements.
6870
if (properties.size === 0) {
69-
getEventTarget(e).removeEventListener('transitioncancel', onTransitionEnd);
70-
transitionsByElement.delete(getEventTarget(e));
71+
eventTarget.removeEventListener('transitioncancel', onTransitionEnd);
72+
transitionsByElement.delete(eventTarget);
7173
}
7274

7375
// If no transitioning elements, call all of the queued callbacks.

packages/@react-aria/utils/src/useDrag1D.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
/* eslint-disable rulesdir/pure-render */
1414

15+
import {getEventTarget, nodeContains} from './shadowdom/DOMFunctions';
1516
import {getOffset} from './getOffset';
16-
import {nodeContains} from './shadowdom/DOMFunctions';
1717
import {Orientation} from '@react-types/shared';
1818
import React, {HTMLAttributes, MutableRefObject, useRef} from 'react';
1919

@@ -81,7 +81,7 @@ export function useDrag1D(props: UseDrag1DProps): HTMLAttributes<HTMLElement> {
8181
};
8282

8383
let onMouseUp = (e: MouseEvent) => {
84-
const target = e.target as HTMLElement;
84+
let target = getEventTarget(e) as HTMLElement;
8585
dragging.current = false;
8686
let nextOffset = getNextOffset(e);
8787
if (handlers.current.onDrag) {

0 commit comments

Comments
 (0)