diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-09-21 13:50:18 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-09-21 13:50:18 +0200 |
| commit | a5e6692f6dcab2157dc92b509f61418c06b2ebd7 (patch) | |
| tree | b5cebad901d8bc2f24c66b82ce7257c7da0539f1 /src/utils/hooks/use-mutation-observer.tsx | |
| parent | 08c7b3d0eb2ced622cdd3c4d14a3958ac8161cb8 (diff) | |
fix(projects): load content dynamically and refresh table of contents
The previous way of handling content import was causing issue. So I use
dynamic import instead. However, the table of contents was not
displayed because the wrapper is first empty. I added a mutation
observer to refresh the table of contents when the body is updated.
Diffstat (limited to 'src/utils/hooks/use-mutation-observer.tsx')
| -rw-r--r-- | src/utils/hooks/use-mutation-observer.tsx | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/utils/hooks/use-mutation-observer.tsx b/src/utils/hooks/use-mutation-observer.tsx new file mode 100644 index 0000000..c56f7aa --- /dev/null +++ b/src/utils/hooks/use-mutation-observer.tsx @@ -0,0 +1,28 @@ +import { useEffect } from 'react'; + +type UseMutationObserverProps = { + callback: () => void; + options: MutationObserverInit; + nodeOrSelector: string | HTMLElement; +}; + +export const useMutationObserver = ({ + callback, + options, + nodeOrSelector, +}: UseMutationObserverProps) => { + useEffect(() => { + const targetNode = + typeof nodeOrSelector === 'string' + ? document.querySelector(nodeOrSelector)! + : nodeOrSelector; + + const observer = new MutationObserver(callback); + + observer.observe(targetNode, options); + + return () => { + observer.disconnect(); + }; + }, [nodeOrSelector, options, callback]); +}; |
