"use client"; import { IconCircle, IconCircleCheck } from "@tabler/icons-react"; import { Badge } from "@kandev/ui/badge"; import { useTranslation } from "react-i18next"; import { ChangeRequestList, ChangeRequestRow } from "@/components/integrations/change-request-list"; import { IntegrationStartTaskMenu } from "@/components/integrations/integration-start-task-menu"; import { TaskRowIndicator } from "@/components/integrations/task-row-indicator"; import { cn, formatRelativeTime } from "@/lib/utils"; import type { GitHubIssue, TaskIssueLink } from "@/lib/types/github"; import type { LaunchPayload, TaskPreset } from "./quick-task-launcher"; type IssueListProps = { items: GitHubIssue[]; loading: boolean; error: string | null; presets: TaskPreset[]; onStartTask: (payload: LaunchPayload) => void; issueKeyToTasks?: Map; }; function IssueLabels({ labels }: { labels: string[] }) { if (!labels?.length) return null; return ( <> {labels.slice(0, 4).map((label) => ( {label} ))} {labels.length > 4 && ( +{labels.length - 4} )} ); } function IssueRow({ issue, presets, onStartTask, tasks, }: { issue: GitHubIssue; presets: TaskPreset[]; onStartTask: IssueListProps["onStartTask"]; tasks: TaskIssueLink[] | undefined; }) { const { t } = useTranslation(); const StateIcon = issue.state === "open" ? IconCircle : IconCircleCheck; const stateClass = issue.state === "open" ? "text-emerald-600 dark:text-emerald-400" : "text-purple-600 dark:text-purple-400"; return ( } title={issue.title} href={issue.html_url} metadata={ <> {issue.repo_owner}/{issue.repo_name}#{issue.number} ยท {t("github:byAuthorOpenedAgo", { author: issue.author_login, time: formatRelativeTime(issue.created_at), })} } taskIndicator={ ({ id: task.task_id, taskId: task.task_id, fallbackTitle: task.task_title, }))} testIdPrefix="issue-row-task-indicator" /> } action={ onStartTask({ kind: "issue", issue, preset })} triggerTestId="issue-start-task-trigger" itemTestId="issue-start-task-preset" /> } testId="issue-row" dataAttributes={{ "data-issue-number": issue.number }} /> ); } export function IssueList({ items, loading, error, presets, onStartTask, issueKeyToTasks, }: IssueListProps) { const { t } = useTranslation(); return ( {items.map((issue) => { const key = `${issue.repo_owner}/${issue.repo_name}#${issue.number}`; return ( ); })} ); }