import { ArrowRight, CheckCircle2, ChevronRight, CreditCard, Database, FileUp, Globe, RefreshCw, Shield, UserPlus, Users, UsersRound, } from "lucide-react"; import { useCallback, useEffect, useMemo, useState } from "react"; import { listMailGroups, listMyDomains, listOrgMembers, verifyMyDomainDns, } from "../api"; import { getOrgDetails } from "./CompanyOverviewSetup"; import { formatRelativeTime, parseApiDate } from "../utils/datetime"; const HEALTH_ITEMS = [ { purpose: "ownership", label: "Domain verified" }, { purpose: "mx", label: "MX records" }, { purpose: "spf", label: "SPF" }, { purpose: "dkim", label: "DKIM" }, { purpose: "dmarc", label: "DMARC" }, ]; function companyTitle(account, details, domainName) { if (details?.companyName?.trim()) return details.companyName.trim(); if (domainName) { const base = domainName.split(".")[0]; return base.charAt(0).toUpperCase() + base.slice(1); } return `${account.first_name} ${account.last_name}`.trim(); } function StatCard({ icon: Icon, tone, label, value, detail }) { return (

{label}

{value} {detail}
); } export default function CompanyOverview({ account, companyDomain, onNavigate }) { const token = sessionStorage.getItem("agmail_access_token"); const domainName = companyDomain?.domain_name || account.company_domain || ""; const details = getOrgDetails(account.id); const [loading, setLoading] = useState(true); const [members, setMembers] = useState({ items: [], counts: {} }); const [groups, setGroups] = useState({ items: [], counts: {} }); const [domains, setDomains] = useState([]); const [dnsChecks, setDnsChecks] = useState([]); const [lastChecked, setLastChecked] = useState(null); const [dnsLoading, setDnsLoading] = useState(false); const [dnsError, setDnsError] = useState(""); const loadOverview = useCallback(async () => { setLoading(true); try { const [memberData, groupData, domainData] = await Promise.all([ listOrgMembers(token), listMailGroups(token), listMyDomains(token), ]); setMembers(memberData); setGroups(groupData); setDomains(domainData); } finally { setLoading(false); } }, [token]); const loadDnsHealth = useCallback(async () => { const primary = domains.find((domain) => domain.domain_name === domainName) || domains[0]; if (!primary) { setDnsChecks([]); return; } setDnsLoading(true); setDnsError(""); try { const result = await verifyMyDomainDns(primary.id, token); const checkMap = Object.fromEntries(result.checks.map((check) => [check.purpose, check])); setDnsChecks(HEALTH_ITEMS.map((item) => ({ ...item, verified: checkMap[item.purpose]?.verified ?? false, recommended: item.purpose === "dmarc" && !checkMap[item.purpose]?.verified, }))); setLastChecked(new Date()); if (result.status !== primary.status) { setDomains((current) => current.map((domain) => ( domain.id === primary.id ? { ...domain, status: result.status } : domain ))); } } catch (error) { setDnsError(error.message || "Could not verify DNS records."); } finally { setDnsLoading(false); } }, [domainName, domains, token]); useEffect(() => { loadOverview(); }, [loadOverview]); useEffect(() => { if (!loading) { loadDnsHealth(); } }, [loadDnsHealth, loading]); const activity = useMemo(() => { const events = [ ...members.items.map((member) => ({ id: `member-${member.id}`, icon: Users, text: `${member.first_name} ${member.last_name} joined the organization`, time: member.created_at, })), ...groups.items.map((group) => ({ id: `group-${group.id}`, icon: UsersRound, text: `${group.name} group created`, time: group.created_at, })), ]; return events .sort((left, right) => (parseApiDate(right.time)?.getTime() || 0) - (parseApiDate(left.time)?.getTime() || 0)) .slice(0, 5); }, [groups.items, members.items]); const primaryDomain = domains.find((domain) => domain.domain_name === domainName) || domains[0]; const secondaryCount = Math.max(0, domains.length - 1); const distributionCount = groups.items.filter((group) => group.group_type === "distribution").length; const dynamicCount = groups.items.filter((group) => group.group_type === "dynamic").length; return (

{companyTitle(account, details, domainName)}

Business

Manage your organisation, people and email settings.

Domain health

{primaryDomain ? ( <>
    {dnsChecks.map((item) => (
  • {item.label} {item.recommended && !item.verified && ( Recommended )}
  • ))}
{dnsError ? dnsError : lastChecked ? `Last checked ${formatRelativeTime(lastChecked, { compact: true })}` : "Not checked yet"}
) : (

No domains configured yet.

)}

Recent activity

{activity.length === 0 ? (

No recent activity yet.

) : (
    {activity.map((item) => { const Icon = item.icon; return (
  • {item.text}

  • ); })}
)}

Admin shortcuts

); }