import React, { useCallback, useEffect, useMemo, useRef, useState } from "react" import { LinkItem } from "./link-item" import { LaAccount, PersonalLinkLists, Section as SectionSchema, Topic, UserRoot } from "@/lib/schema" import { Skeleton } from "@/components/ui/skeleton" import { LaIcon } from "@/components/custom/la-icon" interface SectionProps { topic: Topic section: SectionSchema activeIndex: number startIndex: number linkRefs: React.MutableRefObject<(HTMLLIElement | null)[]> setActiveIndex: (index: number) => void } export function Section({ topic, section, activeIndex, setActiveIndex, startIndex, linkRefs }: SectionProps) { const [nLinksToLoad, setNLinksToLoad] = useState(10) const linksToLoad = useMemo(() => { return section.links?.slice(0, nLinksToLoad) }, [section.links, nLinksToLoad]) return (

{section.title}

{linksToLoad?.map((link, index) => link?.url ? ( { linkRefs.current[startIndex + index] = el }} /> ) : ( ) )} {section.links?.length && section.links?.length > nLinksToLoad && ( setNLinksToLoad(n => n + 10)} /> )}
) } const LoadMoreSpinner = ({ onLoadMore }: { onLoadMore: () => void }) => { const spinnerRef = useRef(null) const handleIntersection = useCallback( (entries: IntersectionObserverEntry[]) => { const [entry] = entries if (entry.isIntersecting) { onLoadMore() } }, [onLoadMore] ) useEffect(() => { const observer = new IntersectionObserver(handleIntersection, { root: null, rootMargin: "0px", threshold: 1.0 }) const currentSpinnerRef = spinnerRef.current if (currentSpinnerRef) { observer.observe(currentSpinnerRef) } return () => { if (currentSpinnerRef) { observer.unobserve(currentSpinnerRef) } } }, [handleIntersection]) return (
) }