"use client"; import { useState, useEffect, useTransition, useCallback } from "react"; import { useSession } from "next-auth/react"; import { formatBytes } from "@/lib/format"; import { useDictionary } from "@/components/DictionaryContext"; interface Mailbox { username: string; name: string; local_part: string; domain: string; quota: number; quota_used: number; active: string; // "1" | "0" } interface Domain { domain_name: string; } export default function MailboxesPage() { const { data: session } = useSession(); const [domains, setDomains] = useState([]); const [selectedDomain, setSelectedDomain] = useState(""); const [mailboxes, setMailboxes] = useState([]); const [loading, setLoading] = useState(false); const [showCreateModal, setShowCreateModal] = useState(false); const [showPasswordModal, setShowPasswordModal] = useState(null); const [showInfoModal, setShowInfoModal] = useState(null); const [isPending, startTransition] = useTransition(); const [search, setSearch] = useState(""); const [createForm, setCreateForm] = useState({ local_part: "", name: "", password: "", quota: 3072 }); const [newPassword, setNewPassword] = useState(""); const [formError, setFormError] = useState(""); const dict = useDictionary(); useEffect(() => { fetch("/api/domains") .then((r) => r.json()) .then((data: Domain[]) => { if (Array.isArray(data) && data.length > 0) { setDomains(data); setSelectedDomain(data[0].domain_name); } }); }, []); const fetchMailboxes = useCallback(async (domain: string) => { if (!domain) return; setLoading(true); const res = await fetch(`/api/mailboxes?domain=${encodeURIComponent(domain)}`); const data = await res.json(); setMailboxes(Array.isArray(data) ? data : []); setLoading(false); }, []); useEffect(() => { if (selectedDomain) fetchMailboxes(selectedDomain); }, [selectedDomain, fetchMailboxes]); const handleCreate = (e: React.FormEvent) => { e.preventDefault(); setFormError(""); startTransition(async () => { const res = await fetch("/api/mailboxes", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...createForm, domain: selectedDomain }), }); const data = await res.json(); if (res.ok) { setShowCreateModal(false); setCreateForm({ local_part: "", name: "", password: "", quota: 3072 }); fetchMailboxes(selectedDomain); } else { const msg = Array.isArray(data) ? data.map((d: { msg?: unknown }) => JSON.stringify(d.msg)).join(", ") : (data?.error ?? "Mailcow bağlantısını kontrol edin"); setFormError(String(msg)); } }); }; const handleDelete = (username: string) => { if (!confirm(`"${username}" ${dict.mailboxes.deleteConfirm || "hesabını silmek istediğinizden emin misiniz?"}`)) return; startTransition(async () => { await fetch(`/api/mailboxes/${encodeURIComponent(username)}`, { method: "DELETE" }); setMailboxes((prev) => prev.filter((m) => m.username !== username)); }); }; const handleToggle = (username: string, active: string) => { const newActive = String(active) === "1" ? 0 : 1; startTransition(async () => { await fetch(`/api/mailboxes/${encodeURIComponent(username)}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ active: newActive }), }); setMailboxes((prev) => prev.map((m) => m.username === username ? { ...m, active: String(newActive) } : m) ); }); }; const handlePasswordChange = (e: React.FormEvent) => { e.preventDefault(); if (!showPasswordModal) return; startTransition(async () => { await fetch(`/api/mailboxes/${encodeURIComponent(showPasswordModal)}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ password: newPassword }), }); setShowPasswordModal(null); setNewPassword(""); }); }; const filtered = mailboxes.filter( (m) => m.username.toLowerCase().includes(search.toLowerCase()) || m.name.toLowerCase().includes(search.toLowerCase()) ); const isSuperAdmin = session?.user?.role === "SUPER_ADMIN"; return ( <>

{dict.mailboxes.title || "Mail Hesapları"}

{selectedDomain ? `${selectedDomain} — ${mailboxes.length} ${dict.mailboxes.accounts || "hesap"}` : (dict.mailboxes.selectDomain || "Domain seçin")}

setSearch(e.target.value)} />
{loading ? (
) : filtered.length === 0 ? (
{selectedDomain ? (dict.mailboxes.noMailboxes || "Bu domainde mail hesabı yok") : (dict.mailboxes.selectDomain || "Domain seçin")}
{selectedDomain ? (dict.mailboxes.noMailboxesDesc || "\"Hesap Ekle\" butonuna tıklayın") : (dict.mailboxes.selectDomainDesc || "Sol üstteki listeden domain seçin")}
) : ( {filtered.map((m) => { const usedPct = m.quota > 0 ? Math.min((m.quota_used / m.quota) * 100, 100) : 0; return ( ); })}
{dict.mailboxes.email || "E-posta"} {dict.mailboxes.name || "Ad Soyad"} {dict.mailboxes.quota || "Kota"} {dict.mailboxes.status || "Durum"} {dict.mailboxes.actions || "İşlemler"}
{m.local_part[0]?.toUpperCase()}
{m.username}
{m.name}
{formatBytes(m.quota_used)} / {formatBytes(m.quota)}
80 ? "danger" : ""}`} style={{ width: `${usedPct}%` }} />
{Math.round(usedPct)}%
{String(m.active) === "1" ? `● ${dict.mailboxes.active || "Aktif"}` : `● ${dict.mailboxes.inactive || "Pasif"}`}
)}
{/* Create Modal */} {showCreateModal && (
e.target === e.currentTarget && setShowCreateModal(false)}>

{dict.mailboxes.newAccount || "Yeni Mail Hesabı"}

{formError &&
{formError}
}
setCreateForm({ ...createForm, local_part: e.target.value })} required /> @{selectedDomain}
setCreateForm({ ...createForm, name: e.target.value })} required />
setCreateForm({ ...createForm, password: e.target.value })} required />
setCreateForm({ ...createForm, quota: parseInt(e.target.value) || 3072 })} />
)} {/* Password Modal */} {showPasswordModal && (
e.target === e.currentTarget && setShowPasswordModal(null)}>

{dict.mailboxes.changePassword || "Şifre Değiştir"}

{showPasswordModal} {dict.mailboxes.newPasswordFor || "için yeni şifre"}
setNewPassword(e.target.value)} required autoFocus />
)} {/* Info Modal */} {showInfoModal && (
e.target === e.currentTarget && setShowInfoModal(null)}>

{dict.mailboxes.connectionInfo || "İstemci Bağlantı Bilgileri"}

{showInfoModal} {dict.mailboxes.connectionInfoDesc || "hesabını kurmak için aşağıdaki bilgileri kullanın:"}
{dict.mailboxes.imap || "IMAP (Gelen Sunucu)"}
{dict.mailboxes.server || "Sunucu"}: mail.ayris.tech
{dict.mailboxes.port || "Port"}: 993 (SSL/TLS)
{dict.mailboxes.smtp || "SMTP (Giden Sunucu)"}
{dict.mailboxes.server || "Sunucu"}: mail.ayris.tech
{dict.mailboxes.port || "Port"}: 587 (STARTTLS) veya 465 (SSL)
{dict.mailboxes.auth || "Kimlik Doğrulama"}
{dict.mailboxes.username || "Kullanıcı Adı"}: {showInfoModal}
{dict.mailboxes.password || "Şifre"}: {dict.mailboxes.authPassword || "Hesap oluştururken belirlediğiniz şifre"}
)} ); } // Icons function PlusIcon() { return ; } function SearchIcon() { return ; } function RefreshIcon() { return ; } function MailIcon({ size = 13 }: { size?: number }) { return ; } function TrashIcon() { return ; } function KeyIcon() { return ; } function PauseIcon() { return ; } function PlayIcon() { return ; } function XIcon() { return ; } function InfoIcon() { return ; } function CopyIcon() { return ; }