import React, { useRef, useCallback } from "react" import { useVirtualizer, VirtualItem } from "@tanstack/react-virtual" import { Link as LinkSchema, Section as SectionSchema, Topic } from "@/lib/schema" import { LinkItem } from "./partials/link-item" import { useAccountOrGuest } from "@/lib/providers/jazz-provider" export type FlattenedItem = { type: "link"; data: LinkSchema | null } | { type: "section"; data: SectionSchema | null } interface TopicDetailListProps { items: FlattenedItem[] topic: Topic activeIndex: number setActiveIndex: (index: number) => void } export function TopicDetailList({ items, topic, activeIndex, setActiveIndex }: TopicDetailListProps) { const { me } = useAccountOrGuest({ root: { personalLinks: [] } }) const personalLinks = !me || me._type === "Anonymous" ? undefined : me.root.personalLinks const parentRef = useRef(null) const virtualizer = useVirtualizer({ count: items.length, getScrollElement: () => parentRef.current, estimateSize: () => 44, overscan: 5 }) const renderItem = useCallback( (virtualRow: VirtualItem) => { const item = items[virtualRow.index] if (item.type === "section") { return (

{item.data?.title}

) } if (item.data?.id) { return ( ) } return null }, [items, topic, activeIndex, setActiveIndex, virtualizer, personalLinks] ) return (
{virtualizer.getVirtualItems().map(renderItem)}
) }