-
- 상태 갱신
+
}
/>
{[
- ['등록 노드', `${tailscaleNodes.length}대`, '게이트웨이 수집 기준'],
+ ['등록 노드', `${nodes.length}대`, source ? `${source} 수집 기준` : '게이트웨이 수집 기준'],
['온라인', `${online}대`, '최근 접속 정상'],
['Subnet Router', `${subnetRouters}대`, '클러스터 CIDR 광고']
].map(([label, value, description]) => (
@@ -380,14 +435,19 @@ export function TailscaleStatusPage() {
))}
+ {error ? (
+
+ {error}
+
+ ) : null}
-
+
>
);
}
-function TailscaleNodeTable() {
+function TailscaleNodeTable({ nodes, loading }: { nodes: TailscaleNode[]; loading: boolean }) {
return (
@@ -405,14 +465,24 @@ function TailscaleNodeTable() {
- {tailscaleNodes.map((node) => (
+ {loading && nodes.length === 0 ? (
+
+ | 노드 정보를 불러오는 중입니다. |
+
+ ) : null}
+ {!loading && nodes.length === 0 ? (
+
+ | 표시할 노드가 없습니다. |
+
+ ) : null}
+ {nodes.map((node) => (
| {node.name} |
{node.ip} |
{node.role} |
{node.user} |
{node.routes} |
- {node.lastSeen} |
+ {formatTailscaleLastSeen(node.lastSeen)} |
|
))}
@@ -424,7 +494,7 @@ function TailscaleNodeTable() {
}
export function TailscaleRoutesPage() {
- const routes = tailscaleNodes.filter((node) => node.routes !== '-');
+ const routes = mockTailscaleNodes.filter((node) => node.routes !== '-');
return (
<>