"use client"; import { useState, useEffect, useCallback } from "react"; import { useParams } from "next/navigation"; import MailLogin from "@/components/mail/MailLogin"; import FolderList from "@/components/mail/FolderList"; import MessageList from "@/components/mail/MessageList"; import MessageView from "@/components/mail/MessageView"; import ComposeModal from "@/components/mail/ComposeModal"; import { useDictionary } from "@/components/DictionaryContext"; export interface MailFolder { name: string; path: string; specialUse?: string; messages: number; unseen: number; } export interface MailEnvelope { uid: number; subject: string; from: { name: string; address: string }[]; to: { name: string; address: string }[]; date: string; seen: boolean; flagged: boolean; hasAttachments: boolean; } export interface MailMessage extends MailEnvelope { cc: { name: string; address: string }[]; html: string; text: string; attachments: { filename: string; contentType: string; size: number }[]; } export default function MailPage() { const params = useParams(); const lang = params.lang as string; const [connected, setConnected] = useState(null); const [email, setEmail] = useState(""); const [folders, setFolders] = useState([]); const [activeFolder, setActiveFolder] = useState("INBOX"); const [messages, setMessages] = useState([]); const [selectedUid, setSelectedUid] = useState(null); const [openMessage, setOpenMessage] = useState(null); const [loading, setLoading] = useState(false); const [showCompose, setShowCompose] = useState(false); const [replyTo, setReplyTo] = useState(null); const dict = useDictionary(); const getFolderLabel = (path: string): string => { const folder = folders.find((f) => f.path === path); const name = folder?.name || path; const lower = name.toLowerCase(); if (lower === "inbox") return dict.mailClient.inbox || "Inbox"; if (lower === "sent") return dict.mailClient.sent || "Sent"; if (lower === "drafts") return dict.mailClient.drafts || "Drafts"; if (lower === "trash") return dict.mailClient.trash || "Trash"; if (lower === "junk" || lower === "spam") return dict.mailClient.junk || "Junk"; if (lower === "archive") return dict.mailClient.archive || "Archive"; return name; }; // Check connection useEffect(() => { fetch("/api/mail/auth") .then((r) => r.json()) .then((d) => { setConnected(d.connected); if (d.email) setEmail(d.email); }); }, []); // Load folders const loadFolders = useCallback(async () => { const res = await fetch("/api/mail/folders"); if (res.ok) setFolders(await res.json()); }, []); // Load messages const loadMessages = useCallback(async (folder: string) => { setLoading(true); const res = await fetch(`/api/mail/messages?folder=${encodeURIComponent(folder)}`); if (res.ok) { const data = await res.json(); setMessages(data.messages ?? []); } setLoading(false); }, []); useEffect(() => { if (connected) { loadFolders(); loadMessages(activeFolder); } }, [connected, activeFolder, loadFolders, loadMessages]); // Open message const openMsg = async (uid: number) => { setSelectedUid(uid); const res = await fetch(`/api/mail/messages/${uid}?folder=${encodeURIComponent(activeFolder)}`); if (res.ok) { const msg = await res.json(); setOpenMessage(msg); // Mark as read in list setMessages((prev) => prev.map((m) => m.uid === uid ? { ...m, seen: true } : m)); } }; // Delete const handleDelete = async (uid: number) => { await fetch("/api/mail/messages", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "delete", folder: activeFolder, uid }), }); setMessages((prev) => prev.filter((m) => m.uid !== uid)); if (selectedUid === uid) { setSelectedUid(null); setOpenMessage(null); } }; // Reply const handleReply = (msg: MailMessage) => { setReplyTo(msg); setShowCompose(true); }; // Disconnect const handleDisconnect = async () => { await fetch("/api/mail/auth", { method: "DELETE" }); setConnected(false); setEmail(""); setFolders([]); setMessages([]); setOpenMessage(null); }; if (connected === null) { return
; } if (!connected) { return { setConnected(true); setEmail(e); }} />; } return (
{ setActiveFolder(f); setSelectedUid(null); setOpenMessage(null); }} />
{email}

{getFolderLabel(activeFolder)}

{openMessage ? ( handleReply(openMessage)} onDelete={() => handleDelete(openMessage.uid)} folder={activeFolder} /> ) : (
{dict.mailClient.selectMail || "Bir mail seçin"}
{dict.mailClient.selectMailDesc || "Okumak için soldaki listeden bir mail seçin"}
)}
{showCompose && ( { setShowCompose(false); setReplyTo(null); }} onSent={() => { setShowCompose(false); setReplyTo(null); loadMessages(activeFolder); }} /> )}
); } function MailBigIcon() { return ; } function ComposeIcon() { return ; }