Skip to content

Commit 0ee9607

Browse files
committed
A bunch of fixes
1 parent c1e218c commit 0ee9607

File tree

7 files changed

+610
-256
lines changed

7 files changed

+610
-256
lines changed

src/browser/components/file-header.tsx

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Check, FileCode } from "lucide-react";
1+
import { Check, FileCode, ChevronLeft, ChevronRight } from "lucide-react";
22
import { cn } from "../cn";
33
import { Keycap } from "../ui/keycap";
44
import type { PullRequestFile } from "@/api/types";
@@ -8,12 +8,20 @@ interface FileHeaderProps {
88
file: PullRequestFile;
99
isViewed: boolean;
1010
onToggleViewed: () => void;
11+
currentIndex?: number;
12+
totalFiles?: number;
13+
onPrevFile?: () => void;
14+
onNextFile?: () => void;
1115
}
1216

1317
export const FileHeader = memo(function FileHeader({
1418
file,
1519
isViewed,
1620
onToggleViewed,
21+
currentIndex,
22+
totalFiles,
23+
onPrevFile,
24+
onNextFile,
1725
}: FileHeaderProps) {
1826
const fileStatusBadge = (() => {
1927
switch (file.status) {
@@ -40,22 +48,52 @@ export const FileHeader = memo(function FileHeader({
4048
}
4149
})();
4250

51+
const showNavigation = currentIndex !== undefined && totalFiles !== undefined;
52+
4353
return (
4454
<div className="flex items-center justify-between">
45-
<div className="flex items-center gap-3">
46-
<FileCode className="w-4 h-4 text-muted-foreground" />
47-
<span className="font-mono text-sm font-medium">{file.filename}</span>
55+
<div className="flex items-center gap-3 min-w-0 flex-1">
56+
<FileCode className="w-4 h-4 text-muted-foreground shrink-0" />
57+
<span className="font-mono text-sm font-medium truncate">{file.filename}</span>
4858
{fileStatusBadge}
49-
<span className="text-xs text-muted-foreground">
59+
<span className="text-xs text-muted-foreground shrink-0">
5060
<span className="text-green-500">+{file.additions}</span>{" "}
5161
<span className="text-red-500">{file.deletions}</span>
5262
</span>
63+
{/* Navigation buttons */}
64+
{showNavigation && (
65+
<div className="flex items-center gap-1 shrink-0 ml-2">
66+
<button
67+
onClick={onPrevFile}
68+
className="flex items-center gap-0.5 px-1.5 py-0.5 text-xs rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground"
69+
title="Previous unreviewed file (k)"
70+
>
71+
<ChevronLeft className="w-3.5 h-3.5" />
72+
<kbd className="hidden sm:inline-block px-1 py-0.5 bg-muted/60 rounded text-[9px] font-mono">
73+
k
74+
</kbd>
75+
</button>
76+
<span className="text-xs text-muted-foreground tabular-nums px-1">
77+
{currentIndex + 1}/{totalFiles}
78+
</span>
79+
<button
80+
onClick={onNextFile}
81+
className="flex items-center gap-0.5 px-1.5 py-0.5 text-xs rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground"
82+
title="Next unreviewed file (j)"
83+
>
84+
<kbd className="hidden sm:inline-block px-1 py-0.5 bg-muted/60 rounded text-[9px] font-mono">
85+
j
86+
</kbd>
87+
<ChevronRight className="w-3.5 h-3.5" />
88+
</button>
89+
</div>
90+
)}
5391
</div>
5492

5593
<button
5694
onClick={onToggleViewed}
5795
className={cn(
58-
"flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors",
96+
"flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors shrink-0",
5997
isViewed
6098
? "bg-green-500/20 text-green-500 hover:bg-green-500/30"
6199
: "bg-muted hover:bg-muted/80 text-muted-foreground"

src/browser/components/home.tsx

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
Circle,
1919
CheckCircle2,
2020
XCircle,
21+
AlertCircle,
2122
MessageSquare,
2223
} from "lucide-react";
2324
import { cn } from "../cn";
@@ -611,13 +612,22 @@ export function Home() {
611612
setOpenRepoDropdown(null);
612613
}}
613614
className={cn(
614-
"flex items-center gap-1.5 px-2 py-1 rounded-md border transition-colors text-xs",
615-
showAddRepo
616-
? "bg-muted border-border text-foreground"
617-
: "border-dashed border-border hover:bg-muted/50 hover:border-solid text-muted-foreground hover:text-foreground"
615+
"group relative flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs font-medium transition-all duration-200",
616+
"bg-gradient-to-r from-emerald-500/10 via-green-500/10 to-teal-500/10",
617+
"border border-emerald-500/20 hover:border-emerald-500/40",
618+
"text-emerald-400 hover:text-emerald-300",
619+
"hover:shadow-[0_0_20px_rgba(16,185,129,0.15)]",
620+
"hover:from-emerald-500/15 hover:via-green-500/15 hover:to-teal-500/15",
621+
showAddRepo && "border-emerald-500/50 shadow-[0_0_20px_rgba(16,185,129,0.2)] from-emerald-500/20 via-green-500/20 to-teal-500/20"
618622
)}
619623
>
620-
<Plus className="w-3.5 h-3.5" />
624+
<span className={cn(
625+
"flex items-center justify-center w-4 h-4 rounded-md transition-all duration-200",
626+
"bg-emerald-500/20 group-hover:bg-emerald-500/30 group-hover:scale-110",
627+
showAddRepo && "bg-emerald-500/30 rotate-45"
628+
)}>
629+
<Plus className="w-3 h-3" />
630+
</span>
621631
<span>Add Repo</span>
622632
</button>
623633

@@ -938,7 +948,9 @@ function PRListItem({ pr, onSelect }: PRListItemProps) {
938948
? "Passed"
939949
: pr.ciStatus === "failure"
940950
? "Failed"
941-
: "Running");
951+
: pr.ciStatus === "action_required"
952+
? "Approval needed"
953+
: "Running");
942954

943955
switch (pr.ciStatus) {
944956
case "success":
@@ -998,6 +1010,18 @@ function PRListItem({ pr, onSelect }: PRListItemProps) {
9981010
</span>
9991011
</span>
10001012
);
1013+
case "action_required":
1014+
return (
1015+
<span
1016+
title="Workflow approval required from a maintainer"
1017+
className="shrink-0 inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] font-medium rounded bg-yellow-500/15 text-yellow-500 border border-yellow-500/30"
1018+
>
1019+
<AlertCircle className="w-3 h-3" />
1020+
<span className="hidden sm:inline max-w-[100px] truncate">
1021+
{summary}
1022+
</span>
1023+
</span>
1024+
);
10011025
default:
10021026
return null;
10031027
}

src/browser/components/pr-header.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
Check,
77
Menu,
88
} from "lucide-react";
9-
import { memo, useState, useCallback } from "react";
9+
import { memo, useState, useCallback, type ReactNode } from "react";
1010
import { cn } from "../cn";
1111
import { UserHoverCard } from "../ui/user-hover-card";
1212
import type { PullRequest } from "@/api/types";
@@ -16,13 +16,15 @@ interface PRHeaderProps {
1616
owner: string;
1717
repo: string;
1818
onToggleSidebar?: () => void;
19+
rightContent?: ReactNode;
1920
}
2021

2122
export const PRHeader = memo(function PRHeader({
2223
pr,
2324
owner,
2425
repo,
2526
onToggleSidebar,
27+
rightContent,
2628
}: PRHeaderProps) {
2729
const stateIcon = pr.merged ? (
2830
<GitMerge className="w-3.5 h-3.5" />
@@ -88,6 +90,16 @@ export const PRHeader = memo(function PRHeader({
8890
<span>{pr.title}</span>
8991
<span className="text-muted-foreground ml-1.5">#{pr.number}</span>
9092
</span>
93+
{/* External Link - moved here next to title */}
94+
<a
95+
href={`https://github.com/${owner}/${repo}/pull/${pr.number}`}
96+
target="_blank"
97+
rel="noopener noreferrer"
98+
className="text-muted-foreground hover:text-blue-400 transition-colors shrink-0"
99+
title="View on GitHub"
100+
>
101+
<ExternalLink className="w-4 h-4" />
102+
</a>
91103
{/* Author */}
92104
<UserHoverCard login={pr.user.login}>
93105
<div className="flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer hover:text-foreground transition-colors shrink-0">
@@ -115,16 +127,8 @@ export const PRHeader = memo(function PRHeader({
115127
<span className="text-red-500">{pr.deletions}</span>
116128
</span>
117129

118-
{/* External Link */}
119-
<a
120-
href={`https://github.com/${owner}/${repo}/pull/${pr.number}`}
121-
target="_blank"
122-
rel="noopener noreferrer"
123-
className="text-muted-foreground hover:text-blue-400 transition-colors"
124-
title="View on GitHub"
125-
>
126-
<ExternalLink className="w-4 h-4" />
127-
</a>
130+
{/* Right content slot (e.g., Submit Review button) */}
131+
{rightContent}
128132
</div>
129133
</header>
130134
);

0 commit comments

Comments
 (0)