'use client'; import { getVersion, restartSystem } from '@/services/admin/tool'; import { formatDate } from '@/utils/common'; import { useQuery } from '@tanstack/react-query'; import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@workspace/ui/components/alert-dialog'; import { Badge } from '@workspace/ui/components/badge'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'; import { Icon } from '@workspace/ui/custom-components/icon'; import { useTranslations } from 'next-intl'; import Link from 'next/link'; import { useState } from 'react'; import packageJson from '../../../../package.json'; import SystemLogsDialog from './system-logs-dialog'; export default function SystemVersionCard() { const t = useTranslations('tool'); const [openRestart, setOpenRestart] = useState(false); const [isRestarting, setIsRestarting] = useState(false); const { data: versionInfo } = useQuery({ queryKey: ['getVersionInfo'], queryFn: async () => { try { const [webResponse, serverResponse, systemResponse] = await Promise.all([ fetch( 'https://data.jsdelivr.com/v1/packages/gh/perfect-panel/ppanel-web/resolved?specifier=latest', ), fetch( 'https://data.jsdelivr.com/v1/packages/gh/perfect-panel/server/resolved?specifier=latest', ), getVersion(), ]); const webData = webResponse.ok ? await webResponse.json() : null; const serverData = serverResponse.ok ? await serverResponse.json() : null; const systemData = systemResponse.data.data; const rawVersion = (systemData?.version || '').replace(' Develop', '').trim(); const timeMatch = rawVersion.match(/\(([^)]+)\)/); const timestamp = timeMatch ? timeMatch[1] : ''; const versionWithoutTime = rawVersion.replace(/\([^)]*\)/, '').trim(); const isDevelopment = !/^[Vv]?\d+\.\d+\.\d+(-[a-zA-Z]+(\.\d+)?)?$/.test(versionWithoutTime); let displayVersion = versionWithoutTime; if ( !isDevelopment && !versionWithoutTime.startsWith('V') && !versionWithoutTime.startsWith('v') ) { displayVersion = `V${versionWithoutTime}`; } const lastUpdated = formatDate(new Date(timestamp || Date.now())) || ''; const systemInfo = { isRelease: !isDevelopment, version: displayVersion, lastUpdated, }; const latestReleases = { web: webData ? { version: webData.version, url: `https://github.com/perfect-panel/ppanel-web/releases/tag/v${webData.version}`, } : null, server: serverData ? { version: serverData.version, url: `https://github.com/perfect-panel/server/releases/tag/v${serverData.version}`, } : null, }; const hasNewVersion = latestReleases.web && packageJson.version !== latestReleases.web.version.replace(/^v/, ''); const hasServerNewVersion = latestReleases.server && systemInfo.version && systemInfo.version.replace(/^V/, '') !== latestReleases.server.version.replace(/^v/, ''); return { systemInfo, latestReleases, hasNewVersion, hasServerNewVersion, }; } catch (error) { console.error('Failed to fetch version info:', error); return { systemInfo: { isRelease: true, version: 'V1.0.0', lastUpdated: '' }, latestReleases: { web: null, server: null }, hasNewVersion: false, hasServerNewVersion: false, }; } }, staleTime: 0, retry: 1, retryDelay: 10000, initialData: { systemInfo: { isRelease: true, version: 'V1.0.0', lastUpdated: '' }, latestReleases: { web: null, server: null }, hasNewVersion: false, hasServerNewVersion: false, }, }); const { systemInfo, latestReleases, hasNewVersion, hasServerNewVersion } = versionInfo; return ( {t('systemServices')}
{t('confirmSystemReboot')} {t('rebootDescription')} {t('cancel')}
{t('webVersion')}
V{packageJson.version} {hasNewVersion && ( {t('newVersionAvailable')} )}
{t('serverVersion')}
{systemInfo?.version || 'V1.0.0'} {hasServerNewVersion && ( {t('newVersionAvailable')} )}
); }