import { useMemo } from "react"; export type UseVirtualTextOptions = { text: string[]; viewportHeight: number; scrollOffset: number; }; export type UseVirtualTextResult = { visibleText: string[]; totalLines: number; offset: number; }; export function useVirtualText({ text, viewportHeight, scrollOffset }: UseVirtualTextOptions): UseVirtualTextResult { return useMemo(() => { let totalLines = text.length; if (viewportHeight <= 0) { return { visibleText: [], totalLines, offset: 0 }; } let maxOffset = Math.max(totalLines - viewportHeight, 0); let clampedOffset = Math.min(Math.max(scrollOffset, 0), maxOffset); let end = Math.min(clampedOffset + viewportHeight, totalLines); return { visibleText: text.slice(clampedOffset, end), totalLines, offset: clampedOffset, }; }, [scrollOffset, text, viewportHeight]); }