Files
appRobotHoming/public/client.js
2026-03-15 21:47:48 +01:00

67 lines
2.2 KiB
JavaScript
Executable File

(function(){
const logEl = document.getElementById('log');
const connEl = document.getElementById('conn');
function append(line){
const now = new Date().toISOString();
logEl.value += `[${now}] ${line}
`;
logEl.scrollTop = logEl.scrollHeight;
}
async function refreshStatus(){
try{
const res = await fetch('/api/status');
const st = await res.json();
if (st.connected){ connEl.textContent = 'verbunden'; connEl.className = 'badge ok'; }
else if (st.lastError){ connEl.textContent = 'fehler'; connEl.className = 'badge err'; }
else { connEl.textContent = 'getrennt'; connEl.className = 'badge warn'; }
}catch(e){ connEl.textContent = 'unbekannt'; connEl.className = 'badge'; }
}
function connectSSE(){
const es = new EventSource('/api/events');
es.onmessage = (ev)=>{
try{
const p = JSON.parse(ev.data);
if (p.level === 'msg') append(`WSS → ${p.data?.text ?? ''}`);
else if (p.level === 'tx') append(`TX → ${JSON.stringify(p.data)}`);
else append(`${p.level?.toUpperCase?.()}: ${p.message}`);
}catch{ append(ev.data); }
};
es.onerror = ()=>{
append('SSE Fehler/unterbrochen. Versuche neu zu verbinden…');
setTimeout(connectSSE, 2000);
};
}
function bindButtons(){
document.querySelectorAll('button[data-cmd]').forEach(btn =>{
btn.addEventListener('click', async () =>{
const cmd = btn.getAttribute('data-cmd');
let payload = null;
const payloadSelector = btn.getAttribute('data-payload');
if (payloadSelector) {
const field = document.querySelector(payloadSelector);
if (field) payload = field.value;
}
try{
const res = await fetch('/api/send', {
method:'POST', headers:{ 'Content-Type':'application/json' },
body: JSON.stringify({ cmd, payload })
});
const data = await res.json();
if(!res.ok){ append(`FEHLER ${res.status}: ${data.error || 'Unbekannt'}`); }
else { append(`Sende: ${cmd}`); }
}catch(err){ append('FEHLER: ' + (err?.message || err)); }
});
});
}
bindButtons();
connectSSE();
refreshStatus();
})();