Skip to content

Commit d421f05

Browse files
committed
Rewrite SatellitesHeader to functional component using hooks.
1 parent daaebd2 commit d421f05

File tree

1 file changed

+37
-53
lines changed

1 file changed

+37
-53
lines changed
Lines changed: 37 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react'
2-
import { connect } from 'react-redux'
2+
import { useDispatch, useSelector } from 'react-redux'
33

4-
import { IPlanet } from './Planets'
54
import { IAppState } from './reducer'
65
import * as S from './styles'
76
import * as A from './actions'
@@ -10,56 +9,41 @@ interface IOwnProp {
109
numberOfSatellites: number
1110
}
1211

13-
interface IReduxProps {
14-
selectedPlanet?: IPlanet
15-
dispatchUnselectedPlanet: typeof A.unselectPlanet
12+
const SatellitesHeader = (props: IOwnProp) => {
13+
const dispatch = useDispatch()
14+
const selectedPlanet = useSelector((state: IAppState) => state.selectedPlanet)
15+
16+
const { numberOfSatellites } = props
17+
const headerElement = selectedPlanet ? (
18+
satellitesForPlanetInfo(selectedPlanet.name, numberOfSatellites)
19+
) : (
20+
<S.HeaderText>Satellites of all planets</S.HeaderText>
21+
)
22+
23+
return (
24+
<S.SatellitesContainer>
25+
<S.HeaderContainer>
26+
{headerElement}
27+
<S.PlainText> ({numberOfSatellites} shown) </S.PlainText>
28+
{selectedPlanet ? (
29+
<S.LinkButton onClick={() => dispatch(A.unselectPlanet())}>(show all satellites)</S.LinkButton>
30+
) : (
31+
<S.PlainText>(select a planet above to filter satellites)</S.PlainText>
32+
)}
33+
</S.HeaderContainer>
34+
</S.SatellitesContainer>
35+
)
1636
}
1737

18-
class SatellitesHeader extends React.Component<IOwnProp & IReduxProps> {
19-
private satellitesForPlanet = (planetName: String, numberOfSatellites: number) =>
20-
numberOfSatellites === 0 ? (
21-
<S.HeaderText>
22-
Planet <S.Text highlight>{planetName}</S.Text> does not have any satellites
23-
</S.HeaderText>
24-
) : (
25-
<S.HeaderText>
26-
Satellites of planet <S.Text highlight>{planetName}</S.Text>
27-
</S.HeaderText>
28-
)
29-
30-
private allSatellites = <S.HeaderText>Satellites of all planets</S.HeaderText>
31-
32-
render(): React.ReactNode {
33-
const { selectedPlanet, numberOfSatellites, dispatchUnselectedPlanet } = this.props
34-
const headerElement = selectedPlanet
35-
? this.satellitesForPlanet(selectedPlanet.name, numberOfSatellites)
36-
: this.allSatellites
37-
38-
return (
39-
<S.SatellitesContainer>
40-
<S.HeaderContainer>
41-
{headerElement}
42-
<S.PlainText> ({numberOfSatellites} shown) </S.PlainText>
43-
{selectedPlanet ? (
44-
<S.LinkButton onClick={dispatchUnselectedPlanet}>(show all satellites)</S.LinkButton>
45-
) : (
46-
<S.PlainText>(select a planet above to filter satellites)</S.PlainText>
47-
)}
48-
</S.HeaderContainer>
49-
</S.SatellitesContainer>
50-
)
51-
}
52-
}
53-
54-
const mapStateToProps = (state: IAppState) => ({
55-
selectedPlanet: state.selectedPlanet
56-
})
57-
58-
const mapDispatchToProps = {
59-
dispatchUnselectedPlanet: A.unselectPlanet
60-
}
61-
62-
export default connect(
63-
mapStateToProps,
64-
mapDispatchToProps
65-
)(SatellitesHeader)
38+
const satellitesForPlanetInfo = (planetName: String, numberOfSatellites: number) =>
39+
numberOfSatellites === 0 ? (
40+
<S.HeaderText>
41+
Planet <S.Text highlight>{planetName}</S.Text> does not have any satellites
42+
</S.HeaderText>
43+
) : (
44+
<S.HeaderText>
45+
Satellites of planet <S.Text highlight>{planetName}</S.Text>
46+
</S.HeaderText>
47+
)
48+
49+
export default React.memo(SatellitesHeader)

0 commit comments

Comments
 (0)