ndla-ui
Version:
UI component library for NDLA.
146 lines (140 loc) • 4.39 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import BEMHelper from 'react-bem-helper';
import { Cross } from 'ndla-icons/action';
import { SearchField, OneColumn, Logo, SafeLink } from 'ndla-ui';
import Modal, { ModalHeader } from 'ndla-modal';
import Button from 'ndla-button';
import { uuid } from 'ndla-util';
import { injectT } from 'ndla-i18n';
const classes = BEMHelper('c-frontpage-header');
const classesMenu = new BEMHelper({
name: 'topic-menu',
prefix: 'c-',
});
const FrontpageHeader = ({
searchFieldValue,
onSearchFieldChange,
onSearch,
searchFieldPlaceholder,
links,
logoTo,
messages,
locale,
menuSubject,
hideSearch,
hideMenu,
t,
}) => (
<header {...classes()}>
<div {...classes('inner-background')} />
<div {...classes('wrapper')}>
<OneColumn wide noPadding>
<nav {...classes('navigation')}>
<ul>
{links.map(link => (
<li key={link.to}>
<SafeLink to={link.to}>{link.text}</SafeLink>
</li>
))}
</ul>
</nav>
</OneColumn>
<OneColumn wide noPadding>
<div {...classes('content')}>
{!hideMenu && (
<Modal
size="fullscreen"
animation="subtle"
backgroundColor="gray-dark"
activateButton={
<Button className="c-frontpage-header__menu-button">
Meny
</Button>
}>
{closeMenu => (
<nav>
<ModalHeader modifier={['white', 'menu']}>
<div {...classesMenu('masthead-left')}>
<button
type="button"
{...classesMenu('close-button')}
onClick={closeMenu}>
<Cross />
<span>Lukk</span>
</button>
</div>
<div {...classesMenu('masthead-right')}>
<Logo
to={logoTo}
label={t('logo.altText')}
cssModifier="always-show"
locale={locale}
/>
</div>
</ModalHeader>
<div {...classesMenu('content', 'fill-page')}>
{menuSubject}
<div {...classes('main-menu-content')}>
<ul {...classesMenu('content-type-results')}>
{links.map(link => (
<li key={uuid()}>
<SafeLink to={link.to}>{link.text}</SafeLink>
</li>
))}
</ul>
</div>
</div>
</nav>
)}
</Modal>
)}
<Logo
to={logoTo}
large
color="currentColor"
label={t('logo.altText')}
cssModifier="white"
locale={locale}
/>
{!hideSearch && (
<SearchField
value={searchFieldValue}
onChange={onSearchFieldChange}
placeholder={searchFieldPlaceholder}
messages={messages}
onSearch={onSearch}
/>
)}
</div>
</OneColumn>
</div>
</header>
);
FrontpageHeader.propTypes = {
hideSearch: PropTypes.bool, // TODO: Search is temporary hidden as default.
hideMenu: PropTypes.bool, // TODO: Menu is temporary hidden as default.
searchFieldValue: PropTypes.string.isRequired,
onSearchFieldChange: PropTypes.func.isRequired,
onSearch: PropTypes.func,
searchFieldPlaceholder: PropTypes.string.isRequired,
logoTo: PropTypes.string,
locale: PropTypes.string,
messages: PropTypes.shape({
searchFieldTitle: PropTypes.string.isRequired,
menuButton: PropTypes.string.isRequired,
}).isRequired,
menuSubject: PropTypes.node.isRequired,
links: PropTypes.arrayOf(
PropTypes.shape({
to: PropTypes.string.isRequired,
text: PropTypes.string.isRequired,
}),
).isRequired,
t: PropTypes.func.isRequired,
};
FrontpageHeader.defaultProps = {
hideSearch: true,
hideMenu: true,
};
export default injectT(FrontpageHeader);