import React, { useState, useEffect } from "react"; import { DBService } from "../lib/db"; import { BuiltSite } from "../types"; import { Globe, Plus, Trash, ExternalLink, RefreshCw, BarChart2, GitBranch, RefreshCcw, FolderOpen, AlertCircle, Sparkles, User, Shield } from "lucide-react"; export default function SitesTab({ triggerHaptic }: { triggerHaptic: () => void }) { const [sites, setSites] = useState([]); const [name, setName] = useState(""); const [url, setUrl] = useState(""); const [platform, setPlatform] = useState("Vercel"); const [status, setStatus] = useState("live"); const [repoUrl, setRepoUrl] = useState(""); const [isBuildingId, setIsBuildingId] = useState(null); // Multi-Email Interactive Filter and Association States const [activeEmail, setActiveEmail] = useState("eissaaly07@gmail.com"); const [availableEmails, setAvailableEmails] = useState([]); const [ownerEmail, setOwnerEmail] = useState("eissaaly07@gmail.com"); useEffect(() => { loadSites(); }, []); const loadSites = async () => { // 1. Get current active session email const activeSetting = await DBService.getSetting("activeEmailSession") || "eissaaly07@gmail.com"; setActiveEmail(activeSetting); setOwnerEmail(activeSetting); // 2. Compile list of emails from registered sessions + account profiles + emails store const accountsList = await DBService.getAll("accounts"); const emailsSet = new Set([ "eissaaly07@gmail.com", "eissaaly0007@gmail.com" ]); accountsList.forEach(a => { if (a.email) emailsSet.add(a.email.trim()); }); // Fetch from dedicated emails store (EmailsTab) try { const emailVaultList = await DBService.getAll("emails"); emailVaultList.forEach(e => { if (e.email) emailsSet.add(e.email.trim()); }); } catch (e) { console.warn("Could not retrieve emails from emails store:", e); } const storedList = await DBService.getSetting("sessionEmailsList"); if (storedList) { storedList.forEach(e => emailsSet.add(e.trim())); } const emailsArray = Array.from(emailsSet); setAvailableEmails(emailsArray); // 3. Load Sites from store const list = await DBService.getAll("sites"); if (list.length === 0) { // Seed initial dummy sites for project visual presentation const seed: BuiltSite[] = [ { id: "site_1", name: "مدونة المطور الشخصية", url: "https://my-blog-preview.vercel.app", platform: "Vercel", status: "live", deployUrl: "https://vercel.com/dashboard", repoUrl: "https://github.com/developer/blog", lastDeploy: Date.now() - 3600000 * 24, domain: "myblog.dev", analytics: { pageViews: 1420, uptimePercentage: 99.9 }, ownerEmail: "eissaaly07@gmail.com" }, { id: "site_2", name: "متجر الهدايا الرقمي", url: "https://gift-store.netlify.app", platform: "Netlify", status: "staging", deployUrl: "https://app.netlify.com", repoUrl: "https://github.com/developer/gift-store", lastDeploy: Date.now() - 3600000 * 5, analytics: { pageViews: 480, uptimePercentage: 98.7 }, ownerEmail: "eissaaly07@gmail.com" }, { id: "site_3", name: "موقع التوثيق السريع", url: "https://doc-wizard.github.io", platform: "GitHub Pages", status: "live", deployUrl: "https://github.com", repoUrl: "https://github.com/developer/doc-wizard", lastDeploy: Date.now() - 3600000 * 12, analytics: { pageViews: 240, uptimePercentage: 100.0 }, ownerEmail: "eissaaly0007@gmail.com" } ]; for (const s of seed) { await DBService.put("sites", s); } setSites(seed); } else { setSites(list); } }; const handleSwitchActiveEmail = async (email: string) => { triggerHaptic(); setActiveEmail(email); setOwnerEmail(email); await DBService.putSetting("activeEmailSession", email); // Save to audit trail await DBService.put("auditLog", { id: "log_" + Date.now(), timestamp: Date.now(), action: "تغيير جلسة بريد المواقع", details: `تم تبديل تصفية المواقع النشطة لعرض المشاريع المملوكة لـ [${email}]`, status: "success" }); }; const handleCreateSite = async (e: React.FormEvent) => { e.preventDefault(); if (!name || !url) return; triggerHaptic(); const targetOwner = ownerEmail || activeEmail; const newSite: BuiltSite = { id: "site_" + Date.now(), name, url, platform, status, deployUrl: platform === "Vercel" ? "https://vercel.com" : "https://netlify.com", repoUrl: repoUrl || undefined, lastDeploy: Date.now(), analytics: { pageViews: Math.floor(Math.random() * 200) + 10, uptimePercentage: 100.0 }, ownerEmail: targetOwner }; await DBService.put("sites", newSite); setSites(prev => [newSite, ...prev]); await DBService.put("auditLog", { id: "log_" + Date.now(), timestamp: Date.now(), action: "أرشفة وتتبع مشروع", details: `تم بنجاح ربط وتتبع المشروع [${name}] وتخصيص المالك [${targetOwner}]`, status: "success" }); setName(""); setUrl(""); setRepoUrl(""); }; const handleDelete = async (id: string) => { triggerHaptic(); await DBService.delete("sites", id); setSites(prev => prev.filter(s => s.id !== id)); }; const triggerMockRedeploy = async (id: string) => { triggerHaptic(); setIsBuildingId(id); setTimeout(async () => { setIsBuildingId(null); // Update build timestamp const s = sites.find(item => item.id === id); if (s) { s.lastDeploy = Date.now(); await DBService.put("sites", s); setSites(prev => prev.map(item => item.id === id ? s : item)); await DBService.put("auditLog", { id: "log_" + Date.now(), timestamp: Date.now(), action: "إعادة بناء ونشر مجاني", details: `تم إعادة إطلاق وبناء مشروع [${s.name}] عن بعد في دقيقتين`, status: "success" }); } }, 2500); }; const getStatusLabel = (st: string) => { switch (st) { case "live": return "منشور فعال (Live)"; case "dev": return "تحت التطوير (Dev)"; case "staging": return "تجريبي (Staging)"; case "archived": return "مؤرشف (Archived)"; case "down": return "معطل"; default: return st; } }; const filteredSites = sites.filter(s => { const siteEmail = s.ownerEmail || "eissaaly07@gmail.com"; return siteEmail.toLowerCase() === activeEmail.toLowerCase(); }); return (
{/* 20+ Master Email SSO Filter & Status Bar (Bilingual, high contrast) */}

تصفية مواقع ومشاريع الحساب المالك النشط (Active Owner Site Filter)

يتم عرض تتبع الاستضافات وحسابات السيرفر الفعالة للبريد النشط المختار أدناه. ينعكس هذا التغيير على بوابة الدخول الموحد SSO فوراً.

اختر البريد النشط:
{/* Sidebar Add Project Form */}

تتبع مشروع/موقع جديد

setName(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" />
setUrl(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 font-mono" />
{/* Owner Email ID selector input field */}
سيظهر هذا الموقع فقط عند تحديد وتنشيط هذا البريد في تصفية الجلسات.
setRepoUrl(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 font-mono" />
{/* Projects List Dashboard */}
مشاريع تابعة للحساب: {activeEmail} مجموع المشاريع المصفاة: {filteredSites.length}
{filteredSites.map((s) => (
{/* Platform indicator sidebar color code */}
{/* Top header block */}

{s.name}

{s.platform} 👤 {s.ownerEmail || "eissaaly07@gmail.com"} {getStatusLabel(s.status)}
{s.url}
{/* Analytics metrics badge widget */}
مشاهدات الصفحة {s.analytics.pageViews}
نسبة الاستقرار {s.analytics.uptimePercentage}%
{/* Git Integration Block if any */} {s.repoUrl && (
{s.repoUrl.replace("https://", "")} آخر نشر: {new Date(s.lastDeploy).toLocaleTimeString("ar-EG")}
)} {/* Action linkages */}
افتح لوحة تحكم المنصة
))} {filteredSites.length === 0 && (
لا توجد مواقع أو مشاريع مضافة تحت حساب البريد الإلكتروني {activeEmail} حتى الآن. يمكنك إضافة مشروع جديد وتخصيص هذا البريد له من قائمة اليمين.
)}
); }