diff --git a/web/src/app/home/agents/PluginProcessorDetailContent.tsx b/web/src/app/home/agents/PluginProcessorDetailContent.tsx index 7deefa1fa..10c54910d 100644 --- a/web/src/app/home/agents/PluginProcessorDetailContent.tsx +++ b/web/src/app/home/agents/PluginProcessorDetailContent.tsx @@ -21,6 +21,7 @@ import { Button } from '@/components/ui/button'; import { extractI18nObject } from '@/i18n/I18nProvider'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; +import LoadErrorState from '@/components/LoadErrorState'; import { ScrollArea } from '@/components/ui/scroll-area'; import ProcessorDetailWorkbench from '@/app/home/components/processor-detail/ProcessorDetailWorkbench'; import EntityTitleEditButton from '@/app/home/components/entity-basic-info/EntityTitleEditButton'; @@ -363,11 +364,7 @@ export default function PluginProcessorDetailContent({ const logsContent = (
{failed && ( - - - {t('agents.eventProcessor.loadError')} - - + )}
diff --git a/web/src/app/home/agents/components/AgentMonitoringTab.tsx b/web/src/app/home/agents/components/AgentMonitoringTab.tsx index a5cff9e97..6786db023 100644 --- a/web/src/app/home/agents/components/AgentMonitoringTab.tsx +++ b/web/src/app/home/agents/components/AgentMonitoringTab.tsx @@ -14,6 +14,7 @@ import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; +import LoadErrorState from '@/components/LoadErrorState'; import { Collapsible, CollapsibleTrigger, @@ -263,9 +264,7 @@ export default function AgentMonitoringTab({
{listError && ( - - {t('monitoring.loadError')} - + )}
- - {t('monitoring.loadError')} - - - + setTraceRevision((value) => value + 1)} /> )}
diff --git a/web/src/app/home/bots/components/bot-session/BotSessionMonitor.tsx b/web/src/app/home/bots/components/bot-session/BotSessionMonitor.tsx index 582cfb720..c626d2043 100644 --- a/web/src/app/home/bots/components/bot-session/BotSessionMonitor.tsx +++ b/web/src/app/home/bots/components/bot-session/BotSessionMonitor.tsx @@ -1,3 +1,4 @@ +import LoadErrorState from '@/components/LoadErrorState'; import React, { useState, useEffect, @@ -738,19 +739,7 @@ const BotSessionMonitor = forwardRef< {t('bots.sessionMonitor.loading')}
) : sessionError ? ( -
-

{t('monitoring.loadError')}

- -
+ ) : sessions.length === 0 ? (
{t('bots.sessionMonitor.noSessions')} @@ -922,45 +911,14 @@ const BotSessionMonitor = forwardRef< >
{analysisError && !loadingMessages && ( -
-

- {t('monitoring.toolCalls.title')}:{' '} - {t('monitoring.loadError')} -

- -
+ loadMessages(selectedSessionId, messagePage)} /> )} {loadingMessages ? (
{t('bots.sessionMonitor.loading')}
) : messageError ? ( -
-

{t('monitoring.loadError')}

- -
+ loadMessages(selectedSessionId, messagePage)} /> ) : timelineItems.length === 0 ? (
{t('bots.sessionMonitor.noMessages')} diff --git a/web/src/app/home/components/models-dialog/component/provider-form/ProviderForm.tsx b/web/src/app/home/components/models-dialog/component/provider-form/ProviderForm.tsx index 0b07a6966..19cccc884 100644 --- a/web/src/app/home/components/models-dialog/component/provider-form/ProviderForm.tsx +++ b/web/src/app/home/components/models-dialog/component/provider-form/ProviderForm.tsx @@ -1,3 +1,4 @@ +import LoadErrorState from '@/components/LoadErrorState'; import { useEffect, useState, useRef } from 'react'; import { httpClient } from '@/app/infra/http/HttpClient'; @@ -270,9 +271,7 @@ export default function ProviderForm({
) : ( -

- {t('models.loadError')} -

+ )} {loadState === 'error' && ( diff --git a/web/src/app/home/monitoring/components/TokenMonitoring.tsx b/web/src/app/home/monitoring/components/TokenMonitoring.tsx index 9f549785c..e89c43add 100644 --- a/web/src/app/home/monitoring/components/TokenMonitoring.tsx +++ b/web/src/app/home/monitoring/components/TokenMonitoring.tsx @@ -30,7 +30,7 @@ import { } from '@/components/ui/table'; import { Card } from '@/components/ui/card'; import { MetricCard } from './overview-cards/MetricCard'; -import { Alert, AlertTitle } from '@/components/ui/alert'; +import LoadErrorState from '@/components/LoadErrorState'; import { TabState } from './TabState'; import { httpClient } from '@/app/infra/http/HttpClient'; import { getErrorMessage } from '../utils'; @@ -174,9 +174,7 @@ export default function TokenMonitoring({ if (error) { return ( - - {t('monitoring.tokens.loadError', { error })} - + ); } diff --git a/web/src/app/home/monitoring/components/executions/ExecutionDetailSheet.tsx b/web/src/app/home/monitoring/components/executions/ExecutionDetailSheet.tsx index 9a8459b40..14b367201 100644 --- a/web/src/app/home/monitoring/components/executions/ExecutionDetailSheet.tsx +++ b/web/src/app/home/monitoring/components/executions/ExecutionDetailSheet.tsx @@ -1,3 +1,4 @@ +import LoadErrorState from '@/components/LoadErrorState'; import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; @@ -297,9 +298,7 @@ export default function ExecutionDetailSheet({
{renderItem(section, item)}
))} {sectionError === section && ( -

- {t('monitoring.execution.detail.loadError')} -

+ loadMore(section)} /> )} {page.has_more && ( - - + ) : (
{/* Overview Section: the execution metrics and the runtime status share @@ -365,20 +358,7 @@ function MonitoringPageContent() { {executionError ? (
- - - {t('monitoring.execution.detail.loadError')} - - - - - +
) : ( <> diff --git a/web/src/app/home/plugin-pages/page.tsx b/web/src/app/home/plugin-pages/page.tsx index 520240791..9d66bc43e 100644 --- a/web/src/app/home/plugin-pages/page.tsx +++ b/web/src/app/home/plugin-pages/page.tsx @@ -1,4 +1,5 @@ import EntityLoadState from '@/components/EntityLoadState'; +import LoadErrorState from '@/components/LoadErrorState'; import { useSearchParams } from 'react-router-dom'; import { httpClient } from '@/app/infra/http/HttpClient'; import { useEffect, useRef, useState, useCallback } from 'react'; @@ -202,9 +203,7 @@ function PluginPageIframe({ return (
{assetError ? ( -
- {t('plugins.loadFailed')} -
+ window.location.reload()} /> ) : loading || !assetUrl ? ( ) : null} diff --git a/web/src/app/home/plugins/page.tsx b/web/src/app/home/plugins/page.tsx index 0cf603042..2c2f4175c 100644 --- a/web/src/app/home/plugins/page.tsx +++ b/web/src/app/home/plugins/page.tsx @@ -17,6 +17,7 @@ import { PopoverTrigger, } from '@/components/ui/popover'; import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert'; +import LoadErrorState from '@/components/LoadErrorState'; import { Skeleton } from '@/components/ui/skeleton'; import { Input } from '@/components/ui/input'; import React, { useState, useRef, useEffect } from 'react'; @@ -54,6 +55,8 @@ function PluginListView() { const [pluginSystemStatus, setPluginSystemStatus] = useState(null); const [statusLoading, setStatusLoading] = useState(true); + const [statusError, setStatusError] = useState(false); + const [statusRevision, setStatusRevision] = useState(0); const [debugInfo, setDebugInfo] = useState<{ debug_url: string; plugin_debug_key: string; @@ -70,10 +73,12 @@ function PluginListView() { const fetchPluginSystemStatus = async () => { try { setStatusLoading(true); + setStatusError(false); const status = await httpClient.getPluginSystemStatus(); setPluginSystemStatus(status); } catch (error) { console.error('Failed to fetch plugin system status:', error); + setStatusError(true); toast.error(t('plugins.failedToGetStatus')); } finally { setStatusLoading(false); @@ -81,7 +86,7 @@ function PluginListView() { }; void fetchPluginSystemStatus(); - }, [t]); + }, [t, statusRevision]); useEffect(() => { const onComplete = ( @@ -141,13 +146,13 @@ function PluginListView() { ); const renderPluginConnectionErrorState = () => ( -
- - - {t('plugins.connectionError')} - {t('plugins.connectionErrorDesc')} - -
+