Skip to content

Commit 4c56984

Browse files
authored
[react-interactions] Remove context.setTimeout & context.clearTimeout (#17000)
1 parent b33633d commit 4c56984

File tree

7 files changed

+4
-267
lines changed

7 files changed

+4
-267
lines changed

packages/react-dom/src/events/DOMEventResponderSystem.js

Lines changed: 1 addition & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,6 @@ export function setListenToResponderEventTypes(
5656
listenToResponderEventTypesImpl = _listenToResponderEventTypesImpl;
5757
}
5858

59-
type ResponderTimeout = {|
60-
id: TimeoutID,
61-
timers: Map<number, ResponderTimer>,
62-
|};
63-
64-
type ResponderTimer = {|
65-
instance: ReactDOMEventResponderInstance,
66-
func: () => void,
67-
id: number,
68-
timeStamp: number,
69-
|};
70-
71-
const activeTimeouts: Map<number, ResponderTimeout> = new Map();
7259
const rootEventTypesToEventResponderInstances: Map<
7360
DOMTopLevelEventType | string,
7461
Set<ReactDOMEventResponderInstance>,
@@ -80,9 +67,7 @@ const DoNotPropagateToNextResponder = 0;
8067
const PropagateToNextResponder = 1;
8168

8269
let currentTimeStamp = 0;
83-
let currentTimers = new Map();
8470
let currentInstance: null | ReactDOMEventResponderInstance = null;
85-
let currentTimerIDCounter = 0;
8671
let currentDocument: null | Document = null;
8772
let currentPropagationBehavior: PropagationBehavior = DoNotPropagateToNextResponder;
8873

@@ -202,46 +187,6 @@ const eventResponderContext: ReactDOMResponderContext = {
202187
}
203188
}
204189
},
205-
setTimeout(func: () => void, delay): number {
206-
validateResponderContext();
207-
if (currentTimers === null) {
208-
currentTimers = new Map();
209-
}
210-
let timeout = currentTimers.get(delay);
211-
212-
const timerId = currentTimerIDCounter++;
213-
if (timeout === undefined) {
214-
const timers = new Map();
215-
const id = setTimeout(() => {
216-
processTimers(timers, delay);
217-
}, delay);
218-
timeout = {
219-
id,
220-
timers,
221-
};
222-
currentTimers.set(delay, timeout);
223-
}
224-
timeout.timers.set(timerId, {
225-
instance: ((currentInstance: any): ReactDOMEventResponderInstance),
226-
func,
227-
id: timerId,
228-
timeStamp: currentTimeStamp,
229-
});
230-
activeTimeouts.set(timerId, timeout);
231-
return timerId;
232-
},
233-
clearTimeout(timerId: number): void {
234-
validateResponderContext();
235-
const timeout = activeTimeouts.get(timerId);
236-
237-
if (timeout !== undefined) {
238-
const timers = timeout.timers;
239-
timers.delete(timerId);
240-
if (timers.size === 0) {
241-
clearTimeout(timeout.id);
242-
}
243-
}
244-
},
245190
getActiveDocument,
246191
objectAssign: Object.assign,
247192
getTimeStamp(): number {
@@ -340,33 +285,6 @@ function getActiveDocument(): Document {
340285
return ((currentDocument: any): Document);
341286
}
342287

343-
function processTimers(
344-
timers: Map<number, ResponderTimer>,
345-
delay: number,
346-
): void {
347-
const timersArr = Array.from(timers.values());
348-
const previousInstance = currentInstance;
349-
const previousTimers = currentTimers;
350-
try {
351-
batchedEventUpdates(() => {
352-
for (let i = 0; i < timersArr.length; i++) {
353-
const {instance, func, id, timeStamp} = timersArr[i];
354-
currentInstance = instance;
355-
currentTimeStamp = timeStamp + delay;
356-
try {
357-
func();
358-
} finally {
359-
activeTimeouts.delete(id);
360-
}
361-
}
362-
});
363-
} finally {
364-
currentTimers = previousTimers;
365-
currentInstance = previousInstance;
366-
currentTimeStamp = 0;
367-
}
368-
}
369-
370288
function createDOMResponderEvent(
371289
topLevelType: string,
372290
nativeEvent: AnyNativeEvent,
@@ -510,15 +428,13 @@ export function mountEventResponder(
510428
const onMount = responder.onMount;
511429
if (onMount !== null) {
512430
const previousInstance = currentInstance;
513-
const previousTimers = currentTimers;
514431
currentInstance = responderInstance;
515432
try {
516433
batchedEventUpdates(() => {
517434
onMount(eventResponderContext, props, state);
518435
});
519436
} finally {
520437
currentInstance = previousInstance;
521-
currentTimers = previousTimers;
522438
}
523439
}
524440
}
@@ -531,15 +447,13 @@ export function unmountEventResponder(
531447
if (onUnmount !== null) {
532448
let {props, state} = responderInstance;
533449
const previousInstance = currentInstance;
534-
const previousTimers = currentTimers;
535450
currentInstance = responderInstance;
536451
try {
537452
batchedEventUpdates(() => {
538453
onUnmount(eventResponderContext, props, state);
539454
});
540455
} finally {
541456
currentInstance = previousInstance;
542-
currentTimers = previousTimers;
543457
}
544458
}
545459
const rootEventTypesSet = responderInstance.rootEventTypes;
@@ -561,8 +475,7 @@ export function unmountEventResponder(
561475
function validateResponderContext(): void {
562476
invariant(
563477
currentInstance !== null,
564-
'An event responder context was used outside of an event cycle. ' +
565-
'Use context.setTimeout() to use asynchronous responder context outside of event cycle .',
478+
'An event responder context was used outside of an event cycle.',
566479
);
567480
}
568481

@@ -575,12 +488,10 @@ export function dispatchEventForResponderEventSystem(
575488
): void {
576489
if (enableFlareAPI) {
577490
const previousInstance = currentInstance;
578-
const previousTimers = currentTimers;
579491
const previousTimeStamp = currentTimeStamp;
580492
const previousDocument = currentDocument;
581493
const previousPropagationBehavior = currentPropagationBehavior;
582494
currentPropagationBehavior = DoNotPropagateToNextResponder;
583-
currentTimers = null;
584495
// nodeType 9 is DOCUMENT_NODE
585496
currentDocument =
586497
(nativeEventTarget: any).nodeType === 9
@@ -599,7 +510,6 @@ export function dispatchEventForResponderEventSystem(
599510
);
600511
});
601512
} finally {
602-
currentTimers = previousTimers;
603513
currentInstance = previousInstance;
604514
currentTimeStamp = previousTimeStamp;
605515
currentDocument = previousDocument;

packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -469,81 +469,6 @@ describe('DOMEventResponderSystem', () => {
469469
expect(eventLog).toEqual(['magic event fired', 'magicclick', 'bubble']);
470470
});
471471

472-
it('async event dispatching works', () => {
473-
let eventLog = [];
474-
const buttonRef = React.createRef();
475-
476-
function handleEvent(event, context, props, phase) {
477-
const pressEvent = {
478-
target: event.target,
479-
type: 'press',
480-
phase,
481-
timeStamp: context.getTimeStamp(),
482-
};
483-
context.dispatchEvent(pressEvent, props.onPress, DiscreteEvent);
484-
485-
context.setTimeout(() => {
486-
const longPressEvent = {
487-
target: event.target,
488-
type: 'longpress',
489-
phase,
490-
timeStamp: context.getTimeStamp(),
491-
};
492-
context.dispatchEvent(longPressEvent, props.onLongPress, DiscreteEvent);
493-
494-
const longPressChangeEvent = {
495-
target: event.target,
496-
type: 'longpresschange',
497-
phase,
498-
timeStamp: context.getTimeStamp(),
499-
};
500-
context.dispatchEvent(
501-
longPressChangeEvent,
502-
props.onLongPressChange,
503-
DiscreteEvent,
504-
);
505-
}, 500);
506-
}
507-
508-
const TestResponder = createEventResponder({
509-
targetEventTypes: ['click'],
510-
onEvent: (event, context, props) => {
511-
handleEvent(event, context, props, 'bubble');
512-
},
513-
});
514-
515-
function log(msg) {
516-
eventLog.push(msg);
517-
}
518-
519-
const Test = () => {
520-
const listener = React.unstable_useResponder(TestResponder, {
521-
onPress: e => log('press ' + e.phase),
522-
onLongPress: e => log('longpress ' + e.phase),
523-
onLongPressChange: e => log('longpresschange ' + e.phase),
524-
});
525-
526-
return (
527-
<button ref={buttonRef} listeners={listener}>
528-
Click me!
529-
</button>
530-
);
531-
};
532-
533-
ReactDOM.render(<Test />, container);
534-
535-
// Clicking the button should trigger the event responder onEvent()
536-
let buttonElement = buttonRef.current;
537-
dispatchClickEvent(buttonElement);
538-
jest.runAllTimers();
539-
540-
expect(eventLog).toEqual([
541-
'press bubble',
542-
'longpress bubble',
543-
'longpresschange bubble',
544-
]);
545-
});
546-
547472
it('the event responder onMount() function should fire', () => {
548473
let onMountFired = 0;
549474

packages/react-interactions/events/README.md

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ Defines the DOM events to listen to on the root of the app.
6767

6868
Defines the DOM events to listen to within the Event Responder subtree.
6969

70-
7170
## ResponderContext
7271

7372
The Event Responder Context is exposed via the `context` argument for certain methods
@@ -78,10 +77,6 @@ on the `EventResponder` object.
7877
This can be used to dynamically listen to events on the root of the app only
7978
when it is necessary to do so.
8079

81-
### clearTimeout(id: Symbol): void
82-
83-
Clear a timeout defined using `context.setTimeout`.
84-
8580
### dispatchEvent(propName: string, event: CustomEvent, { discrete: boolean })
8681

8782
Dispatches a custom synthetic event. The `type` and `target` are required
@@ -109,7 +104,3 @@ is within the scope of the same responder, but owned by another Event Responder
109104
### removeRootEventTypes(eventTypes: Array<ResponderEventType>)
110105

111106
Remove the root event types added with `addRootEventTypes`.
112-
113-
### setTimeout(func: () => void, delay: number): Symbol
114-
115-
This can be used to dispatch async events, e.g., those that fire after a delay.

0 commit comments

Comments
 (0)