// Depends on: core/utils.js ($, escapeHtml), ui/toast.js (showToast) function setupLogsEvents() { let logs = []; let autoScroll = true; let logFilter = ''; chrome.runtime.sendMessage( { target: 'holesail-native', action: 'registerDashboard' }, (response) => { if (response && response.logs) { logs = response.logs; updateLogsDisplay(); } } ); chrome.runtime.onMessage.addListener((message) => { if (message.type === 'holesail-logs' && message.logs) { logs = message.logs; updateLogsDisplay(); } }); function getLogClass(msg) { const m = (msg || '').toLowerCase(); if (m.includes('error') || m.includes('fail') || m.includes('err:')) return 'is-error'; if (m.includes('warn') || m.includes('warning')) return 'is-warn'; return ''; } function updateLogsDisplay() { const container = $('logsContainer'); if (!container) return; const filtered = logFilter ? logs.filter(e => (e.message || '').toLowerCase().includes(logFilter.toLowerCase())) : logs; if (filtered.length === 0) { container.innerHTML = `
${logFilter ? 'No matching logs' : 'No logs yet'}
${logFilter ? 'Try a different filter' : 'Logs will appear here as the extension runs'}
`; return; } container.innerHTML = filtered.map(entry => { const time = new Date(entry.timestamp).toLocaleTimeString(); const cls = getLogClass(entry.message); return `
${time} ${escapeHtml(entry.message)}
`; }).join(''); if (autoScroll) container.scrollTop = container.scrollHeight; } $('btnClearLogs')?.addEventListener('click', () => { logs = []; updateLogsDisplay(); }); $('btnAutoScroll')?.addEventListener('click', () => { autoScroll = !autoScroll; const btn = $('btnAutoScroll'); if (btn) { const svgPart = btn.querySelector('svg')?.outerHTML || ''; btn.innerHTML = svgPart + ' Auto-scroll: ' + (autoScroll ? 'ON' : 'OFF'); } }); $('logsFilter')?.addEventListener('input', (e) => { logFilter = e.target.value; updateLogsDisplay(); }); window.addEventListener('beforeunload', () => { chrome.runtime.sendMessage({ target: 'holesail-native', action: 'unregisterDashboard' }, () => {}); }); }