mirror of
https://github.com/perfect-panel/ppanel-web.git
synced 2026-02-06 11:40:28 -05:00
🐛 fix: Update billing URL fetching logic and improve version handling in system version card component
This commit is contained in:
parent
e4429a5c4d
commit
1c8d4afad0
@ -21,12 +21,12 @@ async function getBillingURL() {
|
|||||||
'https://api.github.com/repos/perfect-panel/ppanel-assets/commits',
|
'https://api.github.com/repos/perfect-panel/ppanel-assets/commits',
|
||||||
);
|
);
|
||||||
const json = await response.json();
|
const json = await response.json();
|
||||||
const version = json[0]?.sha;
|
const version = json[0]?.sha || 'latest';
|
||||||
const url = new URL('https://cdn.jsdelivr.net/gh/perfect-panel/ppanel-assets');
|
const url = new URL('https://cdn.jsdmirror.com/gh/perfect-panel/ppanel-assets');
|
||||||
url.pathname += `@${version}/billing/index.json`;
|
url.pathname += `@${version}/billing/index.json`;
|
||||||
return url.toString();
|
return url.toString();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return 'https://cdn.jsdelivr.net/gh/perfect-panel/ppanel-assets/billing/index.json';
|
return 'https://cdn.jsdmirror.com/gh/perfect-panel/ppanel-assets/billing/index.json';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -28,93 +28,99 @@ export default function SystemVersionCard() {
|
|||||||
const [openRestart, setOpenRestart] = useState(false);
|
const [openRestart, setOpenRestart] = useState(false);
|
||||||
const [isRestarting, setIsRestarting] = useState(false);
|
const [isRestarting, setIsRestarting] = useState(false);
|
||||||
|
|
||||||
const { data: latestReleases } = useQuery({
|
const { data: versionInfo } = useQuery({
|
||||||
queryKey: ['getLatestReleases'],
|
queryKey: ['getVersionInfo'],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
try {
|
try {
|
||||||
const [webResponse, serverResponse] = await Promise.all([
|
const [webResponse, serverResponse, systemResponse] = await Promise.all([
|
||||||
fetch('https://api.github.com/repos/perfect-panel/ppanel-web/releases/latest'),
|
fetch(
|
||||||
fetch('https://api.github.com/repos/perfect-panel/server/releases/latest'),
|
'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 webData = webResponse.ok ? await webResponse.json() : null;
|
||||||
const serverData = serverResponse.ok ? await serverResponse.json() : null;
|
const serverData = serverResponse.ok ? await serverResponse.json() : null;
|
||||||
|
const systemData = systemResponse.data.data;
|
||||||
|
|
||||||
return {
|
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
|
web: webData
|
||||||
? {
|
? {
|
||||||
version: webData.tag_name,
|
version: webData.version,
|
||||||
url: webData.html_url,
|
url: `https://github.com/perfect-panel/ppanel-web/releases/tag/${webData.version}`,
|
||||||
publishedAt: webData.published_at,
|
|
||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
server: serverData
|
server: serverData
|
||||||
? {
|
? {
|
||||||
version: serverData.tag_name,
|
version: serverData.version,
|
||||||
url: serverData.html_url,
|
url: `https://github.com/perfect-panel/server/releases/tag/${serverData.version}`,
|
||||||
publishedAt: serverData.published_at,
|
|
||||||
}
|
}
|
||||||
: null,
|
: 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) {
|
} catch (error) {
|
||||||
console.error('Failed to fetch latest releases:', error);
|
console.error('Failed to fetch version info:', error);
|
||||||
return { web: null, server: null };
|
return {
|
||||||
|
systemInfo: { isRelease: true, version: 'V1.0.0', lastUpdated: '' },
|
||||||
|
latestReleases: { web: null, server: null },
|
||||||
|
hasNewVersion: false,
|
||||||
|
hasServerNewVersion: false,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
staleTime: 60 * 60 * 1000,
|
staleTime: 0,
|
||||||
retry: 1,
|
retry: 1,
|
||||||
retryDelay: 10000,
|
retryDelay: 10000,
|
||||||
});
|
initialData: {
|
||||||
|
systemInfo: { isRelease: true, version: 'V1.0.0', lastUpdated: '' },
|
||||||
const hasNewVersion =
|
latestReleases: { web: null, server: null },
|
||||||
latestReleases?.web && packageJson.version !== latestReleases.web.version.replace(/^v/, '');
|
hasNewVersion: false,
|
||||||
|
hasServerNewVersion: false,
|
||||||
const { data: systemInfo } = useQuery({
|
|
||||||
queryKey: ['getVersion'],
|
|
||||||
queryFn: async () => {
|
|
||||||
const { data } = await getVersion();
|
|
||||||
|
|
||||||
const versionString = (data.data?.version || '').replace(' Develop', '').trim();
|
|
||||||
const releaseVersionRegex = /^[Vv]?\d+\.\d+\.\d+(-[a-zA-Z]+(\.\d+)?)?$/;
|
|
||||||
const timeMatch = versionString.match(/\(([^)]+)\)/);
|
|
||||||
const timeInBrackets = timeMatch ? timeMatch[1] : '';
|
|
||||||
|
|
||||||
const versionWithoutTime = versionString.replace(/\([^)]*\)/, '').trim();
|
|
||||||
|
|
||||||
const isDevelopment =
|
|
||||||
versionWithoutTime.includes('-dev') ||
|
|
||||||
versionWithoutTime.includes('-debug') ||
|
|
||||||
versionWithoutTime.includes('-nightly') ||
|
|
||||||
versionWithoutTime.includes('dev') ||
|
|
||||||
!releaseVersionRegex.test(versionWithoutTime);
|
|
||||||
|
|
||||||
let baseVersion = versionWithoutTime;
|
|
||||||
let lastUpdated = '';
|
|
||||||
|
|
||||||
if (isDevelopment && versionWithoutTime.includes('-')) {
|
|
||||||
const parts = versionWithoutTime.split('-');
|
|
||||||
baseVersion = parts[0] || versionWithoutTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 =
|
const { systemInfo, latestReleases, hasNewVersion, hasServerNewVersion } = versionInfo;
|
||||||
latestReleases?.server &&
|
|
||||||
systemInfo &&
|
|
||||||
systemInfo.version.replace(/^V/, '') !== latestReleases.server.version.replace(/^v/, '');
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className='p-3'>
|
<Card className='p-3'>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user