import React, { useState, useEffect } from "react"; import { performWebsiteClone, downloadCloneAsZip } from "../lib/cloner"; import { DBService } from "../lib/db"; import { WebsiteClone } from "../types"; import { Globe, Download, Trash, Eye, RefreshCw, Settings, CheckCircle, ShieldAlert } from "lucide-react"; export default function ClonerTab({ triggerHaptic }: { triggerHaptic: () => void }) { const [url, setUrl] = useState(""); const [clones, setClones] = useState([]); const [loading, setLoading] = useState(false); const [selectedClone, setSelectedClone] = useState(null); const [stripAds, setStripAds] = useState(true); const [stripScripts, setStripScripts] = useState(false); const [errorText, setErrorText] = useState(""); useEffect(() => { loadClones(); }, []); const loadClones = async () => { try { const data = await DBService.getAll("clones"); // Sort newest first setClones(data.sort((a, b) => b.createdAt - a.createdAt)); } catch (e) { console.error(e); } }; const handleClone = async () => { if (!url) return; triggerHaptic(); setLoading(true); setErrorText(""); // Add temporary loading clone state const targetUrl = url.trim(); const result = await performWebsiteClone(targetUrl); if (result.success) { const newClone: WebsiteClone = { id: "clone_" + Date.now(), url: targetUrl, name: targetUrl.replace(/https?:\/\//i, "").split("/")[0] || "موقع مستنسخ", html: result.html, css: result.css, js: result.js, createdAt: Date.now(), status: "success", size: result.size, notes: `تم الاستنساخ وحذف ${stripAds ? "الإعلانات ومتعقبات غوغل" : ""} وحفظه محليًا.` }; // Put to db await DBService.put("clones", newClone); // Save audit log await DBService.put("auditLog", { id: "log_" + Date.now(), timestamp: Date.now(), action: "استنساخ موقع", details: `تم بنجاح استنساخ الرابط ${targetUrl}`, status: "success" }); setClones(prev => [newClone, ...prev]); setSelectedClone(newClone); setUrl(""); } else { setErrorText(result.error || "عذرًا، فشل استنساخ الموقع."); } setLoading(false); }; const handleDelete = async (id: string, e: React.MouseEvent) => { e.stopPropagation(); triggerHaptic(); await DBService.delete("clones", id); setClones(prev => prev.filter(c => c.id !== id)); if (selectedClone?.id === id) { setSelectedClone(null); } }; const handleDownload = async (clone: WebsiteClone, e: React.MouseEvent) => { e.stopPropagation(); triggerHaptic(); await downloadCloneAsZip(clone); }; return (
{/* Control panel (Left) */}

استنساخ موقع جديد

setUrl(e.target.value)} disabled={loading} />
{/* Custom Options */}
خيارات التنظيف المتقدمة
{errorText && (
{errorText}
)}
{/* History Clones List */}

قائمة المواقع المستنسخة محليًا

{clones.length === 0 ? (
لا توجد مواقع مستنسخة بعد.
) : (
{clones.map((c) => (
{ triggerHaptic(); setSelectedClone(c); }} className={`p-3 rounded-xl border transition-all cursor-pointer flex items-center justify-between ${ selectedClone?.id === c.id ? "bg-sky-500/10 border-sky-500/40 text-white" : "bg-slate-900/60 border-slate-800 hover:border-slate-700 text-slate-300" }`} >

{c.name}

{c.url}

{c.size || "S"}
))}
)}
{/* Editor & Preview Screen (Right) */}
{selectedClone ? (
{/* Headers and controls */}

{selectedClone.name}

{selectedClone.url}
{/* Quick Stats */}
الحجم الكلي من الذاكرة {selectedClone.size || "15 KB"}
HTML Lines {selectedClone.html.split("\n").length} سطر
Consolidated JS {selectedClone.js ? `${(selectedClone.js.length / 1024).toFixed(1)} KB` : "غير متوفر"}
تاريخ الاستنساخ {new Date(selectedClone.createdAt).toLocaleDateString("ar-EG")}
{/* Live Interactive Iframe Display */}
معاينة مباشرة معزولة (Sandboxed Sandbox Preview) آمنة 100%