import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePureComponent from 'react-immutable-pure-component' import { openSidebar } from '../actions/sidebar' import { openPopover } from '../actions/popover' import { BREAKPOINT_EXTRA_SMALL } from '../constants' import { me } from '../initial_state' import { makeGetAccount } from '../selectors' import Responsive from '../features/ui/util/responsive_component' import { CX, POPOVER_NAV_SETTINGS, } from '../constants' import Avatar from './avatar' import BackButton from './back_button' import Button from './button' import Heading from './heading' import Icon from './icon' import NavigationBarButton from './navigation_bar_button' import Search from './search' import Text from './text' const mapStateToProps = (state) => ({ account: makeGetAccount()(state, me), }) const mapDispatchToProps = (dispatch) => ({ onOpenSidebar() { dispatch(openSidebar()) }, onOpenNavSettingsPopover(targetRef) { dispatch(openPopover(POPOVER_NAV_SETTINGS, { targetRef, position: 'left-end', })) } }) export default @connect(mapStateToProps, mapDispatchToProps) class NavigationBar extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map, actions: PropTypes.array, tabs: PropTypes.array, title: PropTypes.string, showBackBtn: PropTypes.bool, onOpenSidebar: PropTypes.func.isRequired, onOpenNavSettingsPopover: PropTypes.func.isRequired, noActions: PropTypes.bool, noSearch: PropTypes.bool, } handleOnOpenNavSettingsPopover = () => { this.props.onOpenNavSettingsPopover(this.avatarNode) } setAvatarNode = (c) => { this.avatarNode = c } render() { const { title, showBackBtn, actions, tabs, account, onOpenSidebar, noActions, noSearch, } = this.props return ( <div className={[_s.default, _s.z4, _s.heightMin53PX, _s.width100PC].join(' ')}> <div className={[_s.default, _s.heightMin53PX, _s.bgNavigation, _s.alignItemsCenter, _s.z3, _s.top0, _s.right0, _s.left0, _s.posFixed].join(' ')} > <div className={[_s.default, _s.saveAreaInsetPT, _s.saveAreaInsetPL, _s.saveAreaInsetPR, _s.flexRow, _s.width1255PX].join(' ')}> { /** Default */} <Responsive min={BREAKPOINT_EXTRA_SMALL}> <div className={[_s.default, _s.flexRow].join(' ')}> <h1 className={[_s.default, _s.mr15].join(' ')}> <Button to='/' isText title='Gab' aria-label='Gab' color='none' backgroundColor='none' className={[_s.default, _s.justifyContentCenter, _s.noSelect, _s.noUnderline, _s.height53PX, _s.cursorPointer, _s.px10, _s.mr15].join(' ')} > <Icon id='logo' className={_s.fillNavigationBrand} /> </Button> </h1> { !noSearch && <div className={[_s.default, _s.width340PX, _s.mr10].join(' ')}> <Search isInNav /> </div> } </div> <div className={[_s.default, _s.mlAuto].join(' ')}> { !noActions && <div className={[_s.default, _s.height53PX, _s.pl15, _s.flexRow, _s.alignItemsCenter, _s.justifyContentSpaceBetween].join(' ')}> <NavigationBarButton title='Home' icon='home' to='/home' /> <NavigationBarButton title='Explore' icon='explore' to='/explore' /> <NavigationBarButton title='News' icon='news' to='/news' /> <NavigationBarButtonDivider /> <NavigationBarButton attrTitle='Notifications' icon='notifications' to='/notifications' /> <NavigationBarButton attrTitle='Settings' icon='cog' href='/settings/preferences' /> <NavigationBarButtonDivider /> { !!account && <button ref={this.setAvatarNode} title={account.get('display_name')} onClick={this.handleOnOpenNavSettingsPopover} className={[_s.height53PX, _s.bgTransparent, _s.outlineNone, _s.cursorPointer, _s.default, _s.justifyContentCenter, _s.ml15].join(' ')} > <Avatar account={account} size={32} noHover /> </button> } </div> } </div> </Responsive> { /** Mobile */} <Responsive max={BREAKPOINT_EXTRA_SMALL}> <div className={[_s.default, _s.width84PX, _s.alignItemsStart, _s.pl10].join(' ')}> { !!account && !showBackBtn && !noActions && <button title={account.get('display_name')} onClick={onOpenSidebar} className={[_s.height53PX, _s.bgTransparent, _s.outlineNone, _s.cursorPointer, _s.default, _s.justifyContentCenter].join(' ')} > <Avatar account={account} size={32} noHover /> </button> } { showBackBtn && <BackButton className={_s.height53PX} icon='angle-left' iconSize='18px' iconClassName={[_s.mr5, _s.fillNavigation].join(' ')} /> } { noActions && <h1 className={[_s.default, _s.mr15].join(' ')}> <Button to='/' isText title='Gab' aria-label='Gab' color='none' backgroundColor='none' className={[_s.default, _s.justifyContentCenter, _s.noSelect, _s.noUnderline, _s.height53PX, _s.cursorPointer, _s.px10, _s.mr15].join(' ')} > <Icon id='logo' className={_s.fillNavigationBrand} /> </Button> </h1> } </div> <div className={[_s.default, _s.height53PX, _s.justifyContentCenter, _s.mlAuto, _s.mrAuto].join(' ')}> <Heading size='h1'> <span className={_s.colorNavigation}> {title} </span> </Heading> </div> <div className={[_s.default, _s.width84PX, _s.pr15].join(' ')}> <div className={[_s.default, _s.bgTransparent, _s.flexRow, _s.alignItemsCenter, _s.justifyContentCenter, _s.mlAuto].join(' ')}> { actions && actions.map((action, i) => ( <Button isNarrow backgroundColor='none' color='primary' onClick={() => action.onClick()} key={`action-btn-${i}`} className={[_s.ml5, _s.height53PX, _s.justifyContentCenter, _s.px5].join(' ')} icon={action.icon} iconClassName={_s.fillNavigation} iconSize='18px' /> )) } { !noSearch && <Button isNarrow backgroundColor='none' color='primary' to='/search' key={`action-btn-search`} className={[_s.ml5, _s.height53PX, _s.justifyContentCenter, _s.px5].join(' ')} icon='search' iconClassName={_s.fillNavigation} iconSize='18px' /> } </div> </div> </Responsive> </div> </div> </div> ) } } class NavigationBarButtonDivider extends PureComponent { render() { return ( <div className={[_s.default, _s.height20PX, _s.width1PX, _s.mr10, _s.ml10, _s.bgNavigationBlend].join(' ')} /> ) } }