You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.0 KiB

  1. // Package imports.
  2. import PropTypes from 'prop-types';
  3. import React from 'react';
  4. import ImmutablePropTypes from 'react-immutable-proptypes';
  5. import { injectIntl, defineMessages } from 'react-intl';
  6. import { Link } from 'react-router-dom';
  7. import ImmutablePureComponent from 'react-immutable-pure-component';
  8. // Components.
  9. import Icon from 'flavours/glitch/components/icon';
  10. // Utils.
  11. import { conditionalRender } from 'flavours/glitch/utils/react_helpers';
  12. import { signOutLink } from 'flavours/glitch/utils/backend_links';
  13. // Messages.
  14. const messages = defineMessages({
  15. community: {
  16. defaultMessage: 'Local timeline',
  17. id: 'navigation_bar.community_timeline',
  18. },
  19. home_timeline: {
  20. defaultMessage: 'Home',
  21. id: 'tabs_bar.home',
  22. },
  23. logout: {
  24. defaultMessage: 'Logout',
  25. id: 'navigation_bar.logout',
  26. },
  27. notifications: {
  28. defaultMessage: 'Notifications',
  29. id: 'tabs_bar.notifications',
  30. },
  31. public: {
  32. defaultMessage: 'Federated timeline',
  33. id: 'navigation_bar.public_timeline',
  34. },
  35. settings: {
  36. defaultMessage: 'App settings',
  37. id: 'navigation_bar.app_settings',
  38. },
  39. start: {
  40. defaultMessage: 'Getting started',
  41. id: 'getting_started.heading',
  42. },
  43. });
  44. class Header extends ImmutablePureComponent {
  45. static propTypes = {
  46. columns: ImmutablePropTypes.list,
  47. unreadNotifications: PropTypes.number,
  48. showNotificationsBadge: PropTypes.bool,
  49. intl: PropTypes.object,
  50. onSettingsClick: PropTypes.func,
  51. onLogout: PropTypes.func.isRequired,
  52. };
  53. handleLogoutClick = e => {
  54. e.preventDefault();
  55. e.stopPropagation();
  56. this.props.onLogout();
  57. return false;
  58. };
  59. render () {
  60. const { intl, columns, unreadNotifications, showNotificationsBadge, onSettingsClick } = this.props;
  61. // Only renders the component if the column isn't being shown.
  62. const renderForColumn = conditionalRender.bind(null,
  63. columnId => !columns || !columns.some(
  64. column => column.get('id') === columnId,
  65. ),
  66. );
  67. // The result.
  68. return (
  69. <nav className='drawer--header'>
  70. <Link
  71. aria-label={intl.formatMessage(messages.start)}
  72. title={intl.formatMessage(messages.start)}
  73. to='/getting-started'
  74. ><Icon id='asterisk' /></Link>
  75. {renderForColumn('HOME', (
  76. <Link
  77. aria-label={intl.formatMessage(messages.home_timeline)}
  78. title={intl.formatMessage(messages.home_timeline)}
  79. to='/home'
  80. ><Icon id='home' /></Link>
  81. ))}
  82. {renderForColumn('NOTIFICATIONS', (
  83. <Link
  84. aria-label={intl.formatMessage(messages.notifications)}
  85. title={intl.formatMessage(messages.notifications)}
  86. to='/notifications'
  87. >
  88. <span className='icon-badge-wrapper'>
  89. <Icon id='bell' />
  90. { showNotificationsBadge && unreadNotifications > 0 && <div className='icon-badge' />}
  91. </span>
  92. </Link>
  93. ))}
  94. {renderForColumn('COMMUNITY', (
  95. <Link
  96. aria-label={intl.formatMessage(messages.community)}
  97. title={intl.formatMessage(messages.community)}
  98. to='/public/local'
  99. ><Icon id='users' /></Link>
  100. ))}
  101. {renderForColumn('PUBLIC', (
  102. <Link
  103. aria-label={intl.formatMessage(messages.public)}
  104. title={intl.formatMessage(messages.public)}
  105. to='/public'
  106. ><Icon id='globe' /></Link>
  107. ))}
  108. <a
  109. aria-label={intl.formatMessage(messages.settings)}
  110. onClick={onSettingsClick}
  111. href='/settings/preferences'
  112. title={intl.formatMessage(messages.settings)}
  113. ><Icon id='cogs' /></a>
  114. <a
  115. aria-label={intl.formatMessage(messages.logout)}
  116. onClick={this.handleLogoutClick}
  117. href={signOutLink}
  118. title={intl.formatMessage(messages.logout)}
  119. ><Icon id='sign-out' /></a>
  120. </nav>
  121. );
  122. }
  123. }
  124. export default injectIntl(Header);