TableOfContents.jsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import React, { useCallback } from 'react';
  2. import PropTypes from 'prop-types';
  3. import loggerFactory from '@alias/logger';
  4. import { withTranslation } from 'react-i18next';
  5. import PageContainer from '../services/PageContainer';
  6. import { withUnstatedContainers } from './UnstatedUtils';
  7. import StickyStretchableScroller from './StickyStretchableScroller';
  8. // eslint-disable-next-line no-unused-vars
  9. const logger = loggerFactory('growi:TableOfContents');
  10. /**
  11. * @author Yuki Takei <yuki@weseek.co.jp>
  12. *
  13. */
  14. const TableOfContents = (props) => {
  15. const { pageContainer } = props;
  16. const calcViewHeight = useCallback(() => {
  17. // calculate absolute top of '#revision-toc' element
  18. const containerElem = document.querySelector('#revision-toc');
  19. const containerTop = containerElem.getBoundingClientRect().top;
  20. // window height - revisionToc top - .system-version - .grw-fab-container height
  21. return window.innerHeight - containerTop - 20 - 155;
  22. }, []);
  23. const { tocHtml } = pageContainer.state;
  24. return (
  25. <>
  26. {/* TODO GW-3253 add four contents */}
  27. <StickyStretchableScroller
  28. contentsElemSelector=".revision-toc .markdownIt-TOC"
  29. stickyElemSelector="#revision-toc"
  30. calcViewHeightFunc={calcViewHeight}
  31. >
  32. <div
  33. id="revision-toc-content"
  34. className="revision-toc-content"
  35. // eslint-disable-next-line react/no-danger
  36. dangerouslySetInnerHTML={{
  37. __html: tocHtml,
  38. }}
  39. />
  40. </StickyStretchableScroller>
  41. </>
  42. );
  43. };
  44. /**
  45. * Wrapper component for using unstated
  46. */
  47. const TableOfContentsWrapper = withUnstatedContainers(TableOfContents, [PageContainer]);
  48. TableOfContents.propTypes = {
  49. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  50. };
  51. export default withTranslation()(TableOfContentsWrapper);