/* eslint-disable react-refresh/only-export-components */ import { useState } from 'react' import type { ColumnDef } from '@tanstack/react-table' import { Zap } from 'lucide-react' import { formatTimestampToDate, formatTokens } from '@/lib/format' import { cn } from '@/lib/utils' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip' import { DataTableColumnHeader } from '@/components/data-table' import { StatusBadge } from '@/components/status-badge' import { formatDuration } from '../../lib/format' import { FailReasonDialog } from '../dialogs/fail-reason-dialog' /** * Cache tooltip component for token display */ export function CacheTooltip({ tokens, label, color, }: { tokens: number label: string color: string }) { if (tokens <= 0) return null return ( {label}: {formatTokens(tokens)} ) } // ============================================================================ // Column Definition Factories // ============================================================================ /** * Create a timestamp column - compact mono style matching common logs */ export function createTimestampColumn(config: { accessorKey: string title: string unit?: 'seconds' | 'milliseconds' }): ColumnDef { const { accessorKey, title, unit = 'milliseconds' } = config return { accessorKey, header: ({ column }) => ( ), cell: ({ row }) => { const timestamp = row.getValue(accessorKey) as number if (!timestamp) { return - } return ( {formatTimestampToDate(timestamp, unit)} ) }, meta: { label: title }, } } /** * Duration pill colors matching common logs timing column */ const durationPillBg: Record = { green: 'border border-emerald-200/60 bg-emerald-50/70 dark:border-emerald-800/50 dark:bg-emerald-950/25', red: 'border border-rose-200/70 bg-rose-50/70 dark:border-rose-800/50 dark:bg-rose-950/25', success: 'border border-emerald-200/60 bg-emerald-50/50 dark:border-emerald-800/50 dark:bg-emerald-950/20', info: 'border border-sky-200/60 bg-sky-50/50 dark:border-sky-800/50 dark:bg-sky-950/20', warning: 'border border-amber-200/60 bg-amber-50/50 dark:border-amber-800/50 dark:bg-amber-950/20', } const durationTextColor: Record = { green: 'text-emerald-700 dark:text-emerald-400', red: 'text-rose-700 dark:text-rose-400', success: 'text-emerald-700 dark:text-emerald-400', info: 'text-sky-700 dark:text-sky-400', warning: 'text-amber-700 dark:text-amber-400', } const durationDotColor: Record = { green: 'bg-emerald-500', red: 'bg-rose-500', success: 'bg-emerald-500', info: 'bg-sky-500', warning: 'bg-amber-500', } /** * Create a duration column - pill style matching common logs timing */ export function createDurationColumn(config: { submitTimeKey: string finishTimeKey: string unit?: 'seconds' | 'milliseconds' headerLabel: string warningThresholdSec?: number }): ColumnDef { const { submitTimeKey, finishTimeKey, unit = 'milliseconds', headerLabel, warningThresholdSec = 60, } = config return { id: 'duration', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original as Record const duration = formatDuration( log[submitTimeKey] as number | undefined, log[finishTimeKey] as number | undefined, unit ) if (!duration) { return - } const variant = duration.durationSec > warningThresholdSec ? 'red' : 'green' return ( {duration.durationSec.toFixed(1)}s ) }, meta: { label: headerLabel }, } } /** * Create a channel column (admin only) - #id badge matching common logs */ export function createChannelColumn(config: { accessorKey?: string headerLabel: string }): ColumnDef { const { accessorKey = 'channel_id', headerLabel } = config return { accessorKey, header: ({ column }) => ( ), cell: ({ row }) => { const channelId = row.getValue(accessorKey) as number if (!channelId) { return - } return ( ) }, meta: { label: headerLabel }, } } /** * Create a fail reason column - text-xs truncate, hover underline, dialog */ export function createFailReasonColumn(config: { accessorKey?: string headerLabel: string cellTitle: string }): ColumnDef { const { accessorKey = 'fail_reason', headerLabel, cellTitle } = config return { accessorKey, header: ({ column }) => ( ), cell: function FailReasonCell({ row }) { const failReason = row.getValue(accessorKey) as string const [dialogOpen, setDialogOpen] = useState(false) if (!failReason) { return - } return ( <> setDialogOpen(true)} title={cellTitle} > {failReason} > ) }, meta: { label: headerLabel }, } } /** * Create a progress column - compact mono pill */ export function createProgressColumn(config: { accessorKey?: string headerLabel: string }): ColumnDef { const { accessorKey = 'progress', headerLabel } = config return { accessorKey, header: ({ column }) => ( ), cell: ({ row }) => { const progress = row.getValue(accessorKey) as string if (!progress) { return - } return ( {progress} ) }, meta: { label: headerLabel }, } }
{label}: {formatTokens(tokens)}