UNPKG

next-material-kit

Version:

NextJS Version of Material Kit React by Creative Tim (https://creative-tim.com)

157 lines (152 loc) 4.49 kB
import React from "react"; import Link from "next/link"; // nodejs library that concatenates classes import classNames from "classnames"; // nodejs library to set properties for components import PropTypes from "prop-types"; // @material-ui/core components import { makeStyles } from "@material-ui/core/styles"; import AppBar from "@material-ui/core/AppBar"; import Toolbar from "@material-ui/core/Toolbar"; import IconButton from "@material-ui/core/IconButton"; import Button from "@material-ui/core/Button"; import Hidden from "@material-ui/core/Hidden"; import Drawer from "@material-ui/core/Drawer"; // @material-ui/icons import Menu from "@material-ui/icons/Menu"; // core components import styles from "styles/jss/nextjs-material-kit/components/headerStyle.js"; const useStyles = makeStyles(styles); export default function Header(props) { const classes = useStyles(); const [mobileOpen, setMobileOpen] = React.useState(false); React.useEffect(() => { if (props.changeColorOnScroll) { window.addEventListener("scroll", headerColorChange); } return function cleanup() { if (props.changeColorOnScroll) { window.removeEventListener("scroll", headerColorChange); } }; }); const handleDrawerToggle = () => { setMobileOpen(!mobileOpen); }; const headerColorChange = () => { const { color, changeColorOnScroll } = props; const windowsScrollTop = window.pageYOffset; if (windowsScrollTop > changeColorOnScroll.height) { document.body .getElementsByTagName("header")[0] .classList.remove(classes[color]); document.body .getElementsByTagName("header")[0] .classList.add(classes[changeColorOnScroll.color]); } else { document.body .getElementsByTagName("header")[0] .classList.add(classes[color]); document.body .getElementsByTagName("header")[0] .classList.remove(classes[changeColorOnScroll.color]); } }; const { color, rightLinks, leftLinks, brand, fixed, absolute } = props; const appBarClasses = classNames({ [classes.appBar]: true, [classes[color]]: color, [classes.absolute]: absolute, [classes.fixed]: fixed, }); const brandComponent = ( <Link href="/components" as="/components"> <Button className={classes.title}>{brand}</Button> </Link> ); return ( <AppBar className={appBarClasses}> <Toolbar className={classes.container}> {leftLinks !== undefined ? brandComponent : null} <div className={classes.flex}> {leftLinks !== undefined ? ( <Hidden smDown implementation="css"> {leftLinks} </Hidden> ) : ( brandComponent )} </div> <Hidden smDown implementation="css"> {rightLinks} </Hidden> <Hidden mdUp> <IconButton color="inherit" aria-label="open drawer" onClick={handleDrawerToggle} > <Menu /> </IconButton> </Hidden> </Toolbar> <Hidden mdUp implementation="js"> <Drawer variant="temporary" anchor={"right"} open={mobileOpen} classes={{ paper: classes.drawerPaper, }} onClose={handleDrawerToggle} > <div className={classes.appResponsive}> {leftLinks} {rightLinks} </div> </Drawer> </Hidden> </AppBar> ); } Header.defaultProp = { color: "white", }; Header.propTypes = { color: PropTypes.oneOf([ "primary", "info", "success", "warning", "danger", "transparent", "white", "rose", "dark", ]), rightLinks: PropTypes.node, leftLinks: PropTypes.node, brand: PropTypes.string, fixed: PropTypes.bool, absolute: PropTypes.bool, // this will cause the sidebar to change the color from // props.color (see above) to changeColorOnScroll.color // when the window.pageYOffset is heigher or equal to // changeColorOnScroll.height and then when it is smaller than // changeColorOnScroll.height change it back to // props.color (see above) changeColorOnScroll: PropTypes.shape({ height: PropTypes.number.isRequired, color: PropTypes.oneOf([ "primary", "info", "success", "warning", "danger", "transparent", "white", "rose", "dark", ]).isRequired, }), };