GrowiSubNavigation.jsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { isTrashPage } from '@commons/util/path-utils';
  5. import { createSubscribedElement } from '../UnstatedUtils';
  6. import AppContainer from '../../services/AppContainer';
  7. import RevisionPath from '../Page/RevisionPath';
  8. import PageContainer from '../../services/PageContainer';
  9. import TagLabels from '../Page/TagLabels';
  10. import LikeButton from '../LikeButton';
  11. import BookmarkButton from '../BookmarkButton';
  12. import PageCreator from './PageCreator';
  13. import RevisionAuthor from './RevisionAuthor';
  14. const GrowiSubNavigation = (props) => {
  15. const isPageForbidden = document.querySelector('#grw-subnav').getAttribute('data-is-forbidden-page') === 'true';
  16. const { appContainer, pageContainer } = props;
  17. const {
  18. pageId, path, createdAt, creator, updatedAt, revisionAuthor, isHeaderSticky, isSubnavCompact,
  19. } = pageContainer.state;
  20. const isPageNotFound = pageId == null;
  21. const isPageInTrash = isTrashPage(path);
  22. console.log({
  23. isPageForbidden, isPageNotFound, isPageInTrash, pageId, path,
  24. });
  25. // Display only the RevisionPath
  26. if (isPageNotFound || isPageForbidden || isPageInTrash) {
  27. return (
  28. <div className="d-flex align-items-center px-3 py-3 grw-subnavbar">
  29. <h1 className="m-0">
  30. <RevisionPath
  31. behaviorType={appContainer.config.behaviorType}
  32. pageId={pageId}
  33. pagePath={pageContainer.state.path}
  34. isPageNotFound={isPageNotFound}
  35. isPageForbidden={isPageForbidden}
  36. isPageInTrash={isPageInTrash}
  37. />
  38. </h1>
  39. </div>
  40. );
  41. }
  42. const additionalClassNames = ['grw-subnavbar'];
  43. if (isHeaderSticky) {
  44. additionalClassNames.push('grw-subnavbar-sticky');
  45. }
  46. if (isSubnavCompact) {
  47. additionalClassNames.push('grw-subnavbar-compact');
  48. }
  49. return (
  50. <div className={`d-flex align-items-center justify-content-between px-3 py-1 ${additionalClassNames.join(' ')}`}>
  51. {/* Page Path */}
  52. <div>
  53. <h1 className="m-0">
  54. <RevisionPath behaviorType={appContainer.config.behaviorType} pageId={pageId} pagePath={pageContainer.state.path} />
  55. </h1>
  56. { !isPageNotFound && !isPageForbidden && (
  57. <TagLabels />
  58. ) }
  59. </div>
  60. <div className="d-flex align-items-center">
  61. {/* Header Button */}
  62. <div className="mr-2">
  63. <LikeButton pageId={pageId} isLiked={pageContainer.state.isLiked} />
  64. </div>
  65. <div>
  66. <BookmarkButton pageId={pageId} crowi={appContainer} />
  67. </div>
  68. {/* Page Authors */}
  69. <ul className="authors text-nowrap d-none d-lg-block">
  70. { creator != null && (
  71. <li>
  72. <PageCreator creator={creator} createdAt={createdAt} isCompactMode={isSubnavCompact} />
  73. </li>
  74. ) }
  75. { revisionAuthor != null && (
  76. <li className="mt-1">
  77. <RevisionAuthor revisionAuthor={revisionAuthor} updatedAt={updatedAt} isCompactMode={isSubnavCompact} />
  78. </li>
  79. ) }
  80. </ul>
  81. </div>
  82. </div>
  83. );
  84. };
  85. /**
  86. * Wrapper component for using unstated
  87. */
  88. const GrowiSubNavigationWrapper = (props) => {
  89. return createSubscribedElement(GrowiSubNavigation, props, [AppContainer, PageContainer]);
  90. };
  91. GrowiSubNavigation.propTypes = {
  92. t: PropTypes.func.isRequired, // i18next
  93. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  94. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  95. };
  96. export default withTranslation()(GrowiSubNavigationWrapper);