fix: 版本模块
This commit is contained in:
parent
a41db3c982
commit
3e18012b1b
@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { getSystemLog, getVersion, restartSystem } from '@/services/admin/tool';
|
import { getSystemLog, restartSystem } from '@/services/admin/tool';
|
||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from '@tanstack/react-query';
|
||||||
import {
|
import {
|
||||||
Accordion,
|
Accordion,
|
||||||
@ -29,7 +29,6 @@ import {
|
|||||||
} from '@workspace/ui/components/card';
|
} from '@workspace/ui/components/card';
|
||||||
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { formatDate } from '@workspace/ui/utils';
|
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import packageJson from '../../../../../package.json';
|
import packageJson from '../../../../../package.json';
|
||||||
@ -60,91 +59,6 @@ export default function Page() {
|
|||||||
const [openRestart, setOpenRestart] = useState(false);
|
const [openRestart, setOpenRestart] = useState(false);
|
||||||
const [isRestarting, setIsRestarting] = useState(false);
|
const [isRestarting, setIsRestarting] = useState(false);
|
||||||
|
|
||||||
const { data: latestReleases } = useQuery({
|
|
||||||
queryKey: ['getLatestReleases'],
|
|
||||||
queryFn: async () => {
|
|
||||||
try {
|
|
||||||
const [webResponse, serverResponse] = await Promise.all([
|
|
||||||
fetch('https://api.github.com/repos/perfect-panel/ppanel-web/releases/latest'),
|
|
||||||
fetch('https://api.github.com/repos/perfect-panel/server/releases/latest'),
|
|
||||||
]);
|
|
||||||
|
|
||||||
const webData = webResponse.ok ? await webResponse.json() : null;
|
|
||||||
const serverData = serverResponse.ok ? await serverResponse.json() : null;
|
|
||||||
|
|
||||||
return {
|
|
||||||
web: webData
|
|
||||||
? {
|
|
||||||
version: webData.tag_name,
|
|
||||||
url: webData.html_url,
|
|
||||||
publishedAt: webData.published_at,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
server: serverData
|
|
||||||
? {
|
|
||||||
version: serverData.tag_name,
|
|
||||||
url: serverData.html_url,
|
|
||||||
publishedAt: serverData.published_at,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Failed to fetch latest releases:', error);
|
|
||||||
return { web: null, server: null };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
staleTime: 60 * 60 * 1000,
|
|
||||||
retry: 1,
|
|
||||||
retryDelay: 10000,
|
|
||||||
});
|
|
||||||
|
|
||||||
// 检查是否有新版本
|
|
||||||
const hasNewVersion =
|
|
||||||
latestReleases?.web && packageJson.version !== latestReleases.web.version.replace(/^v/, '');
|
|
||||||
|
|
||||||
const { data: systemInfo } = useQuery({
|
|
||||||
queryKey: ['getVersion'],
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await getVersion();
|
|
||||||
|
|
||||||
const versionString = data.data?.version || '';
|
|
||||||
const releaseVersionRegex = /^[Vv]?\d+\.\d+\.\d+$/;
|
|
||||||
const timeMatch = versionString.match(/\(([^)]+)\)/);
|
|
||||||
const timeInBrackets = timeMatch ? timeMatch[1] : '';
|
|
||||||
|
|
||||||
const versionWithoutTime = versionString.replace(/\([^)]*\)/, '').trim();
|
|
||||||
const isDevelopment = !releaseVersionRegex.test(versionWithoutTime);
|
|
||||||
|
|
||||||
let baseVersion = versionWithoutTime;
|
|
||||||
let versionSuffix = '';
|
|
||||||
let lastUpdated = '';
|
|
||||||
|
|
||||||
if (isDevelopment && versionWithoutTime.includes('-')) {
|
|
||||||
const parts = versionWithoutTime.split('-');
|
|
||||||
baseVersion = parts[0] || versionWithoutTime;
|
|
||||||
versionSuffix = parts.slice(1).join('-');
|
|
||||||
}
|
|
||||||
|
|
||||||
lastUpdated = formatDate(new Date(timeInBrackets || Date.now())) || '';
|
|
||||||
|
|
||||||
const displayVersion =
|
|
||||||
baseVersion.startsWith('V') || baseVersion.startsWith('v')
|
|
||||||
? baseVersion
|
|
||||||
: `V${baseVersion}`;
|
|
||||||
|
|
||||||
return {
|
|
||||||
isRelease: !isDevelopment,
|
|
||||||
version: displayVersion,
|
|
||||||
lastUpdated,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const hasServerNewVersion =
|
|
||||||
latestReleases?.server &&
|
|
||||||
systemInfo &&
|
|
||||||
systemInfo.version.replace(/^V/, '') !== latestReleases.server.version.replace(/^v/, '');
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className='border-none'>
|
<Card className='border-none'>
|
||||||
<CardHeader className='flex flex-col items-start justify-between sm:flex-row sm:items-center'>
|
<CardHeader className='flex flex-col items-start justify-between sm:flex-row sm:items-center'>
|
||||||
@ -220,37 +134,6 @@ export default function Page() {
|
|||||||
<Icon icon='mdi:server' className='mr-2 h-4 w-4 text-blue-600' />
|
<Icon icon='mdi:server' className='mr-2 h-4 w-4 text-blue-600' />
|
||||||
<div className='flex items-center space-x-2'>
|
<div className='flex items-center space-x-2'>
|
||||||
<span className='text-xs font-medium'>{t('serverVersion')}</span>
|
<span className='text-xs font-medium'>{t('serverVersion')}</span>
|
||||||
<Badge
|
|
||||||
variant={!systemInfo?.isRelease ? 'destructive' : 'default'}
|
|
||||||
className='px-1.5 py-0.5 text-xs'
|
|
||||||
>
|
|
||||||
{systemInfo?.version || 'V1.0.0'}
|
|
||||||
{!systemInfo?.isRelease && (
|
|
||||||
<span className='ml-1'>{t('developmentVersion')}</span>
|
|
||||||
)}
|
|
||||||
</Badge>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className='flex items-center space-x-2'>
|
|
||||||
{hasServerNewVersion && (
|
|
||||||
<Button
|
|
||||||
variant='outline'
|
|
||||||
size='sm'
|
|
||||||
className='h-6 px-2 text-xs'
|
|
||||||
onClick={() =>
|
|
||||||
window.open(
|
|
||||||
latestReleases?.server?.url ||
|
|
||||||
'https://github.com/perfect-panel/server/releases',
|
|
||||||
'_blank',
|
|
||||||
)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Icon icon='mdi:open-in-new' className='mr-1 h-3 w-3' />
|
|
||||||
{t('viewNewVersion')}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
<div className='text-muted-foreground hidden text-right text-xs sm:block'>
|
|
||||||
<div className='font-mono'>{systemInfo?.lastUpdated || '--'}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user