Files
2026-07-13 13:39:12 +08:00

54 lines
1.7 KiB
React

import React from "react";
import { Box, Text } from "ink";
import { HeaderSwr } from "../../tui-components/HeaderSwr.jsx";
import { StatusBadge } from "../../tui-components/StatusBadge.jsx";
export default function Health({ baseUrl, apiKey }) {
const fetcher = React.useCallback(async () => {
const res = await fetch(`${baseUrl}/api/monitoring/health?detail=true`, {
headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : {},
});
return res.ok ? res.json() : null;
}, [baseUrl, apiKey]);
return (
<HeaderSwr
fetcher={fetcher}
interval={5000}
render={(data) => {
const components = data?.components ?? {};
const alerts = data?.alerts ?? [];
return (
<Box flexDirection="column" gap={1}>
<Box flexDirection="column">
<Text bold>Components</Text>
{Object.entries(components).map(([name, status]) => (
<Box key={name} gap={2}>
<Box width={20}>
<Text>{name}</Text>
</Box>
<StatusBadge
status={typeof status === "string" ? status : (status?.status ?? "unknown")}
/>
</Box>
))}
</Box>
{alerts.length > 0 && (
<Box flexDirection="column">
<Text bold color="red">
Alerts ({alerts.length})
</Text>
{alerts.map((a, i) => (
<Text key={i} color="red">
{a.message ?? a}
</Text>
))}
</Box>
)}
</Box>
);
}}
/>
);
}