import { useState, useEffect } from 'react'; import { Mail, Users, Wifi, Copy, CheckCheck } from 'lucide-react'; import { emailAPI } from '../services/api'; import { useConfig } from '../contexts/ConfigContext'; function CopyButton({ text }) { const [copied, setCopied] = useState(false); const copy = () => { navigator.clipboard.writeText(text); setCopied(true); setTimeout(() => setCopied(false), 1500); }; return ( ); } function InfoRow({ label, value }) { return (
{label}
{value}
); } function Email() { const { domain = 'cell', service_ips = {}, service_configs = {} } = useConfig(); const cellHost = `mail.${domain}`; const emailCfg = service_configs.email || {}; const mailIp = service_ips.vip_mail || '172.20.0.23'; const dnsIp = service_ips.dns || '172.20.0.3'; const imapPort = emailCfg.imap_port ?? 993; const smtpPort = emailCfg.smtp_port ?? 25; const webmailPort = emailCfg.webmail_port ?? 8888; const [users, setUsers] = useState([]); const [status, setStatus] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { fetchEmailData(); }, []); const fetchEmailData = async () => { try { const [usersResponse, statusResponse] = await Promise.all([ emailAPI.getUsers(), emailAPI.getStatus() ]); setUsers(usersResponse.data); setStatus(statusResponse.data); } catch (error) { console.error('Failed to fetch email data:', error); } finally { setIsLoading(false); } }; if (isLoading) { return (
); } return (

Email Services

Postfix (SMTP) + Dovecot (IMAP)

{/* Incoming mail */}

Incoming mail (IMAP)

{/* Outgoing mail */}

Outgoing mail (SMTP)

{/* Webmail */}

Webmail

Requires VPN + DNS set to {dnsIp}.

{/* Status */}

Service Status

{status ? (
Postfix (SMTP): Running
Dovecot (IMAP): Running
) : (

Status unavailable

)}
{/* Users */}

Email Accounts

{users.length > 0 ? ( users.map((user, index) => (
{user.username} {user.domain}
)) ) : (

No email accounts configured

)}
); } export default Email;