"use client"; import { X } from "lucide-react"; import { type FormEvent, useCallback, useEffect, useState } from "react"; import { SettingsCard, SettingsSection, } from "@/components/settings/settings-parts"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { ROLE_LABELS } from "@/lib/access"; import { authClient } from "@/lib/auth-client"; type Member = { id: string; role: string; userId: string; user?: { name?: string | null; email?: string | null }; }; type Invite = { id: string; email: string; role?: string | null; status: string; }; const INVITE_ROLES = ["member", "admin", "viewer"] as const; function roleLabel(role?: string | null): string { if (!role) return "Member"; return (ROLE_LABELS as Record)[role] ?? role; } function initials(name?: string | null, email?: string | null): string { const source = name?.trim() || email?.trim() || "?"; return ( source .split(/\s+/) .map((w) => w[0]) .filter(Boolean) .join("") .slice(0, 2) .toUpperCase() || "?" ); } export function CareTeamPanel() { const { data: session } = authClient.useSession(); const [members, setMembers] = useState([]); const [invites, setInvites] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [notice, setNotice] = useState(null); const [email, setEmail] = useState(""); const [role, setRole] = useState<(typeof INVITE_ROLES)[number]>("member"); const [inviting, setInviting] = useState(false); const load = useCallback(async () => { const { data, error: err } = await authClient.organization.getFullOrganization(); if (err || !data) { setError(err?.message ?? "Could not load the care team."); setLoading(false); return; } setMembers((data.members ?? []) as Member[]); setInvites( ((data.invitations ?? []) as Invite[]).filter( (i) => i.status === "pending" ) ); setError(null); setLoading(false); }, []); useEffect(() => { void load(); }, [load]); const myRole = members.find((m) => m.userId === session?.user?.id)?.role; const canManage = myRole === "owner" || myRole === "admin"; const invite = async (event: FormEvent) => { event.preventDefault(); if (!email.trim() || inviting) return; setInviting(true); setNotice(null); setError(null); const { error: err } = await authClient.organization.inviteMember({ email: email.trim(), role, }); setInviting(false); if (err) { setError(err.message ?? "Could not send the invitation."); return; } setEmail(""); setNotice(`Invitation sent to ${email.trim()}.`); void load(); }; const removeMember = async (memberId: string) => { await authClient.organization.removeMember({ memberIdOrEmail: memberId }); void load(); }; const cancelInvite = async (invitationId: string) => { await authClient.organization.cancelInvitation({ invitationId }); void load(); }; return ( {error && (

{error}

)} {notice && (

{notice}

)} {canManage && (
setEmail(e.target.value)} placeholder="colleague@clinic.org" required type="email" value={email} />
)} {loading ? (

Loading care team…

) : ( members.map((m) => { const isSelf = m.userId === session?.user?.id; return (
{initials(m.user?.name, m.user?.email)}

{m.user?.name || m.user?.email || m.userId} {isSelf && ( (you) )}

{m.user?.email && (

{m.user.email}

)}
{roleLabel(m.role)} {canManage && !isSelf && m.role !== "owner" && ( )}
); }) )}
{invites.length > 0 && (

Pending invitations

{invites.map((inv) => (

{inv.email}

{roleLabel(inv.role)} {canManage && ( )}
))}
)}
); }