"use client" import {useMutation, useQuery} from "@tanstack/react-query" import {ExternalLink, RefreshCw, Sparkles} from "lucide-react" import {toast} from "sonner" import {AdminService} from "@/lib/services" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@/components/ui/alert-dialog" import {Badge} from "@/components/ui/badge" import {Button} from "@/components/ui/button" import {Card, CardContent, CardDescription, CardHeader, CardTitle} from "@/components/ui/card" import {Spinner} from "@/components/ui/spinner" function InfoRow({ label, value }: { label: string; value: React.ReactNode }) { return (
{label} {value || "-"}
) } export function InfoTab() { const updateQuery = useQuery({ queryKey: ["admin", "update"], queryFn: () => AdminService.getUpdateStatus(), refetchInterval: 30 * 60 * 1000, staleTime: 5 * 60 * 1000, }) const applyUpdateMutation = useMutation({ mutationFn: () => AdminService.applyUpdate(), onSuccess: () => { toast.success("升级包已校验完成,服务正在重启") }, onError: (error: Error) => { toast.error(error.message || "应用升级失败") }, }) const update = updateQuery.data return (
应用更新 检查上游 GitHub Actions Release 并升级当前服务
{update?.update_available ? ( 发现新版本 ) : update ? ( 已是最新 ) : null}
{updateQuery.isLoading ? (
) : updateQuery.isError ? (

{updateQuery.error.message || "无法获取上游版本信息"}

) : update ? ( <>
{update.build_time && }
{update.release_notes && (

更新说明

{update.release_notes}

)}
{update.release_url && ( )} 升级到 {update.latest_version}? 服务将下载并校验 {update.asset_name},随后替换当前二进制并重启。请确保安装目录可写,且服务允许原地重启。 取消 applyUpdateMutation.mutate()}> 确认升级
{!update.can_upgrade && (

{update.current_version === "dev" ? "开发构建没有可比较的 Release 版本,不能执行自动升级。" : update.update_available ? "当前平台暂不支持自动替换二进制,请从 Release 页面手动升级。" : "当前版本无需升级。"}

)} ) : null}
) }