| 349 | } |
| 350 | |
| 351 | function useCurrentSection() { |
| 352 | let {currentPage} = useRouter(); |
| 353 | let [selected, setSelected] = useState(''); |
| 354 | |
| 355 | useEffect(() => { |
| 356 | let elements = Array.from(document.querySelectorAll('article [data-anchor-link]')); |
| 357 | let visible = new Set(); |
| 358 | let observer = new IntersectionObserver( |
| 359 | entries => { |
| 360 | for (let entry of entries) { |
| 361 | if (entry.isIntersecting) { |
| 362 | visible.add(entry.target); |
| 363 | } else { |
| 364 | visible.delete(entry.target); |
| 365 | } |
| 366 | |
| 367 | let firstVisible = elements.find(e => visible.has(e)); |
| 368 | if (firstVisible) { |
| 369 | setSelected('#' + firstVisible.id); |
| 370 | } |
| 371 | } |
| 372 | }, |
| 373 | {rootMargin: '0px 0px -50% 0px'} |
| 374 | ); |
| 375 | |
| 376 | for (let element of elements) { |
| 377 | observer.observe(element); |
| 378 | } |
| 379 | |
| 380 | return () => observer.disconnect(); |
| 381 | }, [currentPage]); |
| 382 | |
| 383 | return selected; |
| 384 | } |
| 385 | |
| 386 | export function OnPageNav({children}) { |
| 387 | let selected = useCurrentSection(); |