54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
|
|
import type { FeedEvent } from '@cameleer/design-system';
|
||
|
|
import type { LogEntry } from '@cameleer/design-system';
|
||
|
|
import { UserPlus, UserMinus, Play, Square, Clock, Skull, HeartPulse, Route, Send, Activity } from 'lucide-react';
|
||
|
|
import { createElement } from 'react';
|
||
|
|
|
||
|
|
export 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`;
|
||
|
|
}
|
||
|
|
|
||
|
|
export 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 function 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';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function eventIcon(type: string) {
|
||
|
|
switch (type) {
|
||
|
|
case 'REGISTERED': return createElement(UserPlus, { size: 14 });
|
||
|
|
case 'DEREGISTERED': return createElement(UserMinus, { size: 14 });
|
||
|
|
case 'AGENT_STARTED': return createElement(Play, { size: 14 });
|
||
|
|
case 'AGENT_STOPPED': return createElement(Square, { size: 14 });
|
||
|
|
case 'WENT_STALE': return createElement(Clock, { size: 14 });
|
||
|
|
case 'WENT_DEAD': return createElement(Skull, { size: 14 });
|
||
|
|
case 'RECOVERED': return createElement(HeartPulse, { size: 14 });
|
||
|
|
case 'ROUTE_STATE_CHANGED': return createElement(Route, { size: 14 });
|
||
|
|
case 'COMMAND_DELIVERED':
|
||
|
|
case 'COMMAND_ACKNOWLEDGED': return createElement(Send, { size: 14 });
|
||
|
|
default: return createElement(Activity, { size: 14 });
|
||
|
|
}
|
||
|
|
}
|