OASIS-USABILITY/INSTALLER_V3/ui/app.js
SITO 67acbf1add fix(panel-v3): detección de puerto, botones y limpieza de warnings
- oasis_running() usa ss en lugar de pgrep (evita falsos positivos)
- _start_oasis() lanza oasis.sh en background y espera el puerto
- INSTALAR se deshabilita cuando OASIS ya está instalado/activo
- Corrige DeprecationWarning: override_background_color → CssProvider
- Corrige DeprecationWarning: run_javascript → evaluate_javascript
- Desactiva caché de WebKit, carga por URI directa
- Inspector de WebKit activado para depuración

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 12:26:24 +02:00

110 lines
4.6 KiB
JavaScript

// =============================================================
// 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;
}