Skip to content

Commit 5aace98

Browse files
fix HOC displayNames
- update exercises and tests
1 parent f331813 commit 5aace98

File tree

4 files changed

+51
-33
lines changed

4 files changed

+51
-33
lines changed

src/__tests__/12.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ test('renders a toggle component', () => {
3232
}
3333
const subtitleWrapperFiberNode = getDebugChild(debugInstance)
3434
try {
35-
expect(subtitleWrapperFiberNode.type).toMatchObject({
36-
displayName: 'withToggle(Subtitle)',
37-
})
35+
expect(subtitleWrapperFiberNode.child.type.displayName).toMatch('withToggle(Subtitle)')
3836
} catch (error) {
3937
const helpfulMessage = chalk.red(
4038
`🚨 Make sure you're adding a displayName prop to your Wrapper 🚨`,

src/exercises-final/12.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,22 @@ class Toggle extends React.Component {
111111
}
112112

113113
function withToggle(Component) {
114-
const Wrapper = React.forwardRef((props, ref) => (
115-
<Toggle.Consumer>
116-
{toggle => <Component {...props} toggle={toggle} ref={ref} />}
117-
</Toggle.Consumer>
114+
class Wrapper extends React.Component {
115+
render() {
116+
const { forwardedRef, ...rest } = this.props
117+
return (
118+
<Toggle.Consumer>
119+
{toggle => <Component {...rest} toggle={toggle} ref={forwardedRef} />}
120+
</Toggle.Consumer>
121+
)
122+
}
123+
}
124+
Wrapper.displayName = `withToggle(${Component.displayName ||
125+
Component.name})`
126+
const forwardRef = React.forwardRef((props, ref) => (
127+
<Wrapper {...props} forwardedRef={ref} />
118128
))
119-
Wrapper.displayName = `withToggle(${Component.displayName || Component.name})`
120-
hoistNonReactStatics(Wrapper, Component)
121-
return Wrapper
129+
return hoistNonReactStatics(forwardRef, Component)
122130
}
123131

124132
// this Subtitle component could be as simple as:

src/exercises-final/13.js

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,22 @@ class Rendux extends React.Component {
5252
}
5353

5454
function withRendux(Component) {
55-
const Wrapper = React.forwardRef((props, ref) => (
56-
<Rendux.Consumer>
57-
{rendux => <Component {...props} rendux={rendux} ref={ref} />}
58-
</Rendux.Consumer>
55+
class Wrapper extends React.Component {
56+
render() {
57+
const { forwardedRef, ...rest } = this.props
58+
return (
59+
<Rendux.Consumer>
60+
{rendux => <Component {...rest} rendux={rendux} ref={forwardedRef} />}
61+
</Rendux.Consumer>
62+
)
63+
}
64+
}
65+
Wrapper.displayName = `withRendux(${Component.displayName ||
66+
Component.name})`
67+
const forwardRef = React.forwardRef((props, ref) => (
68+
<Wrapper {...props} forwardedRef={ref} />
5969
))
60-
Wrapper.displayName = `withRendux(${Component.displayName || Component.name})`
61-
hoistNonReactStatics(Wrapper, Component)
62-
return Wrapper
70+
return hoistNonReactStatics(forwardRef, Component)
6371
}
6472

6573
function MyInput() {
@@ -117,14 +125,16 @@ function MySwitch() {
117125
)
118126
}
119127

120-
const StatePrinter = withRendux(({rendux}) => (
121-
<div style={{textAlign: 'left'}}>
122-
state:
123-
<pre data-testid="printed-state">
124-
{JSON.stringify(rendux.state, null, 2)}
125-
</pre>
126-
</div>
127-
))
128+
const StatePrinter = withRendux(function StatePrinter({rendux}) {
129+
return (
130+
<div style={{textAlign: 'left'}}>
131+
state:
132+
<pre data-testid="printed-state">
133+
{JSON.stringify(rendux.state, null, 2)}
134+
</pre>
135+
</div>
136+
)
137+
})
128138

129139
function Usage() {
130140
return (

src/exercises/13.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,16 @@ function MySwitch() {
104104
)
105105
}
106106

107-
const StatePrinter = withRendux(({rendux}) => (
108-
<div style={{textAlign: 'left'}}>
109-
state:
110-
<pre data-testid="printed-state">
111-
{JSON.stringify(rendux.state, null, 2)}
112-
</pre>
113-
</div>
114-
))
107+
const StatePrinter = withRendux(function StatePrinter({rendux}) {
108+
return (
109+
<div style={{textAlign: 'left'}}>
110+
state:
111+
<pre data-testid="printed-state">
112+
{JSON.stringify(rendux.state, null, 2)}
113+
</pre>
114+
</div>
115+
)
116+
})
115117

116118
function Usage() {
117119
return (

0 commit comments

Comments
 (0)