@rocketsofawesome/mirage
Version:
[Live Demo of the Pattern Library](https://rocketsofawesome.github.io/mirage/)
297 lines (281 loc) • 7.7 kB
JavaScript
import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'
import {
Accordion,
BagIcon,
SearchIcon,
BlueHamburger,
Logo,
MenuDrawer,
MobileHeader,
MobileLinkSecondary,
MobileLinkTertiary,
MobileLinkTop,
MobileAccountLinks,
UL
} from 'SRC'
import { theme } from 'SRC/core/theme'
const { REACT_APP_SHOW_BLOG_LINK } = process.env
export class BaseMobileNavigation extends React.Component {
constructor (props) {
super(props)
this.state = { open: false }
}
closeDrawer = () => {
this.setState({ open: false })
}
openDrawer = () => {
this.setState({ open: true })
}
render () {
const {
boysLinks,
girlsLinks,
className,
drawerPosition,
loggedIn,
renderLink,
showSubscriptionLinks,
bagCount,
clickBag,
clickSearch,
showBlog,
showSearch,
signOut
} = this.props
const { open } = this.state
return (
<div className={className}>
<MobileHeader>
<BlueHamburger onClick={this.openDrawer} />
<MobileLinkTop
className='link-home'
href='/'
renderLink={renderLink}
>
<span className='screenReader'>Home</span>
<Logo />
</MobileLinkTop>
<div className={showSearch ? 'icons-search-bag' : undefined}>
{showSearch &&
<a onClick={clickSearch}>
<SearchIcon />
</a>
}
{showSearch &&
<span className='divider-search'>|</span>
}
<a onClick={clickBag}>
<BagIcon count={bagCount} />
</a>
</div>
</MobileHeader>
<MenuDrawer
open={open}
closeDrawer={this.closeDrawer}
position={drawerPosition}>
<UL leftPad='1.4rem' type='none'>
<li>
<MobileLinkTop
target='/shop'
renderLink={renderLink}
>
Shop
</MobileLinkTop>
<UL
leftPad='1rem'
type='none'
>
<li>
<Accordion
toggleElement={
<MobileLinkSecondary>Boys</MobileLinkSecondary>
}>
<UL
type='none'
leftPad='1rem'
>
{boysLinks && boysLinks.map((link, index) => {
return (
<li key={index}>
<MobileLinkTertiary target={link.target} renderLink={renderLink}>
{link.text}
</MobileLinkTertiary>
</li>
)
})}
</UL>
</Accordion>
</li>
<li>
<Accordion
toggleElement={
<MobileLinkSecondary>Girls</MobileLinkSecondary>
}>
<UL type='none' leftPad='1rem'>
{girlsLinks && girlsLinks.map((link, index) => {
return (
<li key={index}>
<MobileLinkTertiary
target={link.target}
renderLink={renderLink}
>
{link.text}
</MobileLinkTertiary>
</li>
)
})}
</UL>
</Accordion>
</li>
<li>
<MobileLinkSecondary target='/shop/baby' renderLink={renderLink}>
Baby
</MobileLinkSecondary>
</li>
</UL>
</li>
<li>
<MobileLinkTop href='/outfits'>
Outfits
</MobileLinkTop>
</li>
<li>
<MobileLinkTop href='/bundles'>
Bundles
</MobileLinkTop>
</li>
{!showSubscriptionLinks &&
<div>
<li>
<MobileLinkTop href='/shop/sale'>
Sale
</MobileLinkTop>
</li>
<li>
<MobileLinkTop href='/subscribe-and-save'>
Subscribe + Save
</MobileLinkTop>
</li>
</div>
}
{showSubscriptionLinks &&
<div>
<li>
<MobileLinkTop href='/shop/sale'>
Sale
</MobileLinkTop>
</li>
<li>
<MobileLinkTop
target='/box'
renderLink={renderLink}
>
Box
</MobileLinkTop>
</li>
<li>
<MobileLinkTop
target='/invite'
renderLink={renderLink}
background={theme.colors.lightPink}
>
Refer a Friend
</MobileLinkTop>
</li>
<li>
<MobileLinkTop
target='/style-file'
renderLink={renderLink}
>
Style File
</MobileLinkTop>
</li>
<li>
<MobileLinkTop
target='/orders'
renderLink={renderLink}
>
Order History
</MobileLinkTop>
</li>
</div>
}
{!loggedIn &&
<li>
<MobileLinkTop
target='/shop/login'
renderLink={renderLink}
>
Login
</MobileLinkTop>
</li>
}
{showBlog &&
<li>
<MobileLinkTop href={`https://news.rocketsofawesome.com`}>
Blog
</MobileLinkTop>
</li>
}
{loggedIn &&
<MobileAccountLinks
showSubscriptionLinks
renderLink={renderLink}
signOut={signOut}
/>
}
</UL>
</MenuDrawer>
</div>
)
}
}
const MobileNavigation = styled(BaseMobileNavigation)`
.link-home {
margin-bottom: 0;
padding: 0;
}
.screenReader {
font-size: 0;
}
${Logo} {
padding: 0;
max-width: 22.4rem;
}
ul ul {
margin-bottom: 2rem;
}
ul ul ul {
margin-bottom: 0;
}
.divider-search {
margin-left: 7px;
margin-right: 7px;
font-size: 2rem;
color: #0073D1;
}
.icons-search-bag {
width: 72px;
}
`
MobileNavigation.propTypes = {
drawerPosition: PropTypes.string,
bagCount: PropTypes.number,
boysLinks: PropTypes.array,
girlsLinks: PropTypes.array,
className: PropTypes.string,
loggedIn: PropTypes.bool,
renderLink: PropTypes.func,
showSubscriptionLinks: PropTypes.bool,
clickBag: PropTypes.func,
clickSearch: PropTypes.func
}
MobileNavigation.defaultProps = {
drawerPosition: 'fixed',
showBlog: REACT_APP_SHOW_BLOG_LINK,
showSearch: false
}
/** @component */
export default MobileNavigation