Skip to content

Commit b61174f

Browse files
authored
Remove the deprecated React Flare event system (#19520)
1 parent 8d57ca5 commit b61174f

File tree

92 files changed

+125
-12325
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+125
-12325
lines changed

packages/react-art/src/ReactARTHostConfig.js

-20
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@ import Mode from 'art/modes/current';
1010
import invariant from 'shared/invariant';
1111

1212
import {TYPES, EVENT_TYPES, childrenAsString} from './ReactARTInternals';
13-
import type {
14-
ReactEventResponder,
15-
ReactEventResponderInstance,
16-
} from 'shared/ReactTypes';
1713

1814
const pooledTransform = new Transform();
1915

@@ -429,22 +425,6 @@ export function clearContainer(container) {
429425
// TODO Implement this
430426
}
431427

432-
export function DEPRECATED_mountResponderInstance(
433-
responder: ReactEventResponder<any, any>,
434-
responderInstance: ReactEventResponderInstance<any, any>,
435-
props: Object,
436-
state: Object,
437-
instance: Object,
438-
) {
439-
throw new Error('Not yet implemented.');
440-
}
441-
442-
export function DEPRECATED_unmountResponderInstance(
443-
responderInstance: ReactEventResponderInstance<any, any>,
444-
): void {
445-
throw new Error('Not yet implemented.');
446-
}
447-
448428
export function getFundamentalComponentInstance(fundamentalInstance) {
449429
throw new Error('Not yet implemented.');
450430
}

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

-19
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import type {
1313
MutableSourceSubscribeFn,
1414
ReactContext,
1515
ReactProviderType,
16-
ReactEventResponder,
17-
ReactEventResponderListener,
1816
} from 'shared/ReactTypes';
1917
import type {
2018
Fiber,
@@ -260,22 +258,6 @@ function useMutableSource<Source, Snapshot>(
260258
return value;
261259
}
262260

263-
function useResponder(
264-
responder: ReactEventResponder<any, any>,
265-
listenerProps: Object,
266-
): ReactEventResponderListener<any, any> {
267-
// Don't put the actual event responder object in, just its displayName
268-
const value = {
269-
responder: responder.displayName || 'EventResponder',
270-
props: listenerProps,
271-
};
272-
hookLog.push({primitive: 'Responder', stackError: new Error(), value});
273-
return {
274-
responder,
275-
props: listenerProps,
276-
};
277-
}
278-
279261
function useTransition(
280262
config: SuspenseConfig | null | void,
281263
): [(() => void) => void, boolean] {
@@ -335,7 +317,6 @@ const Dispatcher: DispatcherType = {
335317
useReducer,
336318
useRef,
337319
useState,
338-
useResponder,
339320
useTransition,
340321
useMutableSource,
341322
useDeferredValue,

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

-46
This file was deleted.

packages/react-devtools-shared/src/backend/ReactSymbols.js

-3
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ export const PROFILER_SYMBOL_STRING = 'Symbol(react.profiler)';
5858
export const PROVIDER_NUMBER = 0xeacd;
5959
export const PROVIDER_SYMBOL_STRING = 'Symbol(react.provider)';
6060

61-
export const RESPONDER_NUMBER = 0xead6;
62-
export const RESPONDER_SYMBOL_STRING = 'Symbol(react.responder)';
63-
6461
export const SCOPE_NUMBER = 0xead7;
6562
export const SCOPE_SYMBOL_STRING = 'Symbol(react.scope)';
6663

packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js

+25-140
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ let ReactFeatureFlags;
1717
let Suspense;
1818
let SuspenseList;
1919
let act;
20-
let useHover;
2120

2221
function dispatchMouseEvent(to, from) {
2322
if (!to) {
@@ -76,7 +75,7 @@ describe('ReactDOMServerPartialHydration', () => {
7675

7776
ReactFeatureFlags = require('shared/ReactFeatureFlags');
7877
ReactFeatureFlags.enableSuspenseCallback = true;
79-
ReactFeatureFlags.enableDeprecatedFlareAPI = true;
78+
ReactFeatureFlags.enableCreateEventHandleAPI = true;
8079

8180
React = require('react');
8281
ReactDOM = require('react-dom');
@@ -2202,8 +2201,10 @@ describe('ReactDOMServerPartialHydration', () => {
22022201
});
22032202

22042203
// @gate experimental
2205-
it('does not invoke an event on a hydrated EventResponder until it commits', async () => {
2204+
it('does not invoke an event on a hydrated event handle until it commits', async () => {
2205+
const setClick = ReactDOM.unstable_createEventHandle('click');
22062206
let suspend = false;
2207+
let isServerRendering = true;
22072208
let resolve;
22082209
const promise = new Promise(resolvePromise => (resolve = resolvePromise));
22092210

@@ -2216,17 +2217,15 @@ describe('ReactDOMServerPartialHydration', () => {
22162217
}
22172218

22182219
const onEvent = jest.fn();
2219-
const TestResponder = React.DEPRECATED_createResponder(
2220-
'TestEventResponder',
2221-
{
2222-
targetEventTypes: ['click'],
2223-
onEvent,
2224-
},
2225-
);
22262220

22272221
function Button() {
2228-
const listener = React.DEPRECATED_useResponder(TestResponder, {});
2229-
return <a DEPRECATED_flareListeners={listener}>Click me</a>;
2222+
const ref = React.useRef(null);
2223+
if (!isServerRendering) {
2224+
React.useLayoutEffect(() => {
2225+
return setClick(ref.current, onEvent);
2226+
});
2227+
}
2228+
return <a ref={ref}>Click me</a>;
22302229
}
22312230

22322231
function App() {
@@ -2253,6 +2252,7 @@ describe('ReactDOMServerPartialHydration', () => {
22532252
// On the client we don't have all data yet but we want to start
22542253
// hydrating anyway.
22552254
suspend = true;
2255+
isServerRendering = false;
22562256
const root = ReactDOM.createRoot(container, {hydrate: true});
22572257
root.render(<App />);
22582258

@@ -2364,23 +2364,25 @@ describe('ReactDOMServerPartialHydration', () => {
23642364
});
23652365

23662366
// @gate experimental
2367-
it('invokes discrete events on nested suspense boundaries in a root (responder system)', async () => {
2367+
it('invokes discrete events on nested suspense boundaries in a root (createEventHandle)', async () => {
23682368
let suspend = false;
2369+
let isServerRendering = true;
23692370
let resolve;
23702371
const promise = new Promise(resolvePromise => (resolve = resolvePromise));
23712372

23722373
const onEvent = jest.fn();
2373-
const TestResponder = React.DEPRECATED_createResponder(
2374-
'TestEventResponder',
2375-
{
2376-
targetEventTypes: ['click'],
2377-
onEvent,
2378-
},
2379-
);
2374+
const setClick = ReactDOM.unstable_createEventHandle('click');
23802375

23812376
function Button() {
2382-
const listener = React.DEPRECATED_useResponder(TestResponder, {});
2383-
return <a DEPRECATED_flareListeners={listener}>Click me</a>;
2377+
const ref = React.useRef(null);
2378+
2379+
if (!isServerRendering) {
2380+
React.useLayoutEffect(() => {
2381+
return setClick(ref.current, onEvent);
2382+
});
2383+
}
2384+
2385+
return <a ref={ref}>Click me</a>;
23842386
}
23852387

23862388
function Child() {
@@ -2416,6 +2418,7 @@ describe('ReactDOMServerPartialHydration', () => {
24162418
// On the client we don't have all data yet but we want to start
24172419
// hydrating anyway.
24182420
suspend = true;
2421+
isServerRendering = false;
24192422
const root = ReactDOM.createRoot(container, {hydrate: true});
24202423
root.render(<App />);
24212424

@@ -2704,124 +2707,6 @@ describe('ReactDOMServerPartialHydration', () => {
27042707
document.body.removeChild(container);
27052708
});
27062709

2707-
// @gate experimental
2708-
it('blocks only on the last continuous event (Responder system)', async () => {
2709-
useHover = require('react-interactions/events/hover').useHover;
2710-
2711-
let suspend1 = false;
2712-
let resolve1;
2713-
const promise1 = new Promise(resolvePromise => (resolve1 = resolvePromise));
2714-
let suspend2 = false;
2715-
let resolve2;
2716-
const promise2 = new Promise(resolvePromise => (resolve2 = resolvePromise));
2717-
2718-
function First({text}) {
2719-
if (suspend1) {
2720-
throw promise1;
2721-
} else {
2722-
return 'Hello';
2723-
}
2724-
}
2725-
2726-
function Second({text}) {
2727-
if (suspend2) {
2728-
throw promise2;
2729-
} else {
2730-
return 'World';
2731-
}
2732-
}
2733-
2734-
const ops = [];
2735-
2736-
function App() {
2737-
const listener1 = useHover({
2738-
onHoverStart() {
2739-
ops.push('Hover Start First');
2740-
},
2741-
onHoverEnd() {
2742-
ops.push('Hover End First');
2743-
},
2744-
});
2745-
const listener2 = useHover({
2746-
onHoverStart() {
2747-
ops.push('Hover Start Second');
2748-
},
2749-
onHoverEnd() {
2750-
ops.push('Hover End Second');
2751-
},
2752-
});
2753-
return (
2754-
<div>
2755-
<Suspense fallback="Loading First...">
2756-
<span DEPRECATED_flareListeners={listener1} />
2757-
{/* We suspend after to test what happens when we eager
2758-
attach the listener. */}
2759-
<First />
2760-
</Suspense>
2761-
<Suspense fallback="Loading Second...">
2762-
<span DEPRECATED_flareListeners={listener2}>
2763-
<Second />
2764-
</span>
2765-
</Suspense>
2766-
</div>
2767-
);
2768-
}
2769-
2770-
const finalHTML = ReactDOMServer.renderToString(<App />);
2771-
const container = document.createElement('div');
2772-
container.innerHTML = finalHTML;
2773-
2774-
// We need this to be in the document since we'll dispatch events on it.
2775-
document.body.appendChild(container);
2776-
2777-
const appDiv = container.getElementsByTagName('div')[0];
2778-
const firstSpan = appDiv.getElementsByTagName('span')[0];
2779-
const secondSpan = appDiv.getElementsByTagName('span')[1];
2780-
expect(firstSpan.textContent).toBe('');
2781-
expect(secondSpan.textContent).toBe('World');
2782-
2783-
// On the client we don't have all data yet but we want to start
2784-
// hydrating anyway.
2785-
suspend1 = true;
2786-
suspend2 = true;
2787-
const root = ReactDOM.createRoot(container, {hydrate: true});
2788-
root.render(<App />);
2789-
2790-
Scheduler.unstable_flushAll();
2791-
jest.runAllTimers();
2792-
2793-
dispatchMouseEvent(appDiv, null);
2794-
dispatchMouseEvent(firstSpan, appDiv);
2795-
dispatchMouseEvent(secondSpan, firstSpan);
2796-
2797-
// Neither target is yet hydrated.
2798-
expect(ops).toEqual([]);
2799-
2800-
// Resolving the second promise so that rendering can complete.
2801-
suspend2 = false;
2802-
resolve2();
2803-
await promise2;
2804-
2805-
Scheduler.unstable_flushAll();
2806-
jest.runAllTimers();
2807-
2808-
// We've unblocked the current hover target so we should be
2809-
// able to replay it now.
2810-
expect(ops).toEqual(['Hover Start Second']);
2811-
2812-
// Resolving the first promise has no effect now.
2813-
suspend1 = false;
2814-
resolve1();
2815-
await promise1;
2816-
2817-
Scheduler.unstable_flushAll();
2818-
jest.runAllTimers();
2819-
2820-
expect(ops).toEqual(['Hover Start Second']);
2821-
2822-
document.body.removeChild(container);
2823-
});
2824-
28252710
// @gate experimental
28262711
it('finishes normal pri work before continuing to hydrate a retry', async () => {
28272712
let suspend = false;

0 commit comments

Comments
 (0)