toc-docinit-fix
This commit is contained in:
parent
c378926995
commit
9b257912c8
|
@ -31,11 +31,12 @@ const scrollToHeader = (element: HTMLElement) => {
|
||||||
|
|
||||||
export const TableOfContents = (props: Props) => {
|
export const TableOfContents = (props: Props) => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
const [headings, setHeadings] = createSignal<HTMLElement[]>([])
|
const [headings, setHeadings] = createSignal<HTMLElement[]>([])
|
||||||
const [areHeadingsLoaded, setAreHeadingsLoaded] = createSignal<boolean>(false)
|
const [areHeadingsLoaded, setAreHeadingsLoaded] = createSignal<boolean>(false)
|
||||||
const [activeHeaderIndex, setActiveHeaderIndex] = createSignal<number>(-1)
|
const [activeHeaderIndex, setActiveHeaderIndex] = createSignal<number>(-1)
|
||||||
const [isVisible, setIsVisible] = createSignal<boolean>(props.variant === 'article')
|
const [isVisible, setIsVisible] = createSignal<boolean>(props.variant === 'article')
|
||||||
|
const [isDocumentReady, setIsDocumentReady] = createSignal<boolean>(false)
|
||||||
|
|
||||||
const toggleIsVisible = () => {
|
const toggleIsVisible = () => {
|
||||||
setIsVisible((visible) => !visible)
|
setIsVisible((visible) => !visible)
|
||||||
}
|
}
|
||||||
|
@ -43,6 +44,7 @@ export const TableOfContents = (props: Props) => {
|
||||||
setIsVisible(isDesktop())
|
setIsVisible(isDesktop())
|
||||||
|
|
||||||
const updateHeadings = () => {
|
const updateHeadings = () => {
|
||||||
|
if (!isDocumentReady()) return
|
||||||
const parent = document?.querySelector(props.parentSelector)
|
const parent = document?.querySelector(props.parentSelector)
|
||||||
if (parent) {
|
if (parent) {
|
||||||
setHeadings(
|
setHeadings(
|
||||||
|
@ -56,6 +58,7 @@ export const TableOfContents = (props: Props) => {
|
||||||
const debouncedUpdateHeadings = debounce(500, updateHeadings)
|
const debouncedUpdateHeadings = debounce(500, updateHeadings)
|
||||||
|
|
||||||
const updateActiveHeader = throttle(50, () => {
|
const updateActiveHeader = throttle(50, () => {
|
||||||
|
if (!isDocumentReady()) return
|
||||||
const newActiveIndex = headings().findLastIndex((heading) => isInViewport(heading))
|
const newActiveIndex = headings().findLastIndex((heading) => isInViewport(heading))
|
||||||
setActiveHeaderIndex(newActiveIndex)
|
setActiveHeaderIndex(newActiveIndex)
|
||||||
})
|
})
|
||||||
|
@ -63,11 +66,17 @@ export const TableOfContents = (props: Props) => {
|
||||||
createEffect(
|
createEffect(
|
||||||
on(
|
on(
|
||||||
() => props.body,
|
() => props.body,
|
||||||
(_) => debouncedUpdateHeadings()
|
(_) => {
|
||||||
|
if (isDocumentReady()) {
|
||||||
|
debouncedUpdateHeadings()
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
|
setIsDocumentReady(true)
|
||||||
|
debouncedUpdateHeadings()
|
||||||
window.addEventListener('scroll', updateActiveHeader)
|
window.addEventListener('scroll', updateActiveHeader)
|
||||||
onCleanup(() => window.removeEventListener('scroll', updateActiveHeader))
|
onCleanup(() => window.removeEventListener('scroll', updateActiveHeader))
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue
Block a user