import { CheckCircle2, Clock3, MoreHorizontal, Plus, Search, Upload, X, XCircle, } from "lucide-react"; import { useCallback, useEffect, useMemo, useState } from "react"; import { createOrgMember, listOrgMembers } from "../api"; const STATUS_TABS = [ { key: "all", label: "All users" }, { key: "active", label: "Active" }, { key: "invited", label: "Invited" }, { key: "suspended", label: "Suspended" }, ]; const GROUP_OPTIONS = ["Admin", "HR", "Engineering", "Finance"]; function initials(firstName, lastName) { return `${firstName?.[0] || ""}${lastName?.[0] || ""}`.toUpperCase(); } function roleLabel(member) { if (member.is_domain_owner || member.org_role === "owner") return "Owner"; if (member.org_role === "admin") return "User Admin"; return "User"; } function groupLabel(member) { if (member.is_domain_owner || member.org_role === "owner" || member.org_role === "admin") { return "Admin"; } return "—"; } function StatusBadge({ status }) { if (status === "active") { return ( Active ); } if (status === "invited") { return ( Invited ); } return ( Suspended ); } function AddUserPanel({ companyDomain, onClose, onCreated }) { const token = sessionStorage.getItem("agmail_access_token"); const [form, setForm] = useState({ first_name: "", last_name: "", email_local: "", org_role: "user", groups: [], send_invitation: true, password: "", }); const [status, setStatus] = useState({ loading: false, error: "" }); function updateField(field, value) { setForm((current) => ({ ...current, [field]: value })); } function toggleGroup(group) { setForm((current) => { const exists = current.groups.includes(group); return { ...current, groups: exists ? current.groups.filter((item) => item !== group) : [...current.groups, group], }; }); } async function handleSubmit(event) { event.preventDefault(); setStatus({ loading: true, error: "" }); const email = `${form.email_local.trim().toLowerCase()}@${companyDomain}`; try { const member = await createOrgMember( { first_name: form.first_name.trim(), last_name: form.last_name.trim(), email, org_role: form.org_role, send_invitation: form.send_invitation, password: form.send_invitation ? undefined : form.password, }, token, ); onCreated?.(member); onClose(); } catch (error) { setStatus({ loading: false, error: error.message }); } } return (
); } export default function CompanyPeople({ account }) { const token = sessionStorage.getItem("agmail_access_token"); const companyDomain = account.company_domain; const [members, setMembers] = useState([]); const [counts, setCounts] = useState({ all: 0, active: 0, invited: 0, suspended: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [statusTab, setStatusTab] = useState("all"); const [search, setSearch] = useState(""); const [roleFilter, setRoleFilter] = useState("all"); const [drawerOpen, setDrawerOpen] = useState(false); const loadMembers = useCallback(async () => { setLoading(true); setError(""); try { const data = await listOrgMembers(token); setMembers(data.items); setCounts(data.counts); } catch (err) { setError(err.message); } finally { setLoading(false); } }, [token]); useEffect(() => { loadMembers(); }, [loadMembers]); const filteredMembers = useMemo(() => { const query = search.trim().toLowerCase(); return members.filter((member) => { if (statusTab !== "all" && member.member_status !== statusTab) { return false; } if (roleFilter === "admin" && member.org_role !== "admin" && !member.is_domain_owner) { return false; } if (roleFilter === "user" && (member.org_role !== "user" || member.is_domain_owner)) { return false; } if (!query) return true; const haystack = `${member.first_name} ${member.last_name} ${member.email}`.toLowerCase(); return haystack.includes(query); }); }, [members, roleFilter, search, statusTab]); return (

People

Manage your team members and their email accounts.

{STATUS_TABS.map((tab) => ( ))}
{error &&

{error}

}
{loading ? ( ) : filteredMembers.length === 0 ? ( ) : ( filteredMembers.map((member) => ( )) )}
Name Email Status Role Group Storage Last active
Loading people…
{members.length === 0 ? "No team members yet. Add your first user to get started." : "No people match your filters."}
{initials(member.first_name, member.last_name)} {member.first_name} {member.last_name}
{member.email} {roleLabel(member)} {groupLabel(member)} {member.member_status === "invited" ? "—" : "—"} {member.member_status === "invited" ? "—" : "—"}
{drawerOpen && ( setDrawerOpen(false)} onCreated={() => loadMembers()} /> )}
); }