import { CheckCircle2, Clock3, MoreHorizontal, Plus, Search, UserPlus, Upload, X, XCircle, } from "lucide-react"; import { useCallback, useEffect, useMemo, useState } from "react"; import { listOrgMembers } from "../api"; import AddEmployeeForm from "./AddEmployeeForm"; import ImportUsersPanel from "./ImportUsersPanel"; const STATUS_TABS = [ { key: "all", label: "All users" }, { key: "active", label: "Active" }, { key: "invited", label: "Invited" }, { key: "suspended", label: "Suspended" }, ]; 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 sectionLabel(member) { return member.section_name || "—"; } function StatusBadge({ status }) { if (status === "active") { return ( Active ); } if (status === "invited") { return ( Invited ); } return ( Suspended ); } function AddUserPanel({ companyDomain, onClose, onCreated }) { 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 [importOpen, setImportOpen] = useState(false); const [notice, setNotice] = useState(""); 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]); useEffect(() => { if (sessionStorage.getItem("agmail_open_people_import") === "1") { sessionStorage.removeItem("agmail_open_people_import"); setImportOpen(true); } }, []); 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) => ( ))}
{notice &&

{notice}

} {error &&

{error}

}
{loading ? ( ) : filteredMembers.length === 0 ? ( ) : ( filteredMembers.map((member) => ( )) )}
Name Email Status Role Section 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)} {sectionLabel(member)} {member.member_status === "invited" ? "—" : "—"} {member.member_status === "invited" ? "—" : "—"}
{importOpen && ( setImportOpen(false)} onImported={(result) => { loadMembers(); setNotice(`Imported ${result.created_count} users${result.error_count ? ` (${result.error_count} failed)` : ""}.`); window.setTimeout(() => setNotice(""), 6000); }} /> )} {drawerOpen && ( setDrawerOpen(false)} onCreated={(member) => { loadMembers(); if (member.invitation_sent) { setNotice(`Invitation email sent to ${member.invitation_email}.`); } else if (member.member_status === "invited") { setNotice("User created. Invitation email was not sent."); } else { setNotice("User created."); } window.setTimeout(() => setNotice(""), 5000); }} /> )}
); }