SubNavButtons.jsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import AppContainer from '~/client/services/AppContainer';
  4. import NavigationContainer from '~/client/services/NavigationContainer';
  5. import PageContainer from '~/client/services/PageContainer';
  6. import { withUnstatedContainers } from '../UnstatedUtils';
  7. import BookmarkButton from '../BookmarkButton';
  8. import LikeButtons from '../LikeButtons';
  9. import PageManagement from '../Page/PageManagement';
  10. import loggerFactory from '~/utils/logger';
  11. const logger = loggerFactory('growi:SubnavButtons');
  12. const SubnavButtons = (props) => {
  13. const {
  14. appContainer, navigationContainer, pageContainer, isCompactMode,
  15. } = props;
  16. /* eslint-enable react/prop-types */
  17. /* eslint-disable react/prop-types */
  18. const PageReactionButtons = ({ pageContainer }) => {
  19. const {
  20. state: {
  21. pageId, likers, sumOfLikers, isLiked,
  22. },
  23. } = pageContainer;
  24. const onChangeInvoked = () => {
  25. if (pageContainer.retrieveLikersAndSeenUsers == null) {
  26. logger.error('retrieveBookmarkInfo is null');
  27. }
  28. else {
  29. pageContainer.setStateAfterLike();
  30. pageContainer.retrieveLikersAndSeenUsers();
  31. }
  32. };
  33. return (
  34. <>
  35. {pageContainer.isAbleToShowLikeButtons && (
  36. <span>
  37. <LikeButtons onChangeInvoked={onChangeInvoked} pageId={pageId} likers={likers} sumOfLikers={sumOfLikers} isLiked={isLiked} />
  38. </span>
  39. )}
  40. <span>
  41. <BookmarkButton />
  42. </span>
  43. </>
  44. );
  45. };
  46. /* eslint-enable react/prop-types */
  47. const { editorMode } = navigationContainer.state;
  48. const isViewMode = editorMode === 'view';
  49. return (
  50. <>
  51. {isViewMode && (
  52. <>
  53. {pageContainer.isAbleToShowPageReactionButtons && <PageReactionButtons appContainer={appContainer} pageContainer={pageContainer} />}
  54. {pageContainer.isAbleToShowPageManagement && <PageManagement isCompactMode={isCompactMode} />}
  55. </>
  56. )}
  57. </>
  58. );
  59. };
  60. /**
  61. * Wrapper component for using unstated
  62. */
  63. const SubnavButtonsWrapper = withUnstatedContainers(SubnavButtons, [AppContainer, NavigationContainer, PageContainer]);
  64. SubnavButtons.propTypes = {
  65. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  66. navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
  67. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  68. isCompactMode: PropTypes.bool,
  69. };
  70. export default SubnavButtonsWrapper;