parent
9a2f10fe8b
commit
281a82d878
@ -0,0 +1,124 @@ |
||||
// Package imports.
|
||||
import PropTypes from 'prop-types'; |
||||
import React from 'react'; |
||||
import ImmutablePropTypes from 'react-immutable-proptypes'; |
||||
import { injectIntl, defineMessages } from 'react-intl'; |
||||
import { Link } from 'react-router-dom'; |
||||
import ImmutablePureComponent from 'react-immutable-pure-component'; |
||||
|
||||
// Components.
|
||||
import Icon from 'flavours/glitch/components/icon'; |
||||
|
||||
// Utils.
|
||||
import { conditionalRender } from 'flavours/glitch/util/react_helpers'; |
||||
import { signOutLink } from 'flavours/glitch/util/backend_links'; |
||||
|
||||
// Messages.
|
||||
const messages = defineMessages({ |
||||
community: { |
||||
defaultMessage: 'Local timeline', |
||||
id: 'navigation_bar.community_timeline', |
||||
}, |
||||
home_timeline: { |
||||
defaultMessage: 'Home', |
||||
id: 'tabs_bar.home', |
||||
}, |
||||
logout: { |
||||
defaultMessage: 'Logout', |
||||
id: 'navigation_bar.logout', |
||||
}, |
||||
notifications: { |
||||
defaultMessage: 'Notifications', |
||||
id: 'tabs_bar.notifications', |
||||
}, |
||||
public: { |
||||
defaultMessage: 'Federated timeline', |
||||
id: 'navigation_bar.public_timeline', |
||||
}, |
||||
settings: { |
||||
defaultMessage: 'App settings', |
||||
id: 'navigation_bar.app_settings', |
||||
}, |
||||
start: { |
||||
defaultMessage: 'Getting started', |
||||
id: 'getting_started.heading', |
||||
}, |
||||
}); |
||||
|
||||
export default @injectIntl |
||||
class Header extends ImmutablePureComponent { |
||||
static propTypes = { |
||||
columns: ImmutablePropTypes.list, |
||||
unreadNotifications: PropTypes.number, |
||||
showNotificationsBadge: PropTypes.bool, |
||||
intl: PropTypes.object, |
||||
onSettingsClick: PropTypes.func, |
||||
}; |
||||
|
||||
render () { |
||||
const { intl, columns, unreadNotifications, showNotificationsBadge, onSettingsClick } = this.props; |
||||
|
||||
// Only renders the component if the column isn't being shown.
|
||||
const renderForColumn = conditionalRender.bind(null, |
||||
columnId => !columns || !columns.some( |
||||
column => column.get('id') === columnId |
||||
) |
||||
); |
||||
|
||||
// The result.
|
||||
return ( |
||||
<nav className='drawer--header'> |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.start)} |
||||
title={intl.formatMessage(messages.start)} |
||||
to='/getting-started' |
||||
><Icon icon='asterisk' /></Link> |
||||
{renderForColumn('HOME', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.home_timeline)} |
||||
title={intl.formatMessage(messages.home_timeline)} |
||||
to='/timelines/home' |
||||
><Icon icon='home' /></Link> |
||||
))} |
||||
{renderForColumn('NOTIFICATIONS', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.notifications)} |
||||
title={intl.formatMessage(messages.notifications)} |
||||
to='/notifications' |
||||
> |
||||
<span className='icon-badge-wrapper'> |
||||
<Icon icon='bell' /> |
||||
{ showNotificationsBadge && unreadNotifications > 0 && <div className='icon-badge' />} |
||||
</span> |
||||
</Link> |
||||
))} |
||||
{renderForColumn('COMMUNITY', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.community)} |
||||
title={intl.formatMessage(messages.community)} |
||||
to='/timelines/public/local' |
||||
><Icon icon='users' /></Link> |
||||
))} |
||||
{renderForColumn('PUBLIC', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.public)} |
||||
title={intl.formatMessage(messages.public)} |
||||
to='/timelines/public' |
||||
><Icon icon='globe' /></Link> |
||||
))} |
||||
<a |
||||
aria-label={intl.formatMessage(messages.settings)} |
||||
onClick={onSettingsClick} |
||||
href='#' |
||||
title={intl.formatMessage(messages.settings)} |
||||
><Icon icon='cogs' /></a> |
||||
<a |
||||
aria-label={intl.formatMessage(messages.logout)} |
||||
data-method='delete' |
||||
href={ signOutLink } |
||||
title={intl.formatMessage(messages.logout)} |
||||
><Icon icon='sign-out' /></a> |
||||
</nav> |
||||
); |
||||
}; |
||||
} |
@ -0,0 +1,21 @@ |
||||
import { openModal } from 'flavours/glitch/actions/modal'; |
||||
import { connect } from 'react-redux'; |
||||
import Header from '../components/header'; |
||||
|
||||
const mapStateToProps = state => { |
||||
return { |
||||
columns: state.getIn(['settings', 'columns']), |
||||
unreadNotifications: state.getIn(['notifications', 'unread']), |
||||
showNotificationsBadge: state.getIn(['local_settings', 'notifications', 'tab_badge']), |
||||
}; |
||||
}; |
||||
|
||||
const mapDispatchToProps = (dispatch, { intl }) => ({ |
||||
onOpenSettings (e) { |
||||
e.preventDefault(); |
||||
e.stopPropagation(); |
||||
dispatch(openModal('SETTINGS', {})); |
||||
}, |
||||
}); |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(Header); |
@ -1,127 +0,0 @@ |
||||
// Package imports.
|
||||
import PropTypes from 'prop-types'; |
||||
import React from 'react'; |
||||
import ImmutablePropTypes from 'react-immutable-proptypes'; |
||||
import { defineMessages } from 'react-intl'; |
||||
import { Link } from 'react-router-dom'; |
||||
|
||||
// Components.
|
||||
import Icon from 'flavours/glitch/components/icon'; |
||||
|
||||
// Utils.
|
||||
import { conditionalRender } from 'flavours/glitch/util/react_helpers'; |
||||
import { signOutLink } from 'flavours/glitch/util/backend_links'; |
||||
|
||||
// Messages.
|
||||
const messages = defineMessages({ |
||||
community: { |
||||
defaultMessage: 'Local timeline', |
||||
id: 'navigation_bar.community_timeline', |
||||
}, |
||||
home_timeline: { |
||||
defaultMessage: 'Home', |
||||
id: 'tabs_bar.home', |
||||
}, |
||||
logout: { |
||||
defaultMessage: 'Logout', |
||||
id: 'navigation_bar.logout', |
||||
}, |
||||
notifications: { |
||||
defaultMessage: 'Notifications', |
||||
id: 'tabs_bar.notifications', |
||||
}, |
||||
public: { |
||||
defaultMessage: 'Federated timeline', |
||||
id: 'navigation_bar.public_timeline', |
||||
}, |
||||
settings: { |
||||
defaultMessage: 'App settings', |
||||
id: 'navigation_bar.app_settings', |
||||
}, |
||||
start: { |
||||
defaultMessage: 'Getting started', |
||||
id: 'getting_started.heading', |
||||
}, |
||||
}); |
||||
|
||||
// The component.
|
||||
export default function DrawerHeader ({ |
||||
columns, |
||||
unreadNotifications, |
||||
showNotificationsBadge, |
||||
intl, |
||||
onSettingsClick, |
||||
}) { |
||||
|
||||
// Only renders the component if the column isn't being shown.
|
||||
const renderForColumn = conditionalRender.bind(null, |
||||
columnId => !columns || !columns.some( |
||||
column => column.get('id') === columnId |
||||
) |
||||
); |
||||
|
||||
// The result.
|
||||
return ( |
||||
<nav className='drawer--header'> |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.start)} |
||||
title={intl.formatMessage(messages.start)} |
||||
to='/getting-started' |
||||
><Icon icon='asterisk' /></Link> |
||||
{renderForColumn('HOME', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.home_timeline)} |
||||
title={intl.formatMessage(messages.home_timeline)} |
||||
to='/timelines/home' |
||||
><Icon icon='home' /></Link> |
||||
))} |
||||
{renderForColumn('NOTIFICATIONS', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.notifications)} |
||||
title={intl.formatMessage(messages.notifications)} |
||||
to='/notifications' |
||||
> |
||||
<span className='icon-badge-wrapper'> |
||||
<Icon icon='bell' /> |
||||
{ showNotificationsBadge && unreadNotifications > 0 && <div className='icon-badge' />} |
||||
</span> |
||||
</Link> |
||||
))} |
||||
{renderForColumn('COMMUNITY', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.community)} |
||||
title={intl.formatMessage(messages.community)} |
||||
to='/timelines/public/local' |
||||
><Icon icon='users' /></Link> |
||||
))} |
||||
{renderForColumn('PUBLIC', ( |
||||
<Link |
||||
aria-label={intl.formatMessage(messages.public)} |
||||
title={intl.formatMessage(messages.public)} |
||||
to='/timelines/public' |
||||
><Icon icon='globe' /></Link> |
||||
))} |
||||
<a |
||||
aria-label={intl.formatMessage(messages.settings)} |
||||
onClick={onSettingsClick} |
||||
href='#' |
||||
title={intl.formatMessage(messages.settings)} |
||||
><Icon icon='cogs' /></a> |
||||
<a |
||||
aria-label={intl.formatMessage(messages.logout)} |
||||
data-method='delete' |
||||
href={ signOutLink } |
||||
title={intl.formatMessage(messages.logout)} |
||||
><Icon icon='sign-out' /></a> |
||||
</nav> |
||||
); |
||||
} |
||||
|
||||
// Props.
|
||||
DrawerHeader.propTypes = { |
||||
columns: ImmutablePropTypes.list, |
||||
unreadNotifications: PropTypes.number, |
||||
showNotificationsBadge: PropTypes.bool, |
||||
intl: PropTypes.object, |
||||
onSettingsClick: PropTypes.func, |
||||
}; |
Loading…
Reference in new issue