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 (
);
}
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 */}
{/* Outgoing mail */}
{/* 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;