'use client'; /* AnalyzerFeedRow — phase 06 (ANL-02). * Purpose: Feed row card — header (ticket# + time-ago), title (1-line truncate), * summary (2-line clamp), footer (stage pips left + confidence/review right). * Entire card is a Link to /mobile/analyzer/[id]. Per D-10..D-12, D-17. * Props: AnalyzerFeedRow type from @/app/api/mobile/analyzer/feed/route. */ import Link from 'next/link'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { AnalyzerStagePips } from '@/components/mobile/AnalyzerStagePips'; import { ConfidenceBadge } from '@/components/mobile/ConfidenceBadge'; import type { AnalyzerFeedRow as AnalyzerFeedRowType } from '@/app/api/mobile/analyzer/feed/route'; function relTime(ts: string | null): string { if (!ts) return '—'; const diff = Date.now() - new Date(ts).getTime(); const m = Math.floor(diff / 60000); if (m < 60) return `${m}m ago`; const h = Math.floor(m / 60); if (h < 24) return `${h}h ago`; return `${Math.floor(h / 24)}d ago`; } export interface AnalyzerFeedRowProps { row: AnalyzerFeedRowType; } export function AnalyzerFeedRow({ row }: AnalyzerFeedRowProps) { return ( {/* Line 1 — header row */} {row.ticketNumber} {relTime(row.completedAt)} {/* Line 2 — title */} {row.title} {/* Line 3 — summary clamp (2 lines, fallback "—") */} {row.summary ?? '—'} {/* Footer — pips left, badges right */} {row.needsHumanReview && ( Review )} ); }
{row.title}
{row.summary ?? '—'}