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,23 +1,25 @@
"use client";
import type { MailEnvelope } from "@/app/[lang]/dashboard/mail/page";
import { useDictionary } from "@/components/DictionaryContext";
import { useParams } from "next/navigation";
function timeAgo(dateStr: string): string {
function timeAgo(dateStr: string, lang: string): string {
const now = new Date();
const d = new Date(dateStr);
const diff = now.getTime() - d.getTime();
const mins = Math.floor(diff / 60000);
if (mins < 1) return "şimdi";
if (mins < 60) return `${mins}dk`;
if (mins < 1) return lang === "tr" ? "şimdi" : "now";
if (mins < 60) return `${mins}${lang === "tr" ? "dk" : "m"}`;
const hrs = Math.floor(mins / 60);
if (hrs < 24) return `${hrs}sa`;
if (hrs < 24) return `${hrs}${lang === "tr" ? "sa" : "h"}`;
const days = Math.floor(hrs / 24);
if (days < 7) return `${days}g`;
return d.toLocaleDateString("tr-TR", { day: "numeric", month: "short" });
if (days < 7) return `${days}${lang === "tr" ? "g" : "d"}`;
return d.toLocaleDateString(lang === "tr" ? "tr-TR" : "en-US", { day: "numeric", month: "short" });
}
function senderName(msg: MailEnvelope): string {
const f = msg.from[0];
return f?.name || f?.address || "Bilinmeyen";
return f?.name || f?.address || "Unknown";
}
export default function MessageList({ messages, loading, selectedUid, onSelect, onDelete }: {
@@ -27,6 +29,10 @@ export default function MessageList({ messages, loading, selectedUid, onSelect,
onSelect: (uid: number) => void;
onDelete: (uid: number) => void;
}) {
const dict = useDictionary();
const params = useParams();
const lang = (params.lang as string) || "en";
if (loading) {
return <div className="empty-state" style={{ padding: 40 }}><span className="spinner" style={{ width: 20, height: 20 }} /></div>;
}
@@ -34,7 +40,7 @@ export default function MessageList({ messages, loading, selectedUid, onSelect,
if (messages.length === 0) {
return (
<div className="empty-state" style={{ padding: 40 }}>
<div style={{ fontSize: 13, color: "var(--text-muted)" }}>Bu klasörde mail yok</div>
<div style={{ fontSize: 13, color: "var(--text-muted)" }}>{dict.mailClient.emptyFolder || "Bu klasör boş"}</div>
</div>
);
}
@@ -53,11 +59,11 @@ export default function MessageList({ messages, loading, selectedUid, onSelect,
<div className="message-content">
<div className="message-top">
<span className="message-sender">{senderName(m)}</span>
<span className="message-time">{timeAgo(m.date)}</span>
<span className="message-time">{timeAgo(m.date, lang)}</span>
</div>
<div className="message-subject">{m.subject}</div>
<div className="message-subject">{m.subject || dict.mailClient.noSubject || "(Konu Yok)"}</div>
</div>
{m.hasAttachments && <span className="message-attach" title="Ek var">📎</span>}
{m.hasAttachments && <span className="message-attach" title={dict.mailClient.attachments || "Ekler"}>📎</span>}
</div>
))}
</div>