Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. import React from "react";
  2. // nodejs library that concatenates classes
  3. import classNames from "classnames";
  4. // nodejs library to set properties for components
  5. import PropTypes from "prop-types";
  6. // @material-ui/core components
  7. import { makeStyles } from "@material-ui/core/styles";
  8. import AppBar from "@material-ui/core/AppBar";
  9. import Toolbar from "@material-ui/core/Toolbar";
  10. import IconButton from "@material-ui/core/IconButton";
  11. import Button from "@material-ui/core/Button";
  12. import Hidden from "@material-ui/core/Hidden";
  13. import Drawer from "@material-ui/core/Drawer";
  14. // @material-ui/icons
  15. import Menu from "@material-ui/icons/Menu";
  16. // core components
  17. import styles from "assets/jss/material-kit-react/components/headerStyle.js";
  18.  
  19. // new changes for reference
  20. // import recompose
  21. import { compose } from 'recompose';
  22.  
  23. // import router HOC
  24. import { withRouter } from 'react-router';
  25.  
  26. const useStyles = makeStyles(styles);
  27.  
  28. const Header = (props) => {
  29. const classes = useStyles();
  30. const [mobileOpen, setMobileOpen] = React.useState(false);
  31. React.useEffect(() => {
  32. if (props.changeColorOnScroll) {
  33. window.addEventListener("scroll", headerColorChange);
  34. }
  35. return function cleanup() {
  36. if (props.changeColorOnScroll) {
  37. window.removeEventListener("scroll", headerColorChange);
  38. }
  39. };
  40. });
  41. const handleDrawerToggle = () => {
  42. setMobileOpen(!mobileOpen);
  43. };
  44. const headerColorChange = () => {
  45. const { color, changeColorOnScroll } = props;
  46. const windowsScrollTop = window.pageYOffset;
  47. if (windowsScrollTop > changeColorOnScroll.height) {
  48. document.body
  49. .getElementsByTagName("header")[0]
  50. .classList.remove(classes[color]);
  51. document.body
  52. .getElementsByTagName("header")[0]
  53. .classList.add(classes[changeColorOnScroll.color]);
  54. } else {
  55. document.body
  56. .getElementsByTagName("header")[0]
  57. .classList.add(classes[color]);
  58. document.body
  59. .getElementsByTagName("header")[0]
  60. .classList.remove(classes[changeColorOnScroll.color]);
  61. }
  62. };
  63. const { color, rightLinks, leftLinks, brand, fixed, absolute, logo } = props;
  64. const appBarClasses = classNames({
  65. [classes.appBar]: true,
  66. [classes[color]]: color,
  67. [classes.absolute]: absolute,
  68. [classes.fixed]: fixed
  69. });
  70.  
  71. const pushTo = (route = "/") => () => {
  72. // Object Destructing. Same as const push = props.history.push but shorter and nicer.
  73. const { history: { push } } = props;
  74. push(route);
  75. };
  76.  
  77. const brandComponent = (
  78. <div>
  79. <img src={logo} onClick={pushTo('/')} style={{width: 60, height: 'auto'}} />
  80. <Button className={classes.title} onClick={pushTo('/')}>{brand}</Button>
  81. </div>
  82. );
  83.  
  84. return (
  85. <AppBar className={appBarClasses}>
  86. <Toolbar className={classes.container}>
  87. {leftLinks !== undefined ? brandComponent : null}
  88. <div className={classes.flex}>
  89. {leftLinks !== undefined ? (
  90. <Hidden smDown implementation="css">
  91. {leftLinks}
  92. </Hidden>
  93. ) : (
  94. brandComponent
  95. )}
  96. </div>
  97. <Hidden smDown implementation="css">
  98. {rightLinks}
  99. </Hidden>
  100. <Hidden mdUp>
  101. <IconButton
  102. color="inherit"
  103. aria-label="open drawer"
  104. onClick={handleDrawerToggle}
  105. >
  106. <Menu />
  107. </IconButton>
  108. </Hidden>
  109. </Toolbar>
  110. <Hidden mdUp implementation="js">
  111. <Drawer
  112. variant="temporary"
  113. anchor={"right"}
  114. open={mobileOpen}
  115. classes={{
  116. paper: classes.drawerPaper
  117. }}
  118. onClose={handleDrawerToggle}
  119. >
  120. <div className={classes.appResponsive}>
  121. {leftLinks}
  122. {rightLinks}
  123. </div>
  124. </Drawer>
  125. </Hidden>
  126. </AppBar>
  127. );
  128. }
  129.  
  130. export default compose(withRouter)(Header);
  131.  
  132. Header.defaultProp = {
  133. color: "white"
  134. };
  135.  
  136. Header.propTypes = {
  137. color: PropTypes.oneOf([
  138. "primary",
  139. "info",
  140. "success",
  141. "warning",
  142. "danger",
  143. "transparent",
  144. "white",
  145. "rose",
  146. "dark"
  147. ]),
  148. rightLinks: PropTypes.node,
  149. leftLinks: PropTypes.node,
  150. brand: PropTypes.string,
  151. logo: PropTypes.element,
  152. fixed: PropTypes.bool,
  153. absolute: PropTypes.bool,
  154. // this will cause the sidebar to change the color from
  155. // props.color (see above) to changeColorOnScroll.color
  156. // when the window.pageYOffset is heigher or equal to
  157. // changeColorOnScroll.height and then when it is smaller than
  158. // changeColorOnScroll.height change it back to
  159. // props.color (see above)
  160. changeColorOnScroll: PropTypes.shape({
  161. height: PropTypes.number.isRequired,
  162. color: PropTypes.oneOf([
  163. "primary",
  164. "info",
  165. "success",
  166. "warning",
  167. "danger",
  168. "transparent",
  169. "white",
  170. "rose",
  171. "dark"
  172. ]).isRequired
  173. })
  174. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement