"use client"; import { useState, useEffect, useTransition } from "react"; import { formatBytes } from "@/lib/format"; import { useDictionary } from "@/components/DictionaryContext"; interface Domain { domain_name: string; description: string; active: string; mboxes_in_domain: number; mboxes_left: number; max_num_mboxes_for_domain: number; aliases_in_domain: number; quota_used_in_domain: string; max_quota_for_domain: number; } export default function DomainsPage() { const [domains, setDomains] = useState([]); const [loading, setLoading] = useState(true); const [showModal, setShowModal] = useState(false); const [isPending, startTransition] = useTransition(); const [search, setSearch] = useState(""); const [form, setForm] = useState({ domain: "", description: "", mailboxes: "10", quota: "10240", maxquota: "10240" }); const [formError, setFormError] = useState(""); const dict = useDictionary(); const fetchDomains = async () => { setLoading(true); const res = await fetch("/api/domains"); if (res.ok) setDomains(await res.json()); setLoading(false); }; useEffect(() => { fetchDomains(); }, []); const handleCreate = (e: React.FormEvent) => { e.preventDefault(); setFormError(""); startTransition(async () => { const res = await fetch("/api/domains", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ domain: form.domain, description: form.description, mailboxes: parseInt(form.mailboxes), quota: parseInt(form.quota), maxquota: parseInt(form.maxquota), }), }); if (res.ok) { setShowModal(false); setForm({ domain: "", description: "", mailboxes: "10", quota: "10240", maxquota: "10240" }); fetchDomains(); } else { const data = await res.json(); let msg = "Bir hata oluştu"; if (Array.isArray(data)) { msg = data.map((d: any) => { if (typeof d.msg === "string") return d.msg; if (Array.isArray(d.msg)) return d.msg.join(", "); return JSON.stringify(d.msg || d); }).join(" | "); } else if (data?.error) { msg = data.error; } setFormError(msg); } }); }; const handleDelete = (domain: string) => { if (!confirm(`"${domain}" domainini silmek istediğinizden emin misiniz?\n\nBu işlem geri alınamaz!`)) return; startTransition(async () => { await fetch(`/api/domains/${encodeURIComponent(domain)}`, { method: "DELETE" }); fetchDomains(); }); }; const filtered = domains.filter( (d) => d.domain_name.toLowerCase().includes(search.toLowerCase()) || d.description?.toLowerCase().includes(search.toLowerCase()) ); return ( <>

{dict.domains.title || "Domainler"}

{domains.length} {dict.domains.subtitle || "domain listeleniyor"}

setSearch(e.target.value)} />
{loading ? (
) : filtered.length === 0 ? (
{dict.domains.noDomains || "Domain bulunamadı"}
{dict.domains.tryDiffSearch || "Farklı bir arama yapın."}
) : ( {filtered.map((d) => { const quotaUsed = Number(d.quota_used_in_domain); const quotaTotal = d.max_quota_for_domain; const pct = quotaTotal > 0 ? Math.min((quotaUsed / quotaTotal) * 100, 100) : 0; return ( ); })}
{dict.domains.domain || "Domain"} {dict.domains.mailboxes || "Mail Kutuları"} {dict.domains.aliases || "Alias"} {dict.domains.quota || "Kota"} {dict.domains.status || "Durum"} {dict.domains.actions || "İşlemler"}
{d.domain_name}
{d.description &&
{d.description}
}
{d.mboxes_in_domain} / {d.max_num_mboxes_for_domain} {d.aliases_in_domain}
{formatBytes(quotaUsed)} / {formatBytes(quotaTotal)}
80 ? "danger" : ""}`} style={{ width: `${pct}%` }} />
{Math.round(pct)}%
{String(d.active) === "1" ? `● ${dict.domains.active || "Aktif"}` : `● ${dict.domains.inactive || "Pasif"}`}
)}
{showModal && (
e.target === e.currentTarget && setShowModal(false)}>

{dict.domains.addDomain || "Domain Ekle"}

{formError &&
{formError}
}
setForm({ ...form, domain: e.target.value })} required />
setForm({ ...form, description: e.target.value })} />
setForm({ ...form, mailboxes: e.target.value })} />
setForm({ ...form, quota: e.target.value })} />
)} ); } function PlusIcon() { return ; } function SearchIcon() { return ; } function RefreshIcon() { return ; } function GlobeIcon({ size = 13 }: { size?: number }) { return ; } function TrashIcon() { return ; } function XIcon() { return ; }