web/app/%5Bowner%5D/%5Brepo%5D/(tabs)/diffs/page.tsxblame
View source
d12933e1import type { Metadata } from "next";
d12933e2import Link from "next/link";
bc1b2ba3import { timeAgoFromDate } from "@/lib/utils";
bc1b2ba4import { getRepoDiffs } from "@/lib/grove-api";
d12933e5
d12933e6interface Props {
d12933e7 params: Promise<{ owner: string; repo: string }>;
d12933e8 searchParams: Promise<{ status?: string }>;
d12933e9}
d12933e10
d12933e11export async function generateMetadata({ params }: Props): Promise<Metadata> {
d12933e12 const { repo } = await params;
d12933e13 return { title: `Diffs · ${repo}` };
d12933e14}
d12933e15
d12933e16
d12933e17const statusStyles: Record<string, { bg: string; text: string; border: string }> = {
d12933e18 open: { bg: "var(--status-open-bg)", text: "var(--status-open-text)", border: "var(--status-open-border)" },
2ec686819 landed: { bg: "var(--status-merged-bg)", text: "var(--status-merged-text)", border: "var(--status-merged-border)" },
d12933e20 closed: { bg: "var(--status-closed-bg)", text: "var(--status-closed-text)", border: "var(--status-closed-border)" },
d12933e21};
d12933e22
d12933e23export default async function DiffsPage({
d12933e24 params,
d12933e25 searchParams,
d12933e26}: Props) {
d12933e27 const { owner, repo } = await params;
d12933e28 const { status: statusParam } = await searchParams;
d12933e29 const status = statusParam ?? "open";
d12933e30
bc1b2ba31 const data = await getRepoDiffs(owner, repo, status);
d12933e32
d12933e33 return (
d12933e34 <>
d12933e35 <div className="flex items-center justify-between mb-4">
d12933e36 <div className="flex gap-4 text-sm">
2ec686837 {(["open", "landed", "closed"] as const).map((s) => (
d12933e38 <Link
d12933e39 key={s}
d12933e40 href={`/${owner}/${repo}/diffs?status=${s}`}
d12933e41 className="capitalize"
d12933e42 style={{
d12933e43 color: status === s ? "var(--text-primary)" : "var(--text-muted)",
d12933e44 fontWeight: status === s ? 600 : 400,
d12933e45 }}
d12933e46 >
d12933e47 {s}
d12933e48 </Link>
d12933e49 ))}
d12933e50 </div>
55e950151 <Link
55e950152 href={`/${owner}/${repo}/diffs/new`}
55e950153 className="text-sm px-3 py-1"
55e950154 style={{
55e950155 backgroundColor: "var(--accent)",
55e950156 color: "var(--accent-text)",
55e950157 }}
55e950158 >
55e950159 New diff
55e950160 </Link>
d12933e61 </div>
d12933e62
d12933e63 {data?.diffs?.length ? (
d12933e64 <div style={{ border: "1px solid var(--border-subtle)" }}>
d12933e65 <table className="w-full text-sm">
d12933e66 <tbody>
d12933e67 {data.diffs.map((d: any, i: number) => {
d12933e68 const style = statusStyles[d.status ?? status] ?? statusStyles.open;
d12933e69 return (
d12933e70 <tr
d12933e71 key={d.id}
d12933e72 className="hover-row"
d12933e73 style={{
d12933e74 borderTop:
d12933e75 i > 0 ? "1px solid var(--divide)" : undefined,
d12933e76 }}
d12933e77 >
d12933e78 <td className="py-2.5 pl-3 pr-3">
d12933e79 <div className="flex items-center gap-2">
d12933e80 <span
d12933e81 className="text-xs px-1.5 py-0.5 shrink-0"
d12933e82 style={{
d12933e83 backgroundColor: style.bg,
d12933e84 color: style.text,
d12933e85 border: `1px solid ${style.border}`,
d12933e86 }}
d12933e87 >
d12933e88 {d.status ?? status}
d12933e89 </span>
d12933e90 <Link
d12933e91 href={`/${owner}/${repo}/diffs/${d.number}`}
d12933e92 className="hover:underline truncate"
d12933e93 style={{ color: "var(--accent)" }}
d12933e94 >
d12933e95 {d.title}
d12933e96 </Link>
d12933e97 </div>
d12933e98 <div
d12933e99 className="text-xs mt-0.5 ml-0"
d12933e100 style={{ color: "var(--text-muted)" }}
d12933e101 >
d12933e102 D{d.number} by {d.author_name}
d12933e103 </div>
d12933e104 </td>
d12933e105 <td
2ec6868106 className="py-2 text-xs font-mono text-right w-28 hidden sm:table-cell"
d12933e107 style={{ color: "var(--text-faint)" }}
d12933e108 >
2ec6868109 {d.head_commit?.slice(0, 8)}
d12933e110 </td>
d12933e111 <td
d12933e112 className="py-2 pr-3 text-xs text-right w-20"
d12933e113 style={{ color: "var(--text-faint)" }}
d12933e114 >
d12933e115 {timeAgoFromDate(d.created_at)}
d12933e116 </td>
d12933e117 </tr>
d12933e118 );
d12933e119 })}
d12933e120 </tbody>
d12933e121 </table>
d12933e122 </div>
d12933e123 ) : (
d12933e124 <p className="text-sm py-8 text-center" style={{ color: "var(--text-faint)" }}>
d12933e125 No {status} diffs.
d12933e126 </p>
d12933e127 )}
d12933e128 </>
d12933e129 );
d12933e130}