Skip to content

Commit ff431b7

Browse files
authored
Remove ReactDOM.useEvent and associated types+tests (facebook#18689)
1 parent 7b3934b commit ff431b7

37 files changed

+31
-4152
lines changed

packages/react-art/src/ReactARTHostConfig.js

-16
Original file line numberDiff line numberDiff line change
@@ -493,22 +493,6 @@ export function makeServerId(): OpaqueIDType {
493493
throw new Error('Not yet implemented');
494494
}
495495

496-
export function registerEvent(event: any, rootContainerInstance: any) {
497-
throw new Error('Not yet implemented.');
498-
}
499-
500-
export function mountEventListener(listener: any) {
501-
throw new Error('Not yet implemented.');
502-
}
503-
504-
export function unmountEventListener(listener: any) {
505-
throw new Error('Not yet implemented.');
506-
}
507-
508-
export function validateEventListenerTarget(target: any, listener: any) {
509-
throw new Error('Not yet implemented.');
510-
}
511-
512496
export function beforeActiveInstanceBlur() {
513497
// noop
514498
}

packages/react-debug-tools/src/ReactDebugHooks.js

-20
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import type {
1515
ReactProviderType,
1616
ReactEventResponder,
1717
ReactEventResponderListener,
18-
ReactScopeMethods,
1918
} from 'shared/ReactTypes';
2019
import type {
2120
Fiber,
@@ -48,14 +47,6 @@ type HookLogEntry = {
4847
...
4948
};
5049

51-
type ReactDebugListenerMap = {|
52-
clear: () => void,
53-
setListener: (
54-
target: EventTarget | ReactScopeMethods,
55-
callback: ?(SyntheticEvent<EventTarget>) => void,
56-
) => void,
57-
|};
58-
5950
let hookLog: Array<HookLogEntry> = [];
6051

6152
// Primitives
@@ -311,16 +302,6 @@ function useTransition(
311302
return [callback => {}, false];
312303
}
313304

314-
const noOp = () => {};
315-
316-
function useEvent(event: any): ReactDebugListenerMap {
317-
hookLog.push({primitive: 'Event', stackError: new Error(), value: event});
318-
return {
319-
clear: noOp,
320-
setListener: noOp,
321-
};
322-
}
323-
324305
function useDeferredValue<T>(value: T, config: TimeoutConfig | null | void): T {
325306
// useDeferredValue() composes multiple hooks internally.
326307
// Advance the current hook index the same number of times
@@ -368,7 +349,6 @@ const Dispatcher: DispatcherType = {
368349
useTransition,
369350
useMutableSource,
370351
useDeferredValue,
371-
useEvent,
372352
useOpaqueIdentifier,
373353
};
374354

packages/react-debug-tools/src/__tests__/ReactHooksInspection-test.internal.js

-44
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,14 @@
1111
'use strict';
1212

1313
let React;
14-
let ReactDOM;
1514
let ReactDebugTools;
1615

1716
describe('ReactHooksInspection', () => {
1817
beforeEach(() => {
1918
jest.resetModules();
2019
const ReactFeatureFlags = require('shared/ReactFeatureFlags');
2120
ReactFeatureFlags.enableDeprecatedFlareAPI = true;
22-
ReactFeatureFlags.enableUseEventAPI = true;
2321
React = require('react');
24-
ReactDOM = require('react-dom');
2522
ReactDebugTools = require('react-debug-tools');
2623
});
2724

@@ -46,45 +43,4 @@ describe('ReactHooksInspection', () => {
4643
},
4744
]);
4845
});
49-
50-
// @gate experimental
51-
it('should inspect a simple ReactDOM.useEvent hook', () => {
52-
let clickHandle;
53-
let ref;
54-
55-
const effect = () => {
56-
clickHandle.setListener(ref.current, () => {});
57-
};
58-
59-
function Foo(props) {
60-
ref = React.useRef(null);
61-
clickHandle = ReactDOM.unstable_useEvent('click');
62-
React.useEffect(effect);
63-
return <div ref={ref}>Hello world</div>;
64-
}
65-
const tree = ReactDebugTools.inspectHooks(Foo, {});
66-
expect(tree).toEqual([
67-
{
68-
isStateEditable: false,
69-
id: 0,
70-
name: 'Ref',
71-
subHooks: [],
72-
value: null,
73-
},
74-
{
75-
isStateEditable: false,
76-
id: 1,
77-
name: 'Event',
78-
value: {capture: false, passive: undefined, priority: 0, type: 'click'},
79-
subHooks: [],
80-
},
81-
{
82-
isStateEditable: false,
83-
id: 2,
84-
name: 'Effect',
85-
value: effect,
86-
subHooks: [],
87-
},
88-
]);
89-
});
9046
});

