"use client" import { useMemo, useState, type ReactNode } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" export function OspfDetailList({ items, label, getSearchValue, renderItem }: { items: T[]; label: string; getSearchValue: (item: T) => string renderItem: (item: T, index: number) => ReactNode }) { const [query, setQuery] = useState("") const [page, setPage] = useState(0) const filtered = useMemo(() => { const value = query.trim().toLowerCase() return value ? items.filter(item => getSearchValue(item).toLowerCase().includes(value)) : items }, [items, query, getSearchValue]) const pages = Math.max(1, Math.ceil(filtered.length / 50)) if (page >= pages) setPage(pages - 1) const current = Math.min(page, pages - 1) const controlled = items.length > 50 || !!query return
{controlled &&
{ setQuery(event.target.value); setPage(0) }} />

Показаны {filtered.length ? current * 50 + 1 : 0}–{Math.min((current + 1) * 50, filtered.length)} из {filtered.length}. Всего {items.length}.

{!filtered.length &&

По вашему запросу ничего не найдено.

}
}
{filtered.slice(current * 50, (current + 1) * 50).map((item, index) => renderItem(item, current * 50 + index))}
}