toc-docinit-fix

This commit is contained in:
Untone 2024-10-06 10:32:20 +03:00
parent c378926995
commit 9b257912c8

View File

@ -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))
}) })