"use client" import { useCallback, useEffect, useMemo, useState } from "react" import { useParams, useRouter } from "next/navigation" import { ArrowLeft, Search } from "lucide-react" import { type BenchmarkEvaluationCardData } from "@/components/benchmark-evaluation-card" import { InfiniteScrollSentinel } from "@/components/infinite-scroll" import { ModelTable } from "@/components/model-table" import { Navigation } from "@/components/navigation" import type { BenchmarkCard } from "@/lib/benchmark-schema" import { fetchDeveloperSummary, fetchBenchmarkMetadata } from "@/lib/dashboard-data-client" const PAGE_SIZE = 40 type ModelSort = "date" | "name" | "benchmarks" | "results" export default function DeveloperDetailPage() { const params = useParams() const router = useRouter() const [developer, setDeveloper] = useState("") const [models, setModels] = useState([]) const [benchmarkCards, setBenchmarkCards] = useState>({}) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [searchQuery, setSearchQuery] = useState("") const [sortBy, setSortBy] = useState("date") const [visibleCount, setVisibleCount] = useState(PAGE_SIZE) const [selectedModelIds, setSelectedModelIds] = useState([]) const routeId = params.id as string const handleBack = useCallback(() => { router.push("/models?view=developers") }, [router]) useEffect(() => { Promise.all([ fetchDeveloperSummary(routeId), fetchBenchmarkMetadata(), ]) .then(([summary, cards]) => { setDeveloper(summary.developer) setModels(summary.models) setBenchmarkCards(cards) }) .catch((err) => { console.error(err) setError("Developer not found") }) .finally(() => setLoading(false)) }, [routeId]) const totalBenchmarks = useMemo(() => Object.keys(benchmarkCards).length, [benchmarkCards]) const totalResults = useMemo( () => models.reduce((sum, model) => sum + model.evaluations_count, 0), [models] ) const filteredModels = useMemo(() => { const query = searchQuery.trim().toLowerCase() const filtered = query ? models.filter((model) => { const haystacks = [ model.model_name, model.canonical_model_name, model.developer, ...model.top_scores.map((score) => score.benchmark), ] return haystacks.some((value) => value?.toLowerCase().includes(query)) }) : [...models] switch (sortBy) { case "date": filtered.sort( (a, b) => new Date(b.latest_timestamp).getTime() - new Date(a.latest_timestamp).getTime() ) break case "name": filtered.sort((a, b) => a.model_name.localeCompare(b.model_name)) break case "benchmarks": filtered.sort((a, b) => b.benchmarks_count - a.benchmarks_count) break case "results": filtered.sort((a, b) => b.evaluations_count - a.evaluations_count) break } return filtered }, [models, searchQuery, sortBy]) useEffect(() => { setVisibleCount(PAGE_SIZE) }, [searchQuery, sortBy]) const visibleModels = useMemo( () => filteredModels.slice(0, visibleCount), [filteredModels, visibleCount] ) const hasMore = visibleCount < filteredModels.length const handleLoadMore = useCallback(() => { setVisibleCount((current) => Math.min(current + PAGE_SIZE, filteredModels.length)) }, [filteredModels.length]) const toggleModelSelection = useCallback((id: string) => { setSelectedModelIds((current) => current.includes(id) ? current.filter((existing) => existing !== id) : [...current, id] ) }, []) if (loading) { return (
Loading developer…
) } if (error) { return (
{error}
) } return (
{/* BREADCRUMB ----------------------------------------------- */} {/* HEADER --------------------------------------------------- */}
Developer

{developer}

Evaluation coverage across{" "} {models.length}{" "} {models.length === 1 ? "model" : "models"} from this developer {totalBenchmarks > 0 && ( <> {" "}— a slice of the{" "} {totalBenchmarks.toLocaleString()}-benchmark{" "} registry )} .

{/* META + FILTER BAR — single row -------------------------- */}
{filteredModels.length.toLocaleString()} {filteredModels.length === 1 ? "model" : "models"} · {totalResults.toLocaleString()} results
setSearchQuery(event.target.value)} placeholder="Search models or benchmarks…" />
{/* TABLE ---------------------------------------------------- */} {filteredModels.length === 0 ? (
No models match the current filters
) : ( )}
) }