import React, { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { Search, Download, ExternalLink } from "lucide-react"; import { Card, CardHeader, CardTitle, CardContent, Button, Input, Badge, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from "@/components/ui"; import { useHistoryStore } from "@/stores/historyStore"; import { DOMAINS } from "@/lib/domainPrompts"; export default function History() { const navigate = useNavigate(); const { issues, isLoading, searchQuery, loadIssues, searchIssues, setSearchQuery } = useHistoryStore(); const [statusFilter, setStatusFilter] = useState(""); const [domainFilter, setDomainFilter] = useState(""); const [sortField, setSortField] = useState<"created_at" | "title" | "severity">("created_at"); const [sortAsc, setSortAsc] = useState(false); useEffect(() => { loadIssues({ status: statusFilter || undefined, domain: domainFilter || undefined, }); }, [statusFilter, domainFilter, loadIssues]); const handleSearch = () => { if (searchQuery.trim()) { searchIssues(searchQuery.trim()); } else { loadIssues({ status: statusFilter || undefined, domain: domainFilter || undefined }); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") handleSearch(); }; const toggleSort = (field: typeof sortField) => { if (sortField === field) { setSortAsc(!sortAsc); } else { setSortField(field); setSortAsc(false); } }; const sorted = [...issues].sort((a, b) => { let cmp = 0; switch (sortField) { case "title": cmp = a.title.localeCompare(b.title); break; case "severity": cmp = a.severity.localeCompare(b.severity); break; case "created_at": default: cmp = new Date(a.created_at).getTime() - new Date(b.created_at).getTime(); } return sortAsc ? cmp : -cmp; }); const sortIndicator = (field: typeof sortField) => sortField === field ? (sortAsc ? " ↑" : " ↓") : ""; return (

History

{/* Filters */}
setSearchQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder="Search issues..." className="pl-9" />
{/* Table */} {isLoading ? (
Loading...
) : sorted.length === 0 ? (
No issues found.
) : (
{sorted.map((issue) => ( ))}
toggleSort("title")} > Title{sortIndicator("title")} Domain toggleSort("severity")} > Severity{sortIndicator("severity")} Status toggleSort("created_at")} > Created{sortIndicator("created_at")} Actions
{issue.title} {issue.domain} {issue.severity} {issue.status} {new Date(issue.created_at).toLocaleDateString()}
)}
); } function severityVariant(severity: string): "default" | "destructive" | "secondary" | "outline" { switch (severity) { case "P1": return "destructive"; case "P2": return "default"; case "P3": return "secondary"; default: return "outline"; } } function statusVariant(status: string): "default" | "destructive" | "secondary" | "outline" { switch (status) { case "open": return "default"; case "triaging": return "secondary"; case "resolved": return "outline"; default: return "outline"; } }