packages/react-dom/index.classic.fb.js

-1
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,4 @@ export {
3636
unstable_scheduleHydration,
3737
unstable_renderSubtreeIntoContainer,
3838
unstable_createPortal,
39-
unstable_useEvent,
4039
} from './src/client/ReactDOM';

packages/react-dom/index.modern.fb.js

-1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,4 @@ export {
1919
unstable_flushDiscreteUpdates,
2020
unstable_flushControlled,
2121
unstable_scheduleHydration,
22-
unstable_useEvent,
2322
} from './src/client/ReactDOM';

packages/react-dom/src/client/ReactDOM.js

-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
unmountComponentAtNode,
2121
} from './ReactDOMLegacy';
2222
import {createRoot, createBlockingRoot, isValidContainer} from './ReactDOMRoot';
23-
import {useEvent} from './ReactDOMUseEvent';
2423

2524
import {
2625
batchedEventUpdates,
@@ -211,8 +210,6 @@ export {
211210
// Temporary alias since we already shipped React 16 RC with it.
212211
// TODO: remove in React 17.
213212
unstable_createPortal,
214-
// enableUseEventAPI
215-
useEvent as unstable_useEvent,
216213
};
217214

218215
const foundDevTools = injectIntoDevTools({

packages/react-dom/src/client/ReactDOMComponentTree.js

-17
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import type {
1515
SuspenseInstance,
1616
Props,
1717
} from './ReactDOMHostConfig';
18-
import type {ReactDOMListener} from '../shared/ReactDOMTypes';
1918

2019
import {
2120
HostComponent,
@@ -33,7 +32,6 @@ const randomKey = Math.random()
3332
const internalInstanceKey = '__reactFiber$' + randomKey;
3433
const internalEventHandlersKey = '__reactEvents$' + randomKey;
3534
const internalContainerInstanceKey = '__reactContainer$' + randomKey;
36-
const internalEventListenersKey = '__reactListeners$' + randomKey;
3735

3836
export function precacheFiberNode(
3937
hostInst: Fiber,
@@ -187,18 +185,3 @@ export function updateFiberProps(
187185
): void {
188186
(node: any)[internalEventHandlersKey] = props;
189187
}
190-
191-
// This is used for useEvent listeners
192-
export function getListenersFromTarget(
193-
target: EventTarget,
194-
): null | Set<ReactDOMListener> {
195-
return (target: any)[internalEventListenersKey] || null;
196-
}
197-
198-
// This is used for useEvent listeners
199-
export function initListenersSet(
200-
target: EventTarget,
201-
value: Set<ReactDOMListener>,
202-
): void {
203-
(target: any)[internalEventListenersKey] = value;
204-
}

packages/react-dom/src/client/ReactDOMHostConfig.js

+7-125
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,12 @@ import type {
1313
ReactDOMEventResponder,
1414
ReactDOMEventResponderInstance,
1515
ReactDOMFundamentalComponentInstance,
16-
ReactDOMListener,
17-
ReactDOMListenerEvent,
18-
ReactDOMListenerMap,
1916
} from '../shared/ReactDOMTypes';
20-
import type {ReactScopeMethods} from 'shared/ReactTypes';
2117

2218
import {
2319
precacheFiberNode,
2420
updateFiberProps,
2521
getClosestInstanceFromNode,
26-
getListenersFromTarget,
2722
} from './ReactDOMComponentTree';
2823
import {
2924
createElement,
@@ -69,32 +64,9 @@ import {
6964
enableSuspenseServerRenderer,
7065
enableDeprecatedFlareAPI,
7166
enableFundamentalAPI,
72-
enableUseEventAPI,
73-
enableScopeAPI,
7467
} from 'shared/ReactFeatureFlags';
75-
import {
76-
PLUGIN_EVENT_SYSTEM,
77-
USE_EVENT_SYSTEM,
78-
} from '../events/EventSystemFlags';
79-
import {
80-
isManagedDOMElement,
81-
isValidEventTarget,
82-
listenToTopLevelEvent,
83-
attachListenerToManagedDOMElement,
84-
detachListenerFromManagedDOMElement,
85-
attachTargetEventListener,
86-
detachTargetEventListener,
87-
isReactScope,
88-
attachListenerToReactScope,
89-
detachListenerFromReactScope,
90-
} from '../events/DOMModernPluginEventSystem';
91-
import {getListenerMapForElement} from '../events/DOMEventListenerMap';
9268
import {TOP_BEFORE_BLUR, TOP_AFTER_BLUR} from '../events/DOMTopLevelEventTypes';
9369

94-
export type ReactListenerEvent = ReactDOMListenerEvent;
95-
export type ReactListenerMap = ReactDOMListenerMap;
96-
export type ReactListener = ReactDOMListener;
97-
9870
export type Type = string;
9971
export type Props = {
10072
autoFocus?: boolean,
@@ -246,7 +218,7 @@ export function prepareForCommit(containerInfo: Container): Object | null {
246218
eventsEnabled = ReactBrowserEventEmitterIsEnabled();
247219
selectionInformation = getSelectionInformation();
248220
let activeInstance = null;
249-
if (enableDeprecatedFlareAPI || enableUseEventAPI) {
221+
if (enableDeprecatedFlareAPI) {
250222
const focusedElem = selectionInformation.focusedElem;
251223
if (focusedElem !== null) {
252224
activeInstance = getClosestInstanceFromNode(focusedElem);
@@ -257,15 +229,15 @@ export function prepareForCommit(containerInfo: Container): Object | null {
257229
}
258230

259231
export function beforeActiveInstanceBlur(): void {
260-
if (enableDeprecatedFlareAPI || enableUseEventAPI) {
232+
if (enableDeprecatedFlareAPI) {
261233
ReactBrowserEventEmitterSetEnabled(true);
262234
dispatchBeforeDetachedBlur((selectionInformation: any).focusedElem);
263235
ReactBrowserEventEmitterSetEnabled(false);
264236
}
265237
}
266238

267239
export function afterActiveInstanceBlur(): void {
268-
if (enableDeprecatedFlareAPI || enableUseEventAPI) {
240+
if (enableDeprecatedFlareAPI) {
269241
ReactBrowserEventEmitterSetEnabled(true);
270242
dispatchAfterDetachedBlur((selectionInformation: any).focusedElem);
271243
ReactBrowserEventEmitterSetEnabled(false);
@@ -528,7 +500,7 @@ function createEvent(type: TopLevelType): Event {
528500
}
529501

530502
function dispatchBeforeDetachedBlur(target: HTMLElement): void {
531-
if (enableDeprecatedFlareAPI || enableUseEventAPI) {
503+
if (enableDeprecatedFlareAPI) {
532504
const event = createEvent(TOP_BEFORE_BLUR);
533505
// Dispatch "beforeblur" directly on the target,
534506
// so it gets picked up by the event system and
@@ -538,7 +510,7 @@ function dispatchBeforeDetachedBlur(target: HTMLElement): void {
538510
}
539511

540512
function dispatchAfterDetachedBlur(target: HTMLElement): void {
541-
if (enableDeprecatedFlareAPI || enableUseEventAPI) {
513+
if (enableDeprecatedFlareAPI) {
542514
const event = createEvent(TOP_AFTER_BLUR);
543515
// So we know what was detached, make the relatedTarget the
544516
// detached target on the "afterblur" event.
@@ -550,23 +522,8 @@ function dispatchAfterDetachedBlur(target: HTMLElement): void {
550522

551523
export function beforeRemoveInstance(
552524
instance: Instance | TextInstance | SuspenseInstance,
553-
): void {
554-
if (enableUseEventAPI) {
555-
// It's unfortunate that we have to do this cleanup, but
556-
// it's necessary otherwise we will leak the host instances
557-
// from the useEvent hook instances Map. We call destroy
558-
// on each listener to ensure we properly remove the instance
559-
// from the instances Map. Note: we have this Map so that we
560-
// can properly unmount instances when the function component
561-
// that the hook is attached to gets unmounted.
562-
const listenersSet = getListenersFromTarget(instance);
563-
if (listenersSet !== null) {
564-
const listeners = Array.from(listenersSet);
565-
for (let i = 0; i < listeners.length; i++) {
566-
listeners[i].destroy(instance);
567-
}
568-
}
569-
}
525+
) {
526+
// TODO for ReactDOM.createEventInstance
570527
}
571528

572529
export function removeChild(
@@ -1141,78 +1098,3 @@ export function makeOpaqueHydratingObject(
11411098
valueOf: attemptToReadValue,
11421099
};
11431100
}
1144-
1145-
export function registerEvent(
1146-
event: ReactDOMListenerEvent,
1147-
rootContainerInstance: Container,
1148-
): void {
1149-
const {passive, priority, type} = event;
1150-
const listenerMap = getListenerMapForElement(rootContainerInstance);
1151-
// Add the event listener to the target container (falling back to
1152-
// the target if we didn't find one).
1153-
listenToTopLevelEvent(
1154-
type,
1155-
rootContainerInstance,
1156-
listenerMap,
1157-
PLUGIN_EVENT_SYSTEM | USE_EVENT_SYSTEM,
1158-
passive,
1159-
priority,
1160-
);
1161-
}
1162-
1163-
export function mountEventListener(listener: ReactDOMListener): void {
1164-
if (enableUseEventAPI) {
1165-
const {target} = listener;
1166-
if (isManagedDOMElement(target)) {
1167-
attachListenerToManagedDOMElement(listener);
1168-
} else if (enableScopeAPI && isReactScope(target)) {
1169-
attachListenerToReactScope(listener);
1170-
} else {
1171-
attachTargetEventListener(listener);
1172-
}
1173-
}
1174-
}
1175-
1176-
export function unmountEventListener(listener: ReactDOMListener): void {
1177-
if (enableUseEventAPI) {
1178-
const {target} = listener;
1179-
if (isManagedDOMElement(target)) {
1180-
detachListenerFromManagedDOMElement(listener);
1181-
} else if (enableScopeAPI && isReactScope(target)) {
1182-
detachListenerFromReactScope(listener);
1183-
} else {
1184-
detachTargetEventListener(listener);
1185-
}
1186-
}
1187-
}
1188-
1189-
export function validateEventListenerTarget(
1190-
target: EventTarget | ReactScopeMethods,
1191-
listener: ?(SyntheticEvent<EventTarget>) => void,
1192-
): boolean {
1193-
if (enableUseEventAPI) {
1194-
if (
1195-
target != null &&
1196-
(isManagedDOMElement(target) ||
1197-
isValidEventTarget(target) ||
1198-
isReactScope(target))
1199-
) {
1200-
if (listener == null || typeof listener === 'function') {
1201-
return true;
1202-
}
1203-
if (__DEV__) {
1204-
console.warn(
1205-
'Event listener method setListener() from useEvent() hook requires the second argument' +
1206-
' to be either a valid function callback or null/undefined.',
1207-
);
1208-
}
1209-
}
1210-
if (__DEV__) {
1211-
console.warn(
1212-
'Event listener method setListener() from useEvent() hook requires the first argument to be ' +
1213-
'a valid DOM EventTarget. If using a ref, ensure the current value is not null.',
1214-
);
1215-
}
1216-
}
1217-
return false;
1218-
}

0 commit comments

Comments
 (0)