SidebarNav.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import {
  5. GlobalNav,
  6. } from '@atlaskit/navigation-next';
  7. import { createSubscribedElement } from '../UnstatedUtils';
  8. import AppContainer from '../../services/AppContainer';
  9. class SidebarNav extends React.Component {
  10. static propTypes = {
  11. currentContentsId: PropTypes.string,
  12. onItemSelected: PropTypes.func,
  13. };
  14. state = {
  15. };
  16. itemSelectedHandler = (contentsId) => {
  17. const { onItemSelected } = this.props;
  18. if (onItemSelected != null) {
  19. onItemSelected(contentsId);
  20. }
  21. }
  22. generatePrimaryItemObj(id, label, iconName) {
  23. const isSelected = this.props.currentContentsId === id;
  24. return {
  25. id,
  26. component: ({ className }) => (
  27. <div className={`${className} grw-global-item-container ${isSelected ? 'active' : ''}`}>
  28. <button
  29. type="button"
  30. className={`btn btn-primary btn-lg ${isSelected ? 'active' : ''}`}
  31. onClick={() => this.itemSelectedHandler(id)}
  32. >
  33. <i className="material-icons">{iconName}</i>
  34. </button>
  35. </div>
  36. ),
  37. };
  38. }
  39. generateSecondaryItemObj(id, label, iconName, href, isBlank) {
  40. return {
  41. id,
  42. component: ({ className }) => (
  43. <div className={`${className} grw-global-item-container`}>
  44. <a href={href} className="btn btn-primary" target={`${isBlank ? '_blank' : ''}`}>
  45. <i className="material-icons">{iconName}</i>
  46. </a>
  47. </div>
  48. ),
  49. };
  50. }
  51. generateIconFactory(classNames) {
  52. return () => <i className={classNames}></i>;
  53. }
  54. render() {
  55. const { isAdmin, currentUsername } = this.props.appContainer;
  56. const isLoggedIn = currentUsername != null;
  57. const primaryItems = [
  58. this.generatePrimaryItemObj('custom', 'Custom Sidebar', 'code'),
  59. this.generatePrimaryItemObj('recent', 'Recent Changes', 'update'),
  60. // this.generatePrimaryItemObj('tag', 'Tags', 'icon-tag'),
  61. // this.generatePrimaryItemObj('favorite', 'Favorite', 'icon-star'),
  62. ];
  63. let secondaryItems = [
  64. isAdmin && (
  65. this.generateSecondaryItemObj('admin', 'Admin', 'settings', '/admin')
  66. ),
  67. isLoggedIn && (
  68. this.generateSecondaryItemObj('draft', 'Draft', 'file_copy', `/user/${currentUsername}#user-draft-list`)
  69. ),
  70. this.generateSecondaryItemObj('help', 'Help', 'help', 'https://docs.growi.org', true),
  71. isLoggedIn && (
  72. this.generateSecondaryItemObj('trash', 'Trash', 'delete', '/trash')
  73. ),
  74. ];
  75. // remove 'false' items
  76. secondaryItems = secondaryItems.filter(item => item !== false);
  77. return (
  78. <GlobalNav
  79. primaryItems={primaryItems}
  80. secondaryItems={secondaryItems}
  81. />
  82. );
  83. }
  84. }
  85. SidebarNav.propTypes = {
  86. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  87. };
  88. /**
  89. * Wrapper component for using unstated
  90. */
  91. const SidebarNavWrapper = (props) => {
  92. return createSubscribedElement(SidebarNav, props, [AppContainer]);
  93. };
  94. export default withTranslation()(SidebarNavWrapper);