Skip to content

Commit 8c07daf

Browse files
committed
base UI for testing (authored by Claude)
1 parent d02824d commit 8c07daf

2 files changed

Lines changed: 90 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { ListGroupMembers } from "~/components/auth/ListGroupMembers";
2+
import { Suspense } from "react";
3+
4+
const Page = async ({ params }: { params: Promise<{ id: string }> }) => {
5+
const { id } = await params;
6+
return (
7+
<main>
8+
<div className="mx-auto max-w-6xl space-y-8 px-6 py-12">
9+
<div>
10+
<a
11+
href="/auth/group"
12+
className="text-muted-foreground text-sm hover:underline"
13+
>
14+
← Back to groups
15+
</a>
16+
</div>
17+
<h1 className="text-2xl font-semibold">Group Members</h1>
18+
<Suspense fallback={<p>Loading...</p>}>
19+
<ListGroupMembers groupId={id} />
20+
</Suspense>
21+
</div>
22+
</main>
23+
);
24+
};
25+
26+
export default Page;
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
"use client";
2+
3+
import { createClient } from "~/utils/supabase/client";
4+
import { getGroupMemberList } from "~/utils/supabase/account";
5+
import { useState, useEffect } from "react";
6+
import useInternalError from "~/utils/internalError";
7+
8+
type Member = Awaited<ReturnType<typeof getGroupMemberList>>[number];
9+
10+
const AGENT_TYPE_LABEL: Record<string, string> = {
11+
person: "Person",
12+
organization: "Organization",
13+
automated_agent: "Automated Agent",
14+
anonymous: "Anonymous",
15+
group: "Group",
16+
};
17+
18+
export const ListGroupMembers = ({ groupId }: { groupId: string }) => {
19+
const [members, setMembers] = useState<Member[] | null>(null);
20+
const [error, setError] = useState<string | null>(null);
21+
const internalError = useInternalError();
22+
23+
useEffect(() => {
24+
const fetchMembers = async () => {
25+
try {
26+
const client = createClient();
27+
const data = await getGroupMemberList(client, groupId);
28+
setMembers(data);
29+
} catch (err) {
30+
const userMessage = "Could not load group members";
31+
setError(userMessage);
32+
internalError({ error: err, userMessage });
33+
}
34+
};
35+
void fetchMembers();
36+
}, [groupId, internalError]);
37+
38+
if (error) return <p>Error: {error}</p>;
39+
if (members === null) return <p>Loading...</p>;
40+
if (members.length === 0) return <p>This group has no members.</p>;
41+
42+
return (
43+
<table className="w-full text-left text-sm">
44+
<thead>
45+
<tr className="border-b">
46+
<th className="py-2 pr-4 font-semibold">Name</th>
47+
<th className="py-2 pr-4 font-semibold">Type</th>
48+
<th className="py-2 font-semibold">Admin</th>
49+
</tr>
50+
</thead>
51+
<tbody>
52+
{members.map((m) => (
53+
<tr key={m.id} className="border-b last:border-0">
54+
<td className="py-2 pr-4">{m.name}</td>
55+
<td className="text-muted-foreground py-2 pr-4">
56+
{AGENT_TYPE_LABEL[m.agentType] ?? m.agentType}
57+
</td>
58+
<td className="py-2">{m.admin ? "Yes" : "No"}</td>
59+
</tr>
60+
))}
61+
</tbody>
62+
</table>
63+
);
64+
};

0 commit comments

Comments
 (0)