import type { Icon } from "@/types/icons" import { useWindowVirtualizer } from "@tanstack/react-virtual" import { useEffect, useMemo, useRef, useState } from "react" import { IconCard } from "./icon-card" interface IconsGridProps { filteredIcons: { name: string; data: Icon }[] matchedAliases: Record } export function IconsGrid({ filteredIcons, matchedAliases }: IconsGridProps) { return (
{filteredIcons.slice(0, 120).map(({ name, data }) => ( ))}
) } export function VirtualizedIconsGrid({ filteredIcons, matchedAliases }: IconsGridProps) { const listRef = useRef(null) const [windowWidth, setWindowWidth] = useState(0) useEffect(() => { setWindowWidth(window.innerWidth) const handleResize = () => { setWindowWidth(window.innerWidth) } window.addEventListener("resize", handleResize) return () => window.removeEventListener("resize", handleResize) }, []) const columnCount = useMemo(() => { if (windowWidth >= 1280) return 8 // xl if (windowWidth >= 1024) return 6 // lg if (windowWidth >= 768) return 4 // md if (windowWidth >= 640) return 3 // sm return 2 // default }, [windowWidth]) const rowCount = Math.ceil(filteredIcons.length / columnCount) const rowVirtualizer = useWindowVirtualizer({ count: rowCount, estimateSize: () => 140, overscan: 5, }) return (
{rowVirtualizer.getVirtualItems().map((virtualRow) => { const rowStart = virtualRow.index * columnCount const rowEnd = Math.min(rowStart + columnCount, filteredIcons.length) const rowIcons = filteredIcons.slice(rowStart, rowEnd) return (
{rowIcons.map(({ name, data }) => ( ))}
) })}
) }