@scientist-softserv/webstore-component-library
Version:
A React component library intended for use with WebStore applications
72 lines (66 loc) • 2.28 kB
JSX
import React from 'react'
import PropTypes from 'prop-types'
import { Container, Nav, Navbar } from 'react-bootstrap'
import ToggleIcon from '../../assets/svg/ToggleIcon'
import Logo from '../Logo/Logo'
import './styles.scss'
const Header = ({ auth, linkColor, logo, navLinks, userSession }) => {
const { src, alt, logoUrl } = logo
return (
<Navbar bg='primary' expand='md'>
<Container>
<Navbar.Brand className='w-50 custom-navbar-brand'>
<Logo src={src} alt={alt} logoUrl={logoUrl} height='auto' addClass='mw-100 mh-100' />
</Navbar.Brand>
<Navbar.Toggle aria-controls='basic-navbar-nav'>
<ToggleIcon linkColor={linkColor} />
</Navbar.Toggle>
<Navbar.Collapse id='basic-navbar-nav'>
<Nav className='ms-auto'>
{navLinks.map((nav) => (
<Nav.Link
// ref https://github.com/twbs/bootstrap/blob/v5.2.3/scss/helpers/_colored-links.scss
// for how this className works
className={`link-${linkColor}`}
href={nav.path}
key={`${nav.label}-nav-link`}
onClick={nav.onClick}
>
{nav.label}
</Nav.Link>
))}
{userSession ? (
<Nav.Link className={`link-${linkColor}`} onClick={auth.signOut}>Sign Out</Nav.Link>
) : (
<Nav.Link className={`link-${linkColor}`} onClick={auth.signIn}>Sign In</Nav.Link>
)}
</Nav>
</Navbar.Collapse>
</Container>
</Navbar>
)
}
Header.propTypes = {
auth: PropTypes.shape({
signIn: PropTypes.func.isRequired,
signOut: PropTypes.func.isRequired,
}).isRequired,
linkColor: PropTypes.oneOf([
'primary', 'secondary', 'success', 'info', 'warning', 'danger', 'light', 'dark', 'black', 'white'
]),
logo: PropTypes.shape({
src: PropTypes.string.isRequired,
alt: PropTypes.string,
}).isRequired,
navLinks: PropTypes.arrayOf(PropTypes.shape({
label: PropTypes.string.isRequired,
onClick: PropTypes.func,
path: PropTypes.string,
})).isRequired,
userSession: PropTypes.shape({}),
}
Header.defaultProps = {
linkColor: 'dark',
userSession: null,
}
export default Header