"use client"; import Link from "next/link"; import { useMemo, useState } from "react"; import clsx from "clsx"; import { api, type Dataset } from "@/lib/api"; import { useAsync } from "@/lib/hooks"; import { fmtBytes, fmtCompact, fmtInt } from "@/lib/format"; import { Card, ErrorState, PageHeader, Skeleton, StatusBadge, Tabs } from "@/components/ui"; const ORDER = ["active", "paused", "pending_configuration", "planned", "unsupported"]; export default function DatasetsPage() { const { data, error, loading, reload } = useAsync((s) => api.get<{ data: Dataset[] }>("/catalog/datasets", undefined, s), []); const [filter, setFilter] = useState<"all" | "active" | "other">("all"); const rows = useMemo(() => { const r = (data?.data ?? []).slice().sort((a, b) => ORDER.indexOf(a.status) - ORDER.indexOf(b.status) || a.id.localeCompare(b.id)); if (filter === "active") return r.filter((d) => d.status === "active"); if (filter === "other") return r.filter((d) => d.status !== "active"); return r; }, [data, filter]); return ( <> } /> {error && } {loading && !data && }
{rows.map((d) => (
{d.name}
{d.id}
{d.description &&

{d.description}

}
{d.kind} {d.asset_class && {d.asset_class}} {d.interval && {d.interval}} {d.adjustment && {d.adjustment}} {d.license_class}
{d.status === "active" && (
Version
v{d.current_version ?? "—"}
Rows
{fmtCompact(d.row_count)}
Size
{fmtBytes(d.bytes)}
Symbols
{fmtInt(d.symbols)}
Sessions
{d.first_session && d.last_session ? `${d.first_session} → ${d.last_session}` : "—"}
)} {d.source_name &&
Source: {d.source_name}{d.vendor ? ` (${d.vendor})` : ""}
} ))}
{data && rows.length === 0 && No dataset matches this filter.} ); }