refactor: extract duplicated utility functions into shared modules
Some checks failed
CI / cleanup-branch (push) Has been skipped
CI / build (push) Failing after 41s
CI / docker (push) Has been skipped
CI / deploy (push) Has been skipped
CI / deploy-feature (push) Has been skipped

Consolidate 20+ duplicate function definitions across UI components into
three shared util files (format-utils, agent-utils, config-draft-utils).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-09 08:28:31 +02:00
parent 2df5e0d7ba
commit 04c90bde06
12 changed files with 126 additions and 187 deletions

View File

@@ -1,6 +1,6 @@
import { useMemo, useState } from 'react';
import { useParams, Link } from 'react-router';
import { RefreshCw, ChevronRight, UserPlus, UserMinus, Play, Square, Clock, Skull, HeartPulse, Route, Send, Activity } from 'lucide-react';
import { RefreshCw, ChevronRight } from 'lucide-react';
import {
StatCard, StatusDot, Badge, LineChart, AreaChart, BarChart,
EventFeed, Spinner, EmptyState, SectionHeader, MonoText,
@@ -12,6 +12,7 @@ import { useAgents, useAgentEvents } from '../../api/queries/agents';
import { useApplicationLogs } from '../../api/queries/logs';
import { useStatsTimeseries } from '../../api/queries/executions';
import { useAgentMetrics } from '../../api/queries/agent-metrics';
import { formatUptime, mapLogLevel, eventSeverity, eventIcon } from '../../utils/agent-utils';
const LOG_LEVEL_ITEMS: ButtonGroupItem[] = [
{ value: 'error', label: 'Error', color: 'var(--error)' },
@@ -21,16 +22,6 @@ const LOG_LEVEL_ITEMS: ButtonGroupItem[] = [
{ value: 'trace', label: 'Trace', color: 'var(--text-muted)' },
];
function mapLogLevel(level: string): LogEntry['level'] {
switch (level?.toUpperCase()) {
case 'ERROR': return 'error';
case 'WARN': case 'WARNING': return 'warn';
case 'DEBUG': return 'debug';
case 'TRACE': return 'trace';
default: return 'info';
}
}
export default function AgentInstance() {
const { appId, instanceId } = useParams();
const { timeRange } = useGlobalFilters();
@@ -82,35 +73,6 @@ export default function AgentInstance() {
);
const feedEvents = useMemo<FeedEvent[]>(() => {
const eventIcon = (type: string) => {
switch (type) {
case 'REGISTERED': return <UserPlus size={14} />;
case 'DEREGISTERED': return <UserMinus size={14} />;
case 'AGENT_STARTED': return <Play size={14} />;
case 'AGENT_STOPPED': return <Square size={14} />;
case 'WENT_STALE': return <Clock size={14} />;
case 'WENT_DEAD': return <Skull size={14} />;
case 'RECOVERED': return <HeartPulse size={14} />;
case 'ROUTE_STATE_CHANGED': return <Route size={14} />;
case 'COMMAND_DELIVERED':
case 'COMMAND_ACKNOWLEDGED': return <Send size={14} />;
default: return <Activity size={14} />;
}
};
const eventSeverity = (type: string): FeedEvent['severity'] => {
switch (type) {
case 'WENT_DEAD':
case 'AGENT_STOPPED':
case 'DEREGISTERED': return 'error';
case 'WENT_STALE': return 'warning';
case 'RECOVERED':
case 'REGISTERED':
case 'AGENT_STARTED': return 'success';
default: return 'running';
}
};
const mapped = (events || [])
.filter((e: any) => !instanceId || e.instanceId === instanceId)
.map((e: any) => ({
@@ -495,13 +457,3 @@ export default function AgentInstance() {
</div>
);
}
function formatUptime(seconds?: number): string {
if (!seconds) return '\u2014';
const days = Math.floor(seconds / 86400);
const hours = Math.floor((seconds % 86400) / 3600);
const mins = Math.floor((seconds % 3600) / 60);
if (days > 0) return `${days}d ${hours}h`;
if (hours > 0) return `${hours}h ${mins}m`;
return `${mins}m`;
}