"use client"; import { useParams } from "next/navigation"; import { cn } from "@/lib/utils"; import { api } from "@/lib/trpc"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; function memberInitials(name: string | null | undefined, email: string) { const n = name?.trim(); if (n) return n.slice(0, 1).toUpperCase(); return email.trim().slice(0, 1).toUpperCase(); } function formatRoleLabel(role: string) { const key = role.toLowerCase(); const labels: Record = { owner: "Owner", admin: "Admin", member: "Member", }; return labels[key] ?? role.charAt(0).toUpperCase() + role.slice(1).toLowerCase(); } function MemberCardSkeleton({ className }: { className?: string }) { return (
); } export default function TeamsPage() { const params = useParams(); const rawSlug = params?.workspaceSlug; const workspaceSlug = typeof rawSlug === "string" ? rawSlug : undefined; const { data: members, isLoading } = api.workspaces.listMembers.useQuery( { workspace: workspaceSlug as string }, { enabled: Boolean(workspaceSlug) }, ); return (

Teams

{!workspaceSlug ? (

Missing workspace.

) : isLoading ? (
{Array.from({ length: 6 }).map((_, i) => ( ))}
) : !members?.length ? (
No members in this workspace yet.
) : (
{members.map((m) => { const displayName = m.name?.trim() || m.email; return ( {m.avatarUrl ? ( ) : null} {memberInitials(m.name, m.email)}

{displayName}

{m.email}

{formatRoleLabel(m.role)}
); })}
)}
); }