// ============================================================= // Solar Net Hub — app.js // Bridge JS ↔ Python y lógica de UI // ============================================================= // ── Bridge JS → Python ──────────────────────────────────────── function send(action) { window.webkit.messageHandlers.bridge.postMessage( JSON.stringify({ action }) ); } // ── Tabs ────────────────────────────────────────────────────── function switchTab(name) { document.querySelectorAll('.tab-panel').forEach(el => el.classList.remove('active')); document.querySelectorAll('.tabBtn').forEach(el => el.classList.remove('active')); const panel = document.getElementById('tab-' + name); const btn = document.querySelector('[data-tab="' + name + '"]'); if (panel) panel.classList.add('active'); if (btn) btn.classList.add('active'); } // ── Actualizar estado (llamado desde Python) ────────────────── function updateStatus(data) { // --- OASIS --- const oCard = document.getElementById('oasisCard'); const state = data.oasis_running ? 'running' : data.oasis_installed ? 'stopped' : 'unknown'; oCard.dataset.state = state; if (data.oasis_running) { document.getElementById('oasisState').textContent = 'ACTIVO'; document.getElementById('oasisSub').textContent = 'servidor corriendo en puerto 3000'; _btn('btnStart', true); _btn('btnStop', false); _btn('btnInstall', true); _btn('btnBrowser', false); } else if (data.oasis_installed) { document.getElementById('oasisState').textContent = 'INSTALADO'; document.getElementById('oasisSub').textContent = 'servidor detenido'; _btn('btnStart', false); _btn('btnStop', true); _btn('btnInstall', true); _btn('btnBrowser', true); } else { document.getElementById('oasisState').textContent = 'NO INSTALADO'; document.getElementById('oasisSub').textContent = 'instala OASIS para comenzar'; _btn('btnStart', true); _btn('btnStop', true); _btn('btnInstall', false); _btn('btnBrowser', true); } document.getElementById('iVer').textContent = data.oasis_version ? 'v' + data.oasis_version : '—'; document.getElementById('iNode').textContent = data.node_version || '—'; document.getElementById('iDir').textContent = data.oasis_dir || '—'; // Global dot document.getElementById('globalDot').dataset.state = state; // --- ECOIN --- const eCard = document.getElementById('ecoinCard'); const estate = data.ecoin_installed ? 'running' : 'unknown'; eCard.dataset.state = estate; if (data.ecoin_installed) { document.getElementById('ecoinState').textContent = 'COMPILADO'; document.getElementById('ecoinSub').textContent = 'wallet ECOIN disponible'; _btn('btnEGui', false); _btn('btnEWallet', false); _btn('btnEConnect', false); } else { document.getElementById('ecoinState').textContent = 'NO INSTALADO'; document.getElementById('ecoinSub').textContent = 'instala ECOIN para comenzar'; _btn('btnEGui', true); _btn('btnEWallet', true); _btn('btnEConnect', true); } document.getElementById('eWallet').textContent = data.ecoin_wallet ? 'Si' : 'No'; document.getElementById('eQt').textContent = data.ecoin_qt ? 'Si' : 'No'; document.getElementById('eDaemon').textContent = data.ecoin_daemon ? 'Si' : 'No'; } // ── Log (llamado desde Python) ──────────────────────────────── function appendLog(text) { const area = document.getElementById('logArea'); const div = document.createElement('div'); div.className = 'log-line'; if (text.startsWith('$')) div.classList.add('cmd'); else if (text.startsWith('──')) div.classList.add('end'); else if (text.startsWith('[Error')) div.classList.add('error'); div.textContent = text; area.appendChild(div); area.scrollTop = area.scrollHeight; } function clearLog() { document.getElementById('logArea').innerHTML = ''; } // ── Helper: deshabilitar/habilitar botón ────────────────────── function _btn(id, disabled) { const el = document.getElementById(id); if (el) el.disabled = disabled; }