'use client'; import { useMutation, useQuery } from '@tanstack/react-query'; import { ExternalLink, RefreshCw, Sparkles } from 'lucide-react'; import { toast } from 'sonner'; import services 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: () => services.adminStatus.getUpdateStatus(), refetchInterval: 30 * 60 * 1000, staleTime: 5 * 60 * 1000, }); const applyUpdateMutation = useMutation({ mutationFn: () => services.adminStatus.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}
); }