"use client"; import { UserPlus, X } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { AddStaffDialog } from "@/components/settings/add-staff-dialog"; 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 { ROLE_LABELS } from "@/lib/access"; import { apiFetch } from "@/lib/api-client"; import { authClient } from "@/lib/auth-client"; // One row of /api/staff — clinic members joined to their user record (incl. the // username admin-provisioned staff sign in with). type StaffMember = { id: string; userId: string; role: string; name: string | null; email: string | null; username: string | null; }; function roleLabel(role?: string | null): string { if (!role) return ROLE_LABELS.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 { t } = useTranslation(); const { data: session } = authClient.useSession(); const [members, setMembers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [adding, setAdding] = useState(false); const load = useCallback(async () => { try { const data = await apiFetch("/api/staff"); setMembers(data); setError(null); } catch (err) { setError( err instanceof Error ? err.message : t("settings.careTeam.loadError"), ); } finally { setLoading(false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { void load(); }, [load]); const myRole = members.find((m) => m.userId === session?.user?.id)?.role; const canManage = myRole === "owner" || myRole === "admin"; const removeMember = async (memberId: string) => { await authClient.organization.removeMember({ memberIdOrEmail: memberId }); void load(); }; return ( {error && (

{error}

)} {canManage && (
)} {loading ? (

{t("settings.careTeam.loading")}

) : ( members.map((m) => { const isSelf = m.userId === session?.user?.id; // Prefer the login username; fall back to email for owners who // signed up by email. const secondary = m.username ? `@${m.username}` : m.email; return (
{initials(m.name, m.email)}

{m.name || m.email || m.userId} {isSelf && ( {t("settings.careTeam.you")} )}

{secondary && (

{secondary}

)}
{roleLabel(m.role)} {canManage && !isSelf && m.role !== "owner" && ( )}
); }) )}
{canManage && ( void load()} onOpenChange={setAdding} open={adding} /> )}
); }