// Global state let currentPage = 'dashboard'; let cloneHistory = []; let settings = { outputDir: 'M:\\CLONEWEB\\cloned-sites', timeout: 30, retries: 3, excludedDomains: 'facebook.com\ntwitter.com\ninstagram.com\ngoogle-analytics.com\ngoogletagmanager.com' }; // Initialize app document.addEventListener('DOMContentLoaded', function () { initializeApp(); }); function initializeApp() { setupNavigation(); setupThemeToggle(); setupForms(); checkServiceStatus(); loadDashboard(); loadHistory(); loadSettings(); // Auto-refresh status every 30 seconds setInterval(checkServiceStatus, 30000); } // Navigation function setupNavigation() { const navItems = document.querySelectorAll('.nav-item'); navItems.forEach(item => { item.addEventListener('click', (e) => { e.preventDefault(); const page = item.getAttribute('data-page'); navigateToPage(page); }); }); } function navigateToPage(page) { // Update nav items document.querySelectorAll('.nav-item').forEach(item => { item.classList.remove('active'); if (item.getAttribute('data-page') === page) { item.classList.add('active'); } }); // Update pages document.querySelectorAll('.page').forEach(p => { p.classList.remove('active'); }); document.getElementById(page).classList.add('active'); // Update page title const titles = { 'dashboard': 'Dashboard', 'new-clone': 'Nova Clonagem', 'history': 'Histórico', 'settings': 'Configurações' }; document.getElementById('pageTitle').textContent = titles[page] || page; currentPage = page; // Refresh data when navigating if (page === 'dashboard') { loadDashboard(); } else if (page === 'history') { loadHistory(); } } // Theme Toggle function setupThemeToggle() { const themeToggle = document.getElementById('themeToggle'); // Load saved theme const savedTheme = localStorage.getItem('theme') || 'light'; if (savedTheme === 'dark') { document.body.classList.add('dark-theme'); themeToggle.checked = true; } themeToggle.addEventListener('change', () => { if (themeToggle.checked) { document.body.classList.add('dark-theme'); localStorage.setItem('theme', 'dark'); } else { document.body.classList.remove('dark-theme'); localStorage.setItem('theme', 'light'); } }); } // Service Status - verifica o serviço WGET na porta 3002 async function checkServiceStatus() { const statusIndicator = document.getElementById('serviceStatus'); try { // Verificar o serviço WGET na porta 3002 (não 3001) const response = await fetch('http://localhost:3002/health', { method: 'GET' }); if (response.ok) { statusIndicator.className = 'status-indicator online'; statusIndicator.querySelector('.status-text').textContent = 'Serviço Online'; } else { statusIndicator.className = 'status-indicator offline'; statusIndicator.querySelector('.status-text').textContent = 'Serviço Offline'; } } catch (error) { statusIndicator.className = 'status-indicator offline'; statusIndicator.querySelector('.status-text').textContent = 'Serviço Offline'; } } // Dashboard function loadDashboard() { // Load from localStorage const history = JSON.parse(localStorage.getItem('cloneHistory') || '[]'); cloneHistory = history; // Calculate stats const totalSites = history.length; const totalSize = history.reduce((sum, item) => sum + (item.size || 0), 0); const lastClone = history.length > 0 ? history[0].timestamp : null; const successCount = history.filter(item => item.success).length; const successRate = totalSites > 0 ? Math.round((successCount / totalSites) * 100) : 100; // Update stats document.getElementById('totalSites').textContent = totalSites; document.getElementById('totalSize').textContent = formatBytes(totalSize); document.getElementById('lastClone').textContent = lastClone ? formatRelativeTime(lastClone) : 'Nunca'; document.getElementById('successRate').textContent = successRate + '%'; // Update recent clones list const recentClonesList = document.getElementById('recentClonesList'); if (history.length === 0) { recentClonesList.innerHTML = `
Comece clonando seu primeiro site!
${formatRelativeTime(clone.timestamp)} • ${formatBytes(clone.size || 0)} • ${clone.files || 0} arquivos
${cloneRecord.url}
Seus sites clonados aparecerão aqui