| 
1 | 1 | // @flow  | 
2 | 2 | 
 
  | 
3 |  | -import React, { createContext } from "react"  | 
 | 3 | +import React, { memo, createContext, useContext } from "react"  | 
 | 4 | +import { styled } from "@material-ui/core/styles"  | 
4 | 5 | import Button from "@material-ui/core/Button"  | 
 | 6 | +import useEventCallback from "use-event-callback"  | 
 | 7 | + | 
 | 8 | +const StyledButton = styled(Button)({  | 
 | 9 | + width: 80,  | 
 | 10 | + margin: 2  | 
 | 11 | +})  | 
 | 12 | + | 
 | 13 | +const IconName = styled("div")({  | 
 | 14 | + fontWeight: "bold"  | 
 | 15 | +})  | 
5 | 16 | 
 
  | 
6 | 17 | export const HeaderButtonContext = createContext()  | 
7 | 18 | 
 
  | 
8 |  | -export default ({ name, Icon }: { name: string, Icon: any }) => {  | 
9 |  | - return (  | 
10 |  | - <HeaderButtonContext.Consumer>  | 
11 |  | - {({ onHeaderButtonClick }: any) => (  | 
12 |  | - <Button  | 
13 |  | -  onClick={() => onHeaderButtonClick(name)}  | 
14 |  | -  style={{ width: 80, margin: 2 }}  | 
15 |  | -  >  | 
16 |  | -  <div>  | 
17 |  | -  <Icon style={{}} />  | 
18 |  | - <div style={{ fontWeight: "bold" }}>{name}</div>  | 
19 |  | - </div>  | 
20 |  | - </Button>  | 
21 |  | -  )}  | 
22 |  | -  </HeaderButtonContext.Consumer>  | 
23 |  | - )  | 
 | 19 | +const MemoizedHeaderButton = memo(  | 
 | 20 | + ({ name, Icon, onClick }) => (  | 
 | 21 | + <StyledButton onClick={onClick}>  | 
 | 22 | + <div>  | 
 | 23 | + <Icon />  | 
 | 24 | + <IconName>{name}</IconName>  | 
 | 25 | + </div>  | 
 | 26 | + </StyledButton>  | 
 | 27 | + ),  | 
 | 28 | + (prevProps, nextProps) => prevProps.name === nextProps.name  | 
 | 29 | +)  | 
 | 30 | + | 
 | 31 | +export const HeaderButton = ({ name, Icon }: { name: string, Icon: any }) => {  | 
 | 32 | + const { onHeaderButtonClick } = useContext(HeaderButtonContext)  | 
 | 33 | + const onClick = useEventCallback(() => onHeaderButtonClick(name))  | 
 | 34 | + return <MemoizedHeaderButton name={name} Icon={Icon} onClick={onClick} />  | 
24 | 35 | }  | 
 | 36 | + | 
 | 37 | +export default HeaderButton  | 
0 commit comments