Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

158 строки
4.4 KiB

  1. import React from "react";
  2. import Link from "next/link";
  3. // nodejs library that concatenates classes
  4. import classNames from "classnames";
  5. // nodejs library to set properties for components
  6. import PropTypes from "prop-types";
  7. // @material-ui/core components
  8. import { makeStyles } from "@material-ui/core/styles";
  9. import AppBar from "@material-ui/core/AppBar";
  10. import Toolbar from "@material-ui/core/Toolbar";
  11. import IconButton from "@material-ui/core/IconButton";
  12. import Button from "@material-ui/core/Button";
  13. import Hidden from "@material-ui/core/Hidden";
  14. import Drawer from "@material-ui/core/Drawer";
  15. // @material-ui/icons
  16. import Menu from "@material-ui/icons/Menu";
  17. // core components
  18. import styles from "assets/jss/nextjs-material-kit/components/headerStyle.js";
  19. const useStyles = makeStyles(styles);
  20. export default function Header(props) {
  21. const classes = useStyles();
  22. const [mobileOpen, setMobileOpen] = React.useState(false);
  23. React.useEffect(() => {
  24. if (props.changeColorOnScroll) {
  25. window.addEventListener("scroll", headerColorChange);
  26. }
  27. return function cleanup() {
  28. if (props.changeColorOnScroll) {
  29. window.removeEventListener("scroll", headerColorChange);
  30. }
  31. };
  32. });
  33. const handleDrawerToggle = () => {
  34. setMobileOpen(!mobileOpen);
  35. };
  36. const headerColorChange = () => {
  37. const { color, changeColorOnScroll } = props;
  38. const windowsScrollTop = window.pageYOffset;
  39. if (windowsScrollTop > changeColorOnScroll.height) {
  40. document.body
  41. .getElementsByTagName("header")[0]
  42. .classList.remove(classes[color]);
  43. document.body
  44. .getElementsByTagName("header")[0]
  45. .classList.add(classes[changeColorOnScroll.color]);
  46. } else {
  47. document.body
  48. .getElementsByTagName("header")[0]
  49. .classList.add(classes[color]);
  50. document.body
  51. .getElementsByTagName("header")[0]
  52. .classList.remove(classes[changeColorOnScroll.color]);
  53. }
  54. };
  55. const { color, rightLinks, leftLinks, brand, fixed, absolute } = props;
  56. const appBarClasses = classNames({
  57. [classes.appBar]: true,
  58. [classes[color]]: color,
  59. [classes.absolute]: absolute,
  60. [classes.fixed]: fixed
  61. });
  62. const brandComponent = (
  63. <Link href="/components" as="/components">
  64. <Button className={classes.title}>{brand}</Button>
  65. {/* <img src="assets/img/ymhthamrin.png"/> */}
  66. </Link>
  67. );
  68. return (
  69. <AppBar className={appBarClasses}>
  70. <Toolbar className={classes.container}>
  71. {leftLinks !== undefined ? brandComponent : null}
  72. <div className={classes.flex}>
  73. {leftLinks !== undefined ? (
  74. <Hidden smDown implementation="css">
  75. {leftLinks}
  76. </Hidden>
  77. ) : (
  78. brandComponent
  79. )}
  80. </div>
  81. <Hidden smDown implementation="css">
  82. {rightLinks}
  83. </Hidden>
  84. <Hidden mdUp>
  85. <IconButton
  86. color="inherit"
  87. aria-label="open drawer"
  88. onClick={handleDrawerToggle}
  89. >
  90. <Menu />
  91. </IconButton>
  92. </Hidden>
  93. </Toolbar>
  94. <Hidden mdUp implementation="js">
  95. <Drawer
  96. variant="temporary"
  97. anchor={"right"}
  98. open={mobileOpen}
  99. classes={{
  100. paper: classes.drawerPaper
  101. }}
  102. onClose={handleDrawerToggle}
  103. >
  104. <div className={classes.appResponsive}>
  105. {leftLinks}
  106. {rightLinks}
  107. </div>
  108. </Drawer>
  109. </Hidden>
  110. </AppBar>
  111. );
  112. }
  113. Header.defaultProp = {
  114. color: "black"
  115. };
  116. Header.propTypes = {
  117. color: PropTypes.oneOf([
  118. "primary",
  119. "info",
  120. "success",
  121. "warning",
  122. "danger",
  123. "transparent",
  124. "white",
  125. "rose",
  126. "dark"
  127. ]),
  128. rightLinks: PropTypes.node,
  129. leftLinks: PropTypes.node,
  130. brand: PropTypes.string,
  131. fixed: PropTypes.bool,
  132. absolute: PropTypes.bool,
  133. // this will cause the sidebar to change the color from
  134. // props.color (see above) to changeColorOnScroll.color
  135. // when the window.pageYOffset is heigher or equal to
  136. // changeColorOnScroll.height and then when it is smaller than
  137. // changeColorOnScroll.height change it back to
  138. // props.color (see above)
  139. changeColorOnScroll: PropTypes.shape({
  140. height: PropTypes.number.isRequired,
  141. color: PropTypes.oneOf([
  142. "primary",
  143. "info",
  144. "success",
  145. "warning",
  146. "danger",
  147. "transparent",
  148. "white",
  149. "rose",
  150. "dark"
  151. ]).isRequired
  152. })
  153. };