import { useMemo } from "react"; import { getRecentRequests } from "../api"; import { formatCost, formatDurationMs, formatInteger, formatRelativeTime } from "../data/formatters"; import { useResource } from "../data/useResource"; import type { MessageStats, TimeRange } from "../types"; import { AsyncBoundary, DataTable, Panel, StatusPill } from "../ui"; export interface RequestsRouteProps { active: boolean; range: TimeRange; refreshTrigger: number; onRequestClick: (id: number) => void; } export function RequestsRoute({ active, refreshTrigger, onRequestClick }: RequestsRouteProps) { const { data: recentRequests, error, loading, } = useResource(["recent-requests-dense", refreshTrigger], signal => getRecentRequests(50, signal), { pollMs: 30000, enabled: active, }); const columns = useMemo( () => [ { key: "model", header: "Model", render: (item: MessageStats) => (
{item.model}
{item.provider}
), }, { key: "timestamp", header: "Time", render: (item: MessageStats) => formatRelativeTime(item.timestamp), }, { key: "tokens", header: "Tokens", numeric: true, render: (item: MessageStats) => formatInteger(item.usage.totalTokens), }, { key: "cost", header: "Cost", numeric: true, render: (item: MessageStats) => formatCost(item.usage.cost.total, 4), }, { key: "duration", header: "Duration", numeric: true, render: (item: MessageStats) => formatDurationMs(item.duration), }, { key: "status", header: "Status", className: "stats-text-center", render: (item: MessageStats) => ( {item.errorMessage ? "Failed" : "Success"} ), }, ], [], ); const renderMobileCard = (item: MessageStats, onClick?: () => void) => (
{item.model}
{item.provider}
{item.errorMessage ? "Failed" : "Success"}
Time
{formatRelativeTime(item.timestamp)}
Cost
{formatCost(item.usage.cost.total, 4)}
Tokens
{formatInteger(item.usage.totalTokens)}
Duration
{formatDurationMs(item.duration)}
{item.errorMessage &&
{item.errorMessage}
}
); return (
item.id || `${item.sessionFile}-${item.entryId}`} onRowClick={item => item.id && onRequestClick(item.id)} renderMobileCard={renderMobileCard} emptyText="No recent requests found" />
); }