Skip to content

Commit 5b08f7b

Browse files
authored
[Flare] Adds useListener implementation to ReactDebugHooks (#16205)
1 parent ed72f40 commit 5b08f7b

2 files changed

Lines changed: 61 additions & 3 deletions

File tree

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
* @flow
88
*/
99

10-
import type {ReactContext, ReactProviderType} from 'shared/ReactTypes';
10+
import type {
11+
ReactContext,
12+
ReactProviderType,
13+
ReactEventResponder,
14+
} from 'shared/ReactTypes';
1115
import type {Fiber} from 'react-reconciler/src/ReactFiber';
1216
import type {Hook} from 'react-reconciler/src/ReactFiberHooks';
1317
import type {Dispatcher as DispatcherType} from 'react-reconciler/src/ReactFiberHooks';
@@ -21,6 +25,8 @@ import {
2125
ForwardRef,
2226
} from 'shared/ReactWorkTags';
2327

28+
const emptyObject = {};
29+
2430
type CurrentDispatcherRef = typeof ReactSharedInternals.ReactCurrentDispatcher;
2531

2632
// Used to track hooks called during a render
@@ -215,8 +221,17 @@ function useMemo<T>(
215221
return value;
216222
}
217223

218-
function useListener() {
219-
throw new Error('TODO: not yet implemented');
224+
function useListener(
225+
responder: ReactEventResponder<any, any>,
226+
hookProps: ?Object,
227+
): void {
228+
const listenerProps = hookProps || emptyObject;
229+
// Don't put the actual event responder object in, just its displayName
230+
const value = {
231+
responder: responder.displayName || 'EventResponder',
232+
props: listenerProps,
233+
};
234+
hookLog.push({primitive: 'Listener', stackError: new Error(), value});
220235
}
221236

222237
const Dispatcher: DispatcherType = {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @emails react-core
8+
* @jest-environment node
9+
*/
10+
11+
'use strict';
12+
13+
let React;
14+
let ReactDebugTools;
15+
16+
describe('ReactHooksInspection', () => {
17+
beforeEach(() => {
18+
jest.resetModules();
19+
const ReactFeatureFlags = require('shared/ReactFeatureFlags');
20+
ReactFeatureFlags.enableFlareAPI = true;
21+
React = require('react');
22+
ReactDebugTools = require('react-debug-tools');
23+
});
24+
25+
it('should inspect a simple useListener hook', () => {
26+
const TestResponder = React.unstable_createResponder('TestResponder', {});
27+
28+
function Foo(props) {
29+
React.unstable_useListener(TestResponder, {preventDefault: false});
30+
return <div responders={<TestResponder />}>Hello world</div>;
31+
}
32+
let tree = ReactDebugTools.inspectHooks(Foo, {});
33+
expect(tree).toEqual([
34+
{
35+
isStateEditable: false,
36+
id: 0,
37+
name: 'Listener',
38+
value: {props: {preventDefault: false}, responder: 'TestResponder'},
39+
subHooks: [],
40+
},
41+
]);
42+
});
43+
});

0 commit comments

Comments
 (0)