"use client"; import { useState, useEffect, useCallback } from "react"; 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"; 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 [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); // 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}

{folders.find((f) => f.path === activeFolder)?.name ?? activeFolder}

{openMessage ? ( handleReply(openMessage)} onDelete={() => handleDelete(openMessage.uid)} folder={activeFolder} /> ) : (
Bir mail seçin
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 ; }