diff options
Diffstat (limited to 'src/utils/hooks')
| -rw-r--r-- | src/utils/hooks/useHeadingsTree.tsx | 27 | 
1 files changed, 20 insertions, 7 deletions
| diff --git a/src/utils/hooks/useHeadingsTree.tsx b/src/utils/hooks/useHeadingsTree.tsx index 745ba23..267e97d 100644 --- a/src/utils/hooks/useHeadingsTree.tsx +++ b/src/utils/hooks/useHeadingsTree.tsx @@ -1,10 +1,24 @@  import { Heading } from '@ts/types/app';  import { slugify } from '@utils/helpers/slugify'; +import { useRouter } from 'next/router';  import { useCallback, useEffect, useMemo, useState } from 'react';  const useHeadingsTree = (wrapper: string) => { -  const [headingsTree, setHeadingsTree] = useState<Heading[]>([]); +  const router = useRouter();    const depths = useMemo(() => ['h2', 'h3', 'h4', 'h5', 'h6'], []); +  const [allHeadings, setAllHeadings] = +    useState<NodeListOf<HTMLHeadingElement>>(); + +  useEffect(() => { +    const query = depths +      .map((depth) => `${wrapper} > *:not(aside) ${depth}`) +      .join(', '); +    const result: NodeListOf<HTMLHeadingElement> = +      document.querySelectorAll(query); +    setAllHeadings(result); +  }, [depths, wrapper, router.asPath]); + +  const [headingsTree, setHeadingsTree] = useState<Heading[]>([]);    const getElementDepth = useCallback(      (el: HTMLHeadingElement) => { @@ -78,12 +92,11 @@ const useHeadingsTree = (wrapper: string) => {    );    useEffect(() => { -    const query = depths.map((depth) => `${wrapper} ${depth}`).join(', '); -    const headings: NodeListOf<HTMLHeadingElement> = -      document.querySelectorAll(query); -    const headingsList = getHeadingsList(headings); -    setHeadingsTree(headingsList); -  }, [depths, wrapper, getHeadingsList]); +    if (allHeadings) { +      const headingsList = getHeadingsList(allHeadings); +      setHeadingsTree(headingsList); +    } +  }, [allHeadings, getHeadingsList]);    return headingsTree;  }; | 
