mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-06-08 02:13:30 +00:00
Remove duplicate escapeHtml and debounce functions, keep globals in app.js
closes #28
This commit is contained in:
@@ -148,6 +148,18 @@ function connectWS() {
|
||||
function onWS(fn) { wsListeners.push(fn); }
|
||||
function offWS(fn) { wsListeners = wsListeners.filter(f => f !== fn); }
|
||||
|
||||
/* Global escapeHtml — used by multiple pages */
|
||||
function escapeHtml(s) {
|
||||
if (!s) return '';
|
||||
return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
||||
}
|
||||
|
||||
/* Global debounce */
|
||||
function debounce(fn, ms) {
|
||||
let t;
|
||||
return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); };
|
||||
}
|
||||
|
||||
/* Debounced WS helper — batches rapid messages, calls fn with array of msgs */
|
||||
function debouncedOnWS(fn, ms) {
|
||||
if (typeof ms === 'undefined') ms = 250;
|
||||
|
||||
+2
-10
@@ -5,10 +5,6 @@
|
||||
let nodes = [];
|
||||
const PAYLOAD_TYPES = {0:'Request',1:'Response',2:'Direct Msg',3:'ACK',4:'Advert',5:'Channel Msg',7:'Anon Req',8:'Path',9:'Trace'};
|
||||
|
||||
function escapeHtml(s) {
|
||||
if (!s) return '';
|
||||
return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
||||
}
|
||||
let counts = {};
|
||||
let selectedKey = null;
|
||||
let activeTab = 'all';
|
||||
@@ -202,6 +198,8 @@
|
||||
renderLeft();
|
||||
} catch (e) {
|
||||
console.error('Failed to load nodes:', e);
|
||||
const tbody = document.getElementById('nodesBody');
|
||||
if (tbody) tbody.innerHTML = '<tr><td colspan="6" class="text-center" style="padding:24px;color:var(--error,#ef4444)"><div role="alert" aria-live="polite">Failed to load nodes. Please try again.</div></td></tr>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -441,11 +439,5 @@
|
||||
});
|
||||
}
|
||||
|
||||
// Minimal QR-like visual (encode pubkey as a grid pattern - not a real QR but visually useful)
|
||||
function debounce(fn, ms) {
|
||||
let t;
|
||||
return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); };
|
||||
}
|
||||
|
||||
registerPage('nodes', { init, destroy });
|
||||
})();
|
||||
|
||||
+7
-10
@@ -253,6 +253,8 @@
|
||||
renderLeft();
|
||||
} catch (e) {
|
||||
console.error('Failed to load packets:', e);
|
||||
const tbody = document.getElementById('pktBody');
|
||||
if (tbody) tbody.innerHTML = '<tr><td colspan="10" class="text-center" style="padding:24px;color:var(--error,#ef4444)"><div role="alert" aria-live="polite">Failed to load packets. Please try again.</div></td></tr>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -492,6 +494,11 @@
|
||||
const groupBtn = document.getElementById('fGroup');
|
||||
if (groupBtn) groupBtn.classList.toggle('active', groupByHash);
|
||||
|
||||
if (!packets.length) {
|
||||
tbody.innerHTML = '<tr><td colspan="10" class="text-center text-muted" style="padding:24px">No packets found</td></tr>';
|
||||
return;
|
||||
}
|
||||
|
||||
if (groupByHash) {
|
||||
let html = '';
|
||||
for (const p of packets) {
|
||||
@@ -714,10 +721,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
function escapeHtml(s) {
|
||||
return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
||||
}
|
||||
|
||||
function buildDecodedTable(decoded) {
|
||||
let rows = '';
|
||||
for (const [k, v] of Object.entries(decoded)) {
|
||||
@@ -938,12 +941,6 @@
|
||||
return '<div class="byop-row"><span class="byop-key">' + key + '</span><span class="byop-val">' + val + '</span></div>';
|
||||
}
|
||||
|
||||
// Debounce helper
|
||||
function debounce(fn, ms) {
|
||||
let t;
|
||||
return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); };
|
||||
}
|
||||
|
||||
// Load regions from config
|
||||
(async () => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user