diff --git a/src/components/DiagnosticsView.tsx b/src/components/DiagnosticsView.tsx index 973f343..72842bc 100644 --- a/src/components/DiagnosticsView.tsx +++ b/src/components/DiagnosticsView.tsx @@ -1,8 +1,8 @@ import { useEffect, useRef, useState } from 'react'; -import { listen } from '@tauri-apps/api/event'; +import { attachLogger } from '@tauri-apps/plugin-log'; import { invokeCommand as invoke } from '../ipc'; import { save } from '@tauri-apps/plugin-dialog'; -import { FileDown, Trash2, Terminal } from 'lucide-react'; +import { FileDown, Trash2, Terminal, Filter } from 'lucide-react'; import { WindowDragRegion } from './WindowDragRegion'; interface LogEntry { @@ -10,22 +10,34 @@ interface LogEntry { message: string; } +const getLevelStr = (level: number): LogEntry['level'] => { + switch (level) { + case 1: return 'Trace'; + case 2: return 'Debug'; + case 3: return 'Info'; + case 4: return 'Warn'; + case 5: return 'Error'; + default: return 'Debug'; + } +}; + export default function DiagnosticsView() { const [logs, setLogs] = useState([]); + const [levelFilter, setLevelFilter] = useState('All'); const scrollRef = useRef(null); const MAX_LOG_LINES = 2000; useEffect(() => { - const unlisten = listen<{ level: string; message: string }>('log', (event) => { - const level = event.payload.level as LogEntry['level']; - const message = event.payload.message; + const unlistenPromise = attachLogger((logRecord) => { + const level = getLevelStr(logRecord.level); + const message = logRecord.message; if (message.includes('[download]') && message.includes('%')) return; setLogs(prev => { const next = [...prev, { level, message }]; return next.length > MAX_LOG_LINES ? next.slice(-MAX_LOG_LINES) : next; }); }); - return () => { unlisten.then(f => f()); }; + return () => { unlistenPromise.then(f => f()); }; }, []); useEffect(() => { @@ -69,7 +81,23 @@ export default function DiagnosticsView() { Diagnostics Console ({logs.length} entries) -
+
+
+ + +
+
)} - {logs.map((entry, i) => ( + {logs.filter(entry => levelFilter === 'All' || entry.level === levelFilter).map((entry, i) => (
[{entry.level}] {entry.message}