ContentLinkButtons.jsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useMemo } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { isTopPage } from '@commons/util/path-utils';
  4. import AppContainer from '../services/AppContainer';
  5. import NavigationContainer from '../services/NavigationContainer';
  6. import PageContainer from '../services/PageContainer';
  7. import { withUnstatedContainers } from './UnstatedUtils';
  8. import RecentlyCreatedIcon from './Icons/RecentlyCreatedIcon';
  9. const WIKI_HEADER_LINK = 120;
  10. /**
  11. * @author Yuki Takei <yuki@weseek.co.jp>
  12. *
  13. */
  14. const ContentLinkButtons = (props) => {
  15. const { appContainer, navigationContainer, pageContainer } = props;
  16. const { pageUser, path } = pageContainer.state;
  17. const { isPageExist } = pageContainer.state;
  18. const { isSharedUser } = appContainer;
  19. const isTopPagePath = isTopPage(path);
  20. // get element for smoothScroll
  21. const getCommentListDom = useMemo(() => { return document.getElementById('page-comments-list') }, []);
  22. const getBookMarkListHeaderDom = useMemo(() => { return document.getElementById('bookmarks-list') }, []);
  23. const getRecentlyCreatedListHeaderDom = useMemo(() => { return document.getElementById('recently-created-list') }, []);
  24. const CommentLinkButton = () => {
  25. return (
  26. <div className="mt-3">
  27. <button
  28. type="button"
  29. className="btn btn-outline-secondary btn-sm btn-block"
  30. onClick={() => navigationContainer.smoothScrollIntoView(getCommentListDom, WIKI_HEADER_LINK)}
  31. >
  32. <i className="mr-2 icon-fw icon-bubbles"></i>
  33. <span>Comments</span>
  34. </button>
  35. </div>
  36. );
  37. };
  38. const BookMarkLinkButton = () => {
  39. return (
  40. <button
  41. type="button"
  42. className="btn btn-outline-secondary btn-sm px-2"
  43. onClick={() => navigationContainer.smoothScrollIntoView(getBookMarkListHeaderDom, WIKI_HEADER_LINK)}
  44. >
  45. <i className="mr-2 icon-star"></i>
  46. <span>Bookmarks</span>
  47. </button>
  48. );
  49. };
  50. const RecentlyCreatedLinkButton = () => {
  51. return (
  52. <button
  53. type="button"
  54. className="btn btn-outline-secondary btn-sm px-3"
  55. onClick={() => navigationContainer.smoothScrollIntoView(getRecentlyCreatedListHeaderDom, WIKI_HEADER_LINK)}
  56. >
  57. <i className="grw-icon-container-recently-created mr-2"><RecentlyCreatedIcon /></i>
  58. <span>Recently Created</span>
  59. </button>
  60. );
  61. };
  62. return (
  63. <>
  64. {isPageExist && !isSharedUser && !isTopPagePath && <CommentLinkButton />}
  65. <div className="mt-3 d-flex justify-content-between">
  66. {pageUser && <><BookMarkLinkButton /><RecentlyCreatedLinkButton /></>}
  67. </div>
  68. </>
  69. );
  70. };
  71. ContentLinkButtons.propTypes = {
  72. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  73. navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
  74. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  75. };
  76. export default withUnstatedContainers(ContentLinkButtons, [AppContainer, NavigationContainer, PageContainer]);