'use client'; import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { ExternalLink, Loader2 } from 'lucide-react'; import { useTranslations } from 'next-intl'; 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 t = useTranslations('nodes'); 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()}> {t('update.title')} {t('update.description')}

{t('update.currentVersion')}

{node.version || 'unknown'}

{t('update.channel')}

{channel === 'preview' ? t('channel.preview') : t('channel.stable')}

{t('update.updateStatus')}

{releaseQuery.isFetching ? (
{t('update.checking')}
) : releaseQuery.isError ? (

{getErrorMessage(releaseQuery.error, t('requestFailed'))}

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

{t('update.targetVersion')}

{release.tag_name || t('update.notFound')}

{t('update.publishedAt')}

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

{release.body || t('update.noNotes')}

{release.html_url ? ( {t('update.viewRelease')} ) : null}
) : null}
); }