feat: complete i18n support, telegram webhook, and security improvements
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user