import React, { useState, useEffect } from "react"; import { DBService } from "../lib/db"; import { EmailAccount } from "../types"; import { Mail, Plus, ShieldCheck, ShieldAlert, Key, Link2, Trash, ExternalLink, Download, Search, Tag, Eye, EyeOff } from "lucide-react"; export default function EmailsTab({ triggerHaptic }: { triggerHaptic: () => void }) { const [emails, setEmails] = useState([]); const [provider, setProvider] = useState("Gmail"); const [email, setEmailVal] = useState(""); const [password, setPassword] = useState(""); const [category, setCategory] = useState<"personal" | "work" | "dev" | "throwaway">("dev"); const [faStatus, setFaStatus] = useState(false); const [recoveryEmail, setRecoveryEmail] = useState(""); const [searchQuery, setSearchQuery] = useState(""); const [showPasswordMap, setShowPasswordMap] = useState>({}); useEffect(() => { loadEmails(); }, []); const loadEmails = async () => { const list = await DBService.getAll("emails"); if (list.length === 0) { // Seed initial dummy emails for demonstration const seed: EmailAccount[] = [ { id: "email_1", provider: "Gmail", email: "developer.main@gmail.com", password: "SuperSecurePassword123!", category: "dev", faStatus: true, recoveryEmail: "backup.dev@proton.me", status: "active", passwordHealth: "good", lastChecked: Date.now() }, { id: "email_2", provider: "ProtonMail", email: "sysadmin.secure@proton.me", password: "WeakPassword", category: "work", faStatus: false, recoveryEmail: "developer.main@gmail.com", status: "attention", passwordHealth: "weak", lastChecked: Date.now() }, { id: "email_3", provider: "Outlook", email: "spam.tester42@outlook.com", password: "1234567Password", category: "throwaway", faStatus: false, status: "compromised", passwordHealth: "leaked", lastChecked: Date.now() } ]; for (const e of seed) { await DBService.put("emails", e); } setEmails(seed); } else { setEmails(list); } }; const handleAddEmail = async (e: React.FormEvent) => { e.preventDefault(); if (!email || !password) return; triggerHaptic(); // Decide strength health let passwordHealth: "good" | "weak" | "leaked" = "good"; if (password.length < 8) { passwordHealth = "weak"; } else if (password === "12345678" || password.toLowerCase() === "password") { passwordHealth = "leaked"; } const newEmail: EmailAccount = { id: "email_" + Date.now(), provider, email, password, category, faStatus, recoveryEmail: recoveryEmail || undefined, status: passwordHealth === "leaked" ? "compromised" : passwordHealth === "weak" ? "attention" : "active", passwordHealth, lastChecked: Date.now() }; await DBService.put("emails", newEmail); setEmails(prev => [newEmail, ...prev]); await DBService.put("auditLog", { id: "log_" + Date.now(), timestamp: Date.now(), action: "إضافة بريد إلكتروني", details: `تم تسجيل بريد [${email}] وحساب حيوية الأمان بنجاح`, status: "success" }); setEmailVal(""); setPassword(""); setRecoveryEmail(""); }; const handleDelete = async (id: string) => { triggerHaptic(); await DBService.delete("emails", id); setEmails(prev => prev.filter(e => e.id !== id)); }; const handleExportEncrypted = async () => { triggerHaptic(); const dataStr = JSON.stringify(emails, null, 2); // Simple mock AES representation (encodes string bytes to base64) const base64Enc = btoa(unescape(encodeURIComponent(dataStr))); const blob = new Blob([JSON.stringify({ title: "SiteClone Pro Encrypted Emails Backup", schema: "v7.0.0", bytes: base64Enc }, null, 2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "encrypted_emails_siteclone_pro.json"; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; const getProviderConsole = (prov: string) => { switch (prov) { case "Gmail": return "https://mail.google.com"; case "ProtonMail": return "https://mail.proton.me"; case "Outlook": return "https://outlook.live.com"; default: return "https://mail.google.com"; } }; const getCategoryLabel = (cat: string) => { switch (cat) { case "personal": return "شخصي"; case "work": return "عمل"; case "dev": return "تطوير وبرمجة"; case "throwaway": return "بريد مؤقت"; default: return cat; } }; const togglePasswordValue = (id: string) => { setShowPasswordMap(prev => ({ ...prev, [id]: !prev[id] })); }; const filteredEmails = emails.filter( e => e.email.toLowerCase().includes(searchQuery.toLowerCase()) || e.provider.toLowerCase().includes(searchQuery.toLowerCase()) ); return (
{/* Control panel (Left) */}

إضافة حساب بريد إلكتروني

setEmailVal(e.target.value)} className="bg-slate-900/80 border border-slate-700 rounded-xl px-4 py-2.5 text-sm text-white focus:outline-none focus:border-sky-500 w-full text-left" />
setPassword(e.target.value)} className="bg-slate-900/80 border border-slate-700 rounded-xl px-4 py-2.5 text-sm text-white focus:outline-none focus:border-sky-500 w-full text-left" />
setRecoveryEmail(e.target.value)} className="bg-slate-900/80 border border-slate-700 rounded-xl px-4 py-2.5 text-sm text-white focus:outline-none focus:border-sky-500 w-full text-left" />
{/* List Area (Right) */}
{/* Search tool */}
setSearchQuery(e.target.value)} className="bg-transparent text-xs text-white focus:outline-none w-full placeholder:text-slate-500" />
إجمالي الحسابات: {emails.length}
{/* Display accounts */} {filteredEmails.map((e) => (

{e.email}

{e.provider} {getCategoryLabel(e.category)}
{e.recoveryEmail && (

بريد الاسترداد: {e.recoveryEmail}

)}
{/* Status Badge */}
{e.faStatus ? ( المصادقة الثنائية 2FA ) : ( افتقد للـ 2FA )}
{/* Password Health Section */}
حيوية كلمة المرور: {e.passwordHealth === "good" ? "آمنة وقوية" : e.passwordHealth === "weak" ? "ضعيفة" : "تم تسريبها مسبقاً!"}
{/* Visual feedback progress bar */}
{/* Quick Credentials Block */}
رقم الدخول السري {showPasswordMap[e.id] ? e.password : "••••••••••••"}
{/* Inline Quick Action buttons */}
الدخول الفوري للبريد
))} {filteredEmails.length === 0 && (
لا توجد حسابات بريد مطابقة للبحث. أضف حساب بريد إلكتروني للحظر والمتابعة.
)}
); }