'use client'; import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { ExternalLink, Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { formatDateTime } from '@/lib/utils'; import type { NodeAgentReleaseInfo, NodeItem, ReleaseChannel, } from '@/lib/services/openflare'; import { NodeService } from '@/lib/services/openflare'; import { NodeStatusBadge } from './node-status-badge'; import { formatRelativeTime, getErrorMessage } from './node-utils'; export function AgentUpdateDialog({ open, node, submitting, onClose, onConfirm, }: { open: boolean; node: NodeItem; submitting: boolean; onClose: () => void; onConfirm: ( release: NodeAgentReleaseInfo | null, channel: ReleaseChannel, ) => Promise; }) { const [channel, setChannel] = useState('stable'); const releaseQuery = useQuery({ queryKey: ['openflare', 'node-agent-release', node.id, channel], queryFn: () => NodeService.getAgentRelease(node.id, channel), enabled: open, }); const release = releaseQuery.data ?? null; return ( !next && onClose()}> Agent 升级 检查 GitHub 发布并向节点下发升级指令,节点将在下一次心跳后执行。

当前版本

{node.version || 'unknown'}

检查通道

{channel === 'preview' ? '预览版' : '正式版'}

更新状态

{releaseQuery.isFetching ? (
检查发布版本中...
) : releaseQuery.isError ? (

{getErrorMessage(releaseQuery.error)}

) : release ? (
{release.prerelease ? ( ) : ( )}

目标版本

{release.tag_name || '未找到'}

发布时间

{release.published_at ? `${formatRelativeTime(release.published_at)} · ${formatDateTime(release.published_at)}` : '—'}

{release.body || '暂无更新说明'}

{release.html_url ? ( 查看发布详情 ) : null}
) : null}
); }