feat: complete i18n support, telegram webhook, and security improvements

This commit is contained in:
AyrisAI
2026-05-14 13:46:17 +03:00
parent 4c9a07e3ef
commit cc65a2bd72
23 changed files with 798 additions and 205 deletions

View File

@@ -1,11 +1,13 @@
"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;
@@ -34,6 +36,8 @@ export interface MailMessage extends MailEnvelope {
}
export default function MailPage() {
const params = useParams();
const lang = params.lang as string;
const [connected, setConnected] = useState<boolean | null>(null);
const [email, setEmail] = useState("");
const [folders, setFolders] = useState<MailFolder[]>([]);
@@ -44,6 +48,20 @@ export default function MailPage() {
const [loading, setLoading] = useState(false);
const [showCompose, setShowCompose] = useState(false);
const [replyTo, setReplyTo] = useState<MailMessage | null>(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(() => {
@@ -130,7 +148,7 @@ export default function MailPage() {
<div className="mail-layout">
<div className="mail-sidebar">
<button className="btn btn-primary" style={{ width: "100%" }} onClick={() => { setReplyTo(null); setShowCompose(true); }}>
<ComposeIcon /> Yeni Mail
<ComposeIcon /> {dict.mailClient.newMail || "Yeni Mail"}
</button>
<FolderList
folders={folders}
@@ -140,7 +158,7 @@ export default function MailPage() {
<div className="mail-account">
<div className="mail-account-email">{email}</div>
<button className="btn btn-ghost btn-sm" onClick={handleDisconnect} style={{ fontSize: 11 }}>
Çıkış
{dict.mailClient.logout || ıkış"}
</button>
</div>
</div>
@@ -148,7 +166,7 @@ export default function MailPage() {
<div className="mail-list">
<div className="mail-list-header">
<h2>
{folders.find((f) => f.path === activeFolder)?.name ?? activeFolder}
{getFolderLabel(activeFolder)}
</h2>
<button className="btn btn-ghost btn-sm" onClick={() => loadMessages(activeFolder)}></button>
</div>
@@ -174,8 +192,8 @@ export default function MailPage() {
<div className="mail-empty-icon">
<MailBigIcon />
</div>
<div style={{ fontWeight: 600, fontSize: 14, color: "var(--text-secondary)" }}>Bir mail seçin</div>
<div style={{ fontSize: 12 }}>Okumak için soldaki listeden bir mail seçin</div>
<div style={{ fontWeight: 600, fontSize: 14, color: "var(--text-secondary)" }}>{dict.mailClient.selectMail || "Bir mail seçin"}</div>
<div style={{ fontSize: 12 }}>{dict.mailClient.selectMailDesc || "Okumak için soldaki listeden bir mail seçin"}</div>
</div>
)}
</div>