| 330 | } |
| 331 | |
| 332 | function useCurrentSection() { |
| 333 | let {currentPage} = useRouter(); |
| 334 | let [selected, setSelected] = useState(''); |
| 335 | |
| 336 | useEffect(() => { |
| 337 | let elements = Array.from(document.querySelectorAll('article [data-anchor-link]')); |
| 338 | let visible = new Set(); |
| 339 | let observer = new IntersectionObserver( |
| 340 | entries => { |
| 341 | for (let entry of entries) { |
| 342 | if (entry.isIntersecting) { |
| 343 | visible.add(entry.target); |
| 344 | } else { |
| 345 | visible.delete(entry.target); |
| 346 | } |
| 347 | |
| 348 | let firstVisible = elements.find(e => visible.has(e)); |
| 349 | if (firstVisible) { |
| 350 | setSelected('#' + firstVisible.id); |
| 351 | } |
| 352 | } |
| 353 | }, |
| 354 | {rootMargin: '0px 0px -50% 0px'} |
| 355 | ); |
| 356 | |
| 357 | for (let element of elements) { |
| 358 | observer.observe(element); |
| 359 | } |
| 360 | |
| 361 | return () => observer.disconnect(); |
| 362 | }, [currentPage]); |
| 363 | |
| 364 | return selected; |
| 365 | } |
| 366 | |
| 367 | export function OnPageNav({children}) { |
| 368 | let selected = useCurrentSection(); |