Advertisement
Guest User

Untitled

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