From 87057f8137bb2717a5050f655f1c39760b81faf5 Mon Sep 17 00:00:00 2001 From: Stijnus <72551117+Stijnus@users.noreply.github.com> Date: Fri, 13 Dec 2024 01:40:58 +0100 Subject: [PATCH] Event logs bug fix minor improvements download logs, auto scroll, clear logs --- .../settings/event-logs/EventLogsTab.tsx | 110 ++++++++++++------ .../settings/providers/ProvidersTab.tsx | 6 +- app/lib/stores/logs.ts | 2 +- 3 files changed, 78 insertions(+), 40 deletions(-) diff --git a/app/components/settings/event-logs/EventLogsTab.tsx b/app/components/settings/event-logs/EventLogsTab.tsx index d8766c7..be2a2d2 100644 --- a/app/components/settings/event-logs/EventLogsTab.tsx +++ b/app/components/settings/event-logs/EventLogsTab.tsx @@ -3,14 +3,34 @@ import { useSettings } from '~/lib/hooks/useSettings'; import { toast } from 'react-toastify'; import { Switch } from '~/components/ui/Switch'; import { logStore, type LogEntry } from '~/lib/stores/logs'; +import { useStore } from '@nanostores/react'; export default function EventLogsTab() { const {} = useSettings(); + const showLogs = useStore(logStore.showLogs); const [logLevel, setLogLevel] = useState('info'); const [autoScroll, setAutoScroll] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [, forceUpdate] = useState({}); + const filteredLogs = useMemo(() => { + const logs = logStore.getLogs(); + return logs.filter((log) => { + const matchesLevel = !logLevel || log.level === logLevel; + const matchesSearch = + !searchQuery || + log.message.toLowerCase().includes(searchQuery.toLowerCase()) || + JSON.stringify(log.details).toLowerCase().includes(searchQuery.toLowerCase()); + + return matchesLevel && matchesSearch; + }); + }, [logLevel, searchQuery]); + + // Effect to initialize showLogs + useEffect(() => { + logStore.showLogs.set(true); + }, []); + useEffect(() => { // Add some initial logs for testing logStore.logSystem('System started', { version: '1.0.0' }); @@ -18,6 +38,14 @@ export default function EventLogsTab() { logStore.logError('Failed to connect to provider', new Error('Connection timeout'), { provider: 'OpenAI' }); }, []); + useEffect(() => { + const container = document.querySelector('.logs-container'); + + if (container && autoScroll) { + container.scrollTop = container.scrollHeight; + } + }, [filteredLogs, autoScroll]); + const handleClearLogs = useCallback(() => { if (confirm('Are you sure you want to clear all logs?')) { logStore.clearLogs(); @@ -54,10 +82,6 @@ export default function EventLogsTab() { } }, []); - const filteredLogs = useMemo(() => { - return logStore.getFilteredLogs(logLevel, undefined, searchQuery); - }, [logLevel, searchQuery]); - const getLevelColor = (level: LogEntry['level']) => { switch (level) { case 'info': @@ -76,15 +100,23 @@ export default function EventLogsTab() { return (
-
+ {/* Title and Toggles Row */} +

Event Logs

-
- Auto-scroll - +
+
+ Show Actions + logStore.showLogs.set(checked)} /> +
+
+ Auto-scroll + +
-
+ {/* Controls Row */} +
- setSearchQuery(e.target.value)} - className="bg-bolt-elements-bg-depth-2 text-bolt-elements-textPrimary rounded-lg px-3 py-1.5 text-sm flex-1" - /> - - +
+ setSearchQuery(e.target.value)} + className="w-full bg-bolt-elements-bg-depth-2 text-bolt-elements-textPrimary rounded-lg px-3 py-1.5 text-sm" + /> +
+ {showLogs && ( +
+ + +
+ )}
-
+
{filteredLogs.length === 0 ? (
No logs found
) : ( @@ -126,13 +164,17 @@ export default function EventLogsTab() { key={index} className="text-sm mb-3 font-mono border-b border-bolt-elements-borderColor pb-2 last:border-0" > -
- [{log.level.toUpperCase()}] - {new Date(log.timestamp).toLocaleString()} - {log.message} +
+ + [{log.level.toUpperCase()}] + + + {new Date(log.timestamp).toLocaleString()} + + {log.message}
{log.details && ( -
+                
                   {JSON.stringify(log.details, null, 2)}
                 
)} diff --git a/app/components/settings/providers/ProvidersTab.tsx b/app/components/settings/providers/ProvidersTab.tsx index edcf6f9..0efbc66 100644 --- a/app/components/settings/providers/ProvidersTab.tsx +++ b/app/components/settings/providers/ProvidersTab.tsx @@ -51,11 +51,7 @@ export default function ProvidersTab() { >
- {`${provider.name} + {`${provider.name} {provider.name}
>({}); - showLogs = atom(false); + showLogs = atom(true); constructor() { // Load saved logs from cookies on initialization