'use client'; import {useEffect, useState} from 'react'; import {ExternalLink, Loader2} from 'lucide-react'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import {Badge} from '@/components/ui/badge'; import {Button} from '@/components/ui/button'; import {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@/components/ui/card'; import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle,} from '@/components/ui/dialog'; import {Input} from '@/components/ui/input'; import {Label} from '@/components/ui/label'; import {Progress} from '@/components/ui/progress'; import {Tabs, TabsContent, TabsList, TabsTrigger} from '@/components/ui/tabs'; import {useOpenFlareServerUpgrade} from '@/lib/hooks/use-openflare-server-upgrade'; import type {LatestReleaseInfo, ReleaseChannel} from '@/lib/services/openflare'; import {formatDateTime} from '@/lib/utils'; import {formatRelativeTime} from '@/app/(main)/nodes/components/node-utils'; import {UpgradeLogPanel} from './upgrade-log-panel'; function getUpgradeBadge(release: LatestReleaseInfo | null | undefined) { if (!release) { return { label: '未检查', variant: 'outline' as const }; } if (release.in_progress) { return { label: '升级中', variant: 'secondary' as const }; } if (release.has_update) { return { label: '可升级', variant: 'secondary' as const }; } return { label: '最新', variant: 'default' as const }; } export function VersionUpgradeDialog({ open, onOpenChange, canUpgrade = true, }: { open: boolean; onOpenChange: (open: boolean) => void; canUpgrade?: boolean; }) { const { currentVersion, selectedChannel, release, uploadedBinary, releaseErrorMessage, manualStatusMessage, manualErrorMessage, isInitialLoading, isChecking, isUpgrading, isUploadingBinary, uploadProgress, isConfirmingManualUpgrade, handleOpen, handleCheckRelease, handleChannelChange, handleUpgrade, handleUploadBinary, handleConfirmManualUpgrade, } = useOpenFlareServerUpgrade({ open, canUpgrade }); const [selectedBinary, setSelectedBinary] = useState(null); useEffect(() => { if (open) { handleOpen(); } }, [open, handleOpen]); useEffect(() => { if (!open) { setSelectedBinary(null); } }, [open]); const upgradeBadge = getUpgradeBadge(release); const selectedChannelLabel = selectedChannel === 'preview' ? '预览版' : '正式版'; const uploadPhaseLabel = uploadProgress >= 100 ? '已上传,正在服务端校验版本...' : '上传中...'; const canConfirmManualUpgrade = Boolean( uploadedBinary?.ready_to_upgrade && uploadedBinary.upload_token, ); const isBusy = isChecking || isUpgrading || isUploadingBinary || isConfirmingManualUpgrade; return ( 服务端版本 默认检查正式版更新;也可检查 preview 发布或手动上传二进制包。升级开始后服务会短暂重启。
当前版本

{currentVersion}

{upgradeBadge.label}
最新版本

{release?.tag_name || '未检查'}

{canUpgrade ? ( ) : null}
{canUpgrade ? ( ) : null}
{isInitialLoading ? (
加载版本信息...
) : null} {!isInitialLoading && releaseErrorMessage ? (
{releaseErrorMessage}
) : null} 在线升级 {canUpgrade ? 手动升级 : null} {release ? 升级日志 : null} {!isInitialLoading && !releaseErrorMessage && !release ? (
尚未检查{selectedChannelLabel},点击「检查{selectedChannelLabel}」后展示 GitHub Release 信息。
) : null} {release ? ( GitHub {selectedChannelLabel} · {release.tag_name} {release.published_at ? `发布时间:${formatRelativeTime(release.published_at)} · ${formatDateTime(release.published_at)}` : '未提供发布时间'}
{release.has_update ? '发现新版本' : '已经是最新版本'} {release.prerelease ? ( Preview 发布 ) : ( 正式发布 )} {!release.upgrade_supported ? ( 当前平台不支持自动升级 ) : null} {release.in_progress ? ( 升级任务执行中 ) : null}
{release.body || '暂无更新说明'}
{release.html_url ? ( 查看发布详情 ) : null} {canUpgrade ? (
) : null}
) : null}
{canUpgrade ? ( 手动升级 支持上传已编译好的当前平台 Server 可执行文件。
{ setSelectedBinary(event.target.files?.[0] ?? null); }} />
{canConfirmManualUpgrade ? ( ) : ( )}
{isUploadingBinary ? (
{uploadPhaseLabel} {uploadProgress}%
) : null} {manualErrorMessage ? (
{manualErrorMessage}
) : null} {!manualErrorMessage && manualStatusMessage ? (
{manualStatusMessage}
) : null} {uploadedBinary ? (
{uploadedBinary.ready_to_upgrade ? '可确认升级' : uploadedBinary.has_update ? '待确认' : '不可升级'} {!uploadedBinary.upgrade_supported ? ( 当前版本不支持手动升级 ) : null}

{uploadedBinary.comparison_message}

) : (
尚未上传升级包
)}
) : null} {release ? ( ) : null}
); } function InfoCell({label, value}: {label: string; value: string}) { return (

{label}

{value}

); } export type {ReleaseChannel};