stream/src/components/Header/index.js

67 lines
2.4 KiB
JavaScript
Raw Normal View History

2021-10-15 13:37:54 +00:00
import { h } from 'preact'
import { Link as ReactLink } from 'react-router-dom'
2021-10-20 14:32:27 +00:00
import { RightBox, StyledRow as Row, Modal } from './styles'
2021-10-15 13:37:54 +00:00
import { ImageLogo } from '../Logo'
2021-10-20 14:32:27 +00:00
import { useWindowSize } from '../../hooks/dom'
2021-10-15 13:37:54 +00:00
import Link from '../Link'
2021-10-20 14:32:27 +00:00
import { Span } from '../Text'
import CrossSvg from '../Svg/Cross'
2021-10-15 13:37:54 +00:00
import navigation from '../../data/navigation'
2021-10-20 14:32:27 +00:00
import { colours, screenSizes, textSizes } from '../../assets/theme'
import { useToggle } from '../../hooks/utility'
2021-10-15 13:37:54 +00:00
2021-10-20 14:32:27 +00:00
const Navigation = ({ theme = {}, lang = 'en', headerTheme }) => navigation[lang].map(navItem => (
<Link
navLink
to={navItem.to}
href={navItem.href}
textProps={{
size: textSizes.xl,
colour: headerTheme.foreground || theme.foreground || colours.rose
}}>
{navItem.label}
</Link>
))
2021-10-15 13:37:54 +00:00
2021-10-20 14:32:27 +00:00
const NavigationModal = ({ theme = {}, lang = 'en', headerTheme, toggleMenuOpen, ...rest }) => (
<Modal theme={theme} {...rest}>
2021-10-15 13:37:54 +00:00
<ReactLink to="/">
<ImageLogo />
</ReactLink>
2021-10-20 14:32:27 +00:00
<CrossSvg size={32} colour={theme.foreground} onClick={toggleMenuOpen} />
<div>
<Navigation theme={theme} lang={lang} headerTheme={theme} {...rest} />
</div>
</Modal>
2021-10-15 13:37:54 +00:00
)
2021-10-20 14:32:27 +00:00
const FullHeader = ({ theme = {}, headerTheme = {}, lang = 'en', miniHeader, isMobile, toggleMenuOpen, ...rest }) => (
<Row theme={headerTheme} align="center" justify="space-between" miniHeader={miniHeader} {...rest}>
{!miniHeader ? <ReactLink to="/">
<ImageLogo />
</ReactLink> : null}
{!isMobile ? (
<RightBox as="nav">
<Navigation theme={theme} lang={lang} headerTheme={headerTheme} {...rest} />
</RightBox>
) : <Span onClick={toggleMenuOpen} size={textSizes.xl} colour={headerTheme.foreground || theme.foreground || colours.rose} fontFamily="Lunchtype24"
>Menu</Span>}
2021-10-15 13:37:54 +00:00
</Row>
)
2021-10-20 14:32:27 +00:00
const Header = ({ miniHeader, theme, ...rest }) => {
const headerTheme = { foreground: theme.background, background: 'transparent', }
const { width: screenWidth } = useWindowSize()
const [menuOpen, toggleMenuOpen] = useToggle(false)
const isMobile = screenWidth < screenSizes.lg
if (menuOpen) return <NavigationModal toggleMenuOpen={toggleMenuOpen} theme={theme} headerTheme={headerTheme} {...rest} />
return <FullHeader toggleMenuOpen={toggleMenuOpen} menuOpen={menuOpen} miniHeader={miniHeader} isMobile={isMobile} theme={theme} headerTheme={headerTheme} {...rest} />
}
2021-10-15 13:37:54 +00:00
export default Header