import React, { useCallback, useEffect, useMemo } from 'react'; import PropTypes from 'prop-types'; import loggerFactory from '@alias/logger'; import { withTranslation } from 'react-i18next'; import PageContainer from '../services/PageContainer'; import NavigationContainer from '../services/NavigationContainer'; import { withUnstatedContainers } from './UnstatedUtils'; import StickyStretchableScroller from './StickyStretchableScroller'; import RecentlyCreatedIcon from './Icons/RecentlyCreatedIcon'; // eslint-disable-next-line no-unused-vars const logger = loggerFactory('growi:TableOfContents'); const WIKI_HEADER_LINK = 120; /** * @author Yuki Takei * */ const TableOfContents = (props) => { const { pageContainer, navigationContainer } = props; const { pageUser } = pageContainer.state; const isUserPage = pageUser != null; const calcViewHeight = useCallback(() => { // calculate absolute top of '#revision-toc' element const containerElem = document.querySelector('#revision-toc'); const containerTop = containerElem.getBoundingClientRect().top; // window height - revisionToc top - .system-version - .grw-fab-container height - top-of-table-contents height if (isUserPage) { return window.innerHeight - containerTop - 20 - 155 - 26 - 40; } return window.innerHeight - containerTop - 20 - 155 - 26; }, [isUserPage]); const { tocHtml } = pageContainer.state; // execute after generation toc html useEffect(() => { const tocDom = document.getElementById('revision-toc-content'); const anchorsInToc = Array.from(tocDom.getElementsByTagName('a')); navigationContainer.addSmoothScrollEvent(anchorsInToc); }, [tocHtml, navigationContainer]); // get element for smoothScroll const getBookMarkListHeaderDom = useMemo(() => { return document.getElementById('bookmarks-list') }, []); const getRecentlyCreatedListHeaderDom = useMemo(() => { return document.getElementById('recently-created-list') }, []); return ( <>
{ isUserPage && (
)} ); }; /** * Wrapper component for using unstated */ const TableOfContentsWrapper = withUnstatedContainers(TableOfContents, [PageContainer, NavigationContainer]); TableOfContents.propTypes = { pageContainer: PropTypes.instanceOf(PageContainer).isRequired, navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired, }; export default withTranslation()(TableOfContentsWrapper);