import { Link } from "react-router-dom"; import type { Issue } from "@paperclip/shared"; import { useQuery } from "@tanstack/react-query"; import { agentsApi } from "../api/agents"; import { projectsApi } from "../api/projects"; import { useCompany } from "../context/CompanyContext"; import { queryKeys } from "../lib/queryKeys"; import { StatusIcon } from "./StatusIcon"; import { PriorityIcon } from "./PriorityIcon"; import { formatDate } from "../lib/utils"; import { timeAgo } from "../lib/timeAgo"; import { Separator } from "@/components/ui/separator"; interface IssuePropertiesProps { issue: Issue; onUpdate: (data: Record) => void; } function PropertyRow({ label, children }: { label: string; children: React.ReactNode }) { return (
{label}
{children}
); } function statusLabel(status: string): string { return status.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()); } function priorityLabel(priority: string): string { return priority.charAt(0).toUpperCase() + priority.slice(1); } export function IssueProperties({ issue, onUpdate }: IssuePropertiesProps) { const { selectedCompanyId } = useCompany(); const { data: agents } = useQuery({ queryKey: queryKeys.agents.list(selectedCompanyId!), queryFn: () => agentsApi.list(selectedCompanyId!), enabled: !!selectedCompanyId, }); const { data: projects } = useQuery({ queryKey: queryKeys.projects.list(selectedCompanyId!), queryFn: () => projectsApi.list(selectedCompanyId!), enabled: !!selectedCompanyId && !!issue.projectId, }); const agentName = (id: string | null) => { if (!id || !agents) return null; const agent = agents.find((a) => a.id === id); return agent?.name ?? id.slice(0, 8); }; const projectName = (id: string | null) => { if (!id || !projects) return id?.slice(0, 8) ?? "None"; const project = projects.find((p) => p.id === id); return project?.name ?? id.slice(0, 8); }; const assignee = issue.assigneeAgentId ? agents?.find((a) => a.id === issue.assigneeAgentId) : null; return (
onUpdate({ status })} /> {statusLabel(issue.status)} onUpdate({ priority })} /> {priorityLabel(issue.priority)} {assignee ? ( {assignee.name} ) : ( Unassigned )} {issue.projectId && ( {projectName(issue.projectId)} )} {issue.parentId && ( {issue.ancestors?.[0]?.title ?? issue.parentId.slice(0, 8)} )} {issue.requestDepth > 0 && ( {issue.requestDepth} )}
{issue.startedAt && ( {formatDate(issue.startedAt)} )} {issue.completedAt && ( {formatDate(issue.completedAt)} )} {formatDate(issue.createdAt)} {timeAgo(issue.updatedAt)}
); }