|
1 | 1 | import { Download as DownloadIcon, Loader2, Pause, Play } from 'lucide-react' |
2 | | -import React, { useEffect, useRef, useState } from 'react' |
| 2 | +import React, { useEffect, useMemo, useRef, useState } from 'react' |
3 | 3 | import { useTranslation } from 'react-i18next' |
4 | 4 | import { Card, CardContent } from '@/components/ui/card' |
5 | 5 | import { useGetNodes } from '@/service/api' |
@@ -59,12 +59,19 @@ export default function NodeLogs() { |
59 | 59 |
|
60 | 60 | const { data: nodes = [] } = useGetNodes({}) |
61 | 61 |
|
62 | | - // Auto-select first node if available and none is selected |
| 62 | + // Filter to only show connected nodes |
| 63 | + const connectedNodes = useMemo(() => nodes.filter(node => node.status === 'connected'), [nodes]) |
| 64 | + |
| 65 | + // Auto-select first connected node if available and none is selected |
63 | 66 | useEffect(() => { |
64 | | - if (nodes.length > 0 && selectedNode === 0) { |
65 | | - setSelectedNode(nodes[0].id) |
| 67 | + if (connectedNodes.length > 0 && selectedNode === 0) { |
| 68 | + setSelectedNode(connectedNodes[0].id) |
| 69 | + } |
| 70 | + // Reset selection if selected node is no longer connected |
| 71 | + if (selectedNode !== 0 && !connectedNodes.find(node => node.id === selectedNode)) { |
| 72 | + setSelectedNode(0) |
66 | 73 | } |
67 | | - }, [nodes, selectedNode]) |
| 74 | + }, [connectedNodes, selectedNode]) |
68 | 75 |
|
69 | 76 | const scrollToBottom = () => { |
70 | 77 | if (autoScroll && scrollRef.current) { |
@@ -293,12 +300,12 @@ export default function NodeLogs() { |
293 | 300 | <Label htmlFor="node-select" className="mb-1 block text-sm"> |
294 | 301 | {t('nodes.title')} |
295 | 302 | </Label> |
296 | | - <Select value={selectedNode.toString()} onValueChange={value => handleNodeChange(Number(value))}> |
297 | | - <SelectTrigger id="node-select" className="h-9 w-full text-sm sm:w-[250px]"> |
298 | | - <SelectValue placeholder={t('nodes.selectNode')} /> |
| 303 | + <Select value={selectedNode.toString()} onValueChange={value => handleNodeChange(Number(value))} disabled={connectedNodes.length === 0}> |
| 304 | + <SelectTrigger id="node-select" className="h-9 w-full text-sm sm:w-[250px]" disabled={connectedNodes.length === 0}> |
| 305 | + <SelectValue placeholder={connectedNodes.length === 0 ? t('nodes.noNodes') : t('nodes.selectNode')} /> |
299 | 306 | </SelectTrigger> |
300 | 307 | <SelectContent> |
301 | | - {nodes.map(node => ( |
| 308 | + {connectedNodes.map(node => ( |
302 | 309 | <SelectItem key={node.id} value={node.id.toString()} className="text-sm"> |
303 | 310 | {node.name} |
304 | 311 | </SelectItem> |
|
0 commit comments