"use client"; import { getDocsTocs } from "@/lib/markdown"; import clsx from "clsx"; import Link from "next/link"; import { useState, useRef, useEffect } from "react"; type Props = { data: Awaited> }; export default function TocObserver({ data }: Props) { const [activeId, setActiveId] = useState(null); const observer = useRef(null); useEffect(() => { const handleIntersect = (entries: IntersectionObserverEntry[]) => { const visibleEntry = entries.find((entry) => entry.isIntersecting); if (visibleEntry) { setActiveId(visibleEntry.target.id); } }; observer.current = new IntersectionObserver(handleIntersect, { root: null, rootMargin: "-20px 0px 0px 0px", threshold: 0.1, }); const elements = data.map((item) => document.getElementById(item.href.slice(1)) ); elements.forEach((el) => { if (el && observer.current) { observer.current.observe(el); } }); return () => { if (observer.current) { elements.forEach((el) => { if (el) { observer.current!.unobserve(el); } }); } }; }, [data]); return (
{data.map(({ href, level, text }) => { return ( {text} ); })}
); }