Skip to content

Commit 4a8deed

Browse files
feat: pr status on task list
1 parent 3b3daa2 commit 4a8deed

File tree

3 files changed

+100
-15
lines changed

3 files changed

+100
-15
lines changed

async-code-web/app/page.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
1616
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog";
1717
import { ProtectedRoute } from "@/components/protected-route";
1818
import { TaskStatusBadge } from "@/components/task-status-badge";
19+
import { PRStatusBadge } from "@/components/pr-status-badge";
1920
import { useAuth } from "@/contexts/auth-context";
2021
import { ApiService } from "@/lib/api-service";
2122
import { SupabaseService } from "@/lib/supabase-service";
@@ -513,6 +514,15 @@ export default function Home() {
513514
<div className="flex-1 min-w-0">
514515
<div className="flex items-center gap-2 mb-1">
515516
<TaskStatusBadge status={task.status || ''} />
517+
{task.pr_url && task.pr_number && (
518+
<PRStatusBadge
519+
prUrl={task.pr_url}
520+
prNumber={task.pr_number}
521+
prBranch={task.pr_branch}
522+
variant="badge"
523+
size="sm"
524+
/>
525+
)}
516526
<span className="text-xs text-slate-500 flex items-center gap-1">
517527
#{task.id}{getAgentIcon(task.agent || '')} {task.agent?.toUpperCase()}
518528
</span>

async-code-web/app/tasks/page.tsx

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import { Badge } from "@/components/ui/badge";
1010
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
1111
import { ProtectedRoute } from "@/components/protected-route";
1212
import { TaskStatusBadge } from "@/components/task-status-badge";
13+
import { PRStatusBadge } from "@/components/pr-status-badge";
1314
import { useAuth } from "@/contexts/auth-context";
1415
import { ApiService } from "@/lib/api-service";
16+
import { SupabaseService } from "@/lib/supabase-service";
1517
import { Task, Project } from "@/types";
1618

1719
interface TaskWithProject extends Task {
@@ -44,13 +46,16 @@ export default function TasksPage() {
4446
const interval = setInterval(async () => {
4547
try {
4648
const updatedTasks = await Promise.all(
47-
runningTasks.map(task => ApiService.getTaskStatus(user.id, task.id))
49+
runningTasks.map(task => SupabaseService.getTask(task.id))
4850
);
4951

5052
setTasks(prevTasks =>
5153
prevTasks.map(task => {
52-
const updated = updatedTasks.find(t => t.id === task.id);
53-
return updated ? { ...task, ...updated } : task;
54+
const updated = updatedTasks.find(t => t && t.id === task.id);
55+
if (updated) {
56+
return { ...task, ...updated };
57+
}
58+
return task;
5459
})
5560
);
5661
} catch (error) {
@@ -67,7 +72,7 @@ export default function TasksPage() {
6772
try {
6873
setLoading(true);
6974
const [taskData, projectData] = await Promise.all([
70-
ApiService.getTasks(user.id),
75+
SupabaseService.getTasks(),
7176
ApiService.getProjects(user.id)
7277
]);
7378

@@ -374,6 +379,15 @@ export default function TasksPage() {
374379
<div className="flex-1 min-w-0">
375380
<div className="flex items-center gap-3 mb-3">
376381
<TaskStatusBadge status={task.status || ''} />
382+
{task.pr_url && task.pr_number && (
383+
<PRStatusBadge
384+
prUrl={task.pr_url}
385+
prNumber={task.pr_number}
386+
prBranch={task.pr_branch}
387+
variant="badge"
388+
size="default"
389+
/>
390+
)}
377391
<span className="text-sm text-slate-500">
378392
Task #{task.id}
379393
</span>
@@ -432,17 +446,14 @@ export default function TasksPage() {
432446
View
433447
</Button>
434448
</Link>
435-
{task.pr_url && (
436-
<a
437-
href={task.pr_url}
438-
target="_blank"
439-
rel="noopener noreferrer"
440-
>
441-
<Button variant="outline" size="sm" className="gap-2">
442-
<ExternalLink className="w-4 h-4" />
443-
PR #{task.pr_number}
444-
</Button>
445-
</a>
449+
{task.pr_url && task.pr_number && (
450+
<PRStatusBadge
451+
prUrl={task.pr_url}
452+
prNumber={task.pr_number}
453+
prBranch={task.pr_branch}
454+
variant="button"
455+
size="sm"
456+
/>
446457
)}
447458
</div>
448459
</div>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { GitPullRequest, ExternalLink } from "lucide-react";
2+
import { Badge } from "@/components/ui/badge";
3+
import { Button } from "@/components/ui/button";
4+
import { cn } from "@/lib/utils";
5+
6+
interface PRStatusBadgeProps {
7+
prUrl?: string | null;
8+
prNumber?: number | null;
9+
prBranch?: string | null;
10+
variant?: "badge" | "button";
11+
size?: "sm" | "default";
12+
className?: string;
13+
}
14+
15+
export function PRStatusBadge({
16+
prUrl,
17+
prNumber,
18+
prBranch,
19+
variant = "badge",
20+
size = "sm",
21+
className
22+
}: PRStatusBadgeProps) {
23+
if (!prUrl || !prNumber) {
24+
return null;
25+
}
26+
27+
const handleClick = () => {
28+
if (prUrl) {
29+
window.open(prUrl, '_blank', 'noopener,noreferrer');
30+
}
31+
};
32+
33+
if (variant === "button") {
34+
return (
35+
<Button
36+
onClick={handleClick}
37+
variant="outline"
38+
size={size}
39+
className={cn("gap-2 transition-colors hover:bg-blue-50 hover:border-blue-300", className)}
40+
>
41+
<GitPullRequest className="w-4 h-4 text-blue-600" />
42+
<span className="text-blue-600">PR #{prNumber}</span>
43+
<ExternalLink className="w-3 h-3 text-blue-600" />
44+
</Button>
45+
);
46+
}
47+
48+
return (
49+
<Badge
50+
onClick={handleClick}
51+
variant="outline"
52+
className={cn(
53+
"gap-1 cursor-pointer transition-all hover:shadow-sm",
54+
"bg-blue-50 border-blue-200 text-blue-700 hover:bg-blue-100 hover:border-blue-300",
55+
size === "sm" ? "text-xs px-2 py-1" : "text-sm px-3 py-1",
56+
className
57+
)}
58+
>
59+
<GitPullRequest className={cn(size === "sm" ? "w-3 h-3" : "w-4 h-4")} />
60+
<span>PR #{prNumber}</span>
61+
<ExternalLink className={cn(size === "sm" ? "w-2.5 h-2.5" : "w-3 h-3")} />
62+
</Badge>
63+
);
64+
}

0 commit comments

Comments
 (0)