feat(projects): support scheduled detection and update system. close #657 (#669)

This commit is contained in:
青菜白玉汤 2024-11-17 22:25:04 +08:00 committed by GitHub
parent 17d7e52216
commit d088f81345
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -10,26 +10,33 @@ export function setupAppErrorHandle(app: App) {
}; };
} }
// Update check interval in milliseconds
const UPDATE_CHECK_INTERVAL = 3 * 60 * 1000;
export function setupAppVersionNotification() { export function setupAppVersionNotification() {
const canAutoUpdateApp = import.meta.env.VITE_AUTOMATICALLY_DETECT_UPDATE === 'Y'; const canAutoUpdateApp = import.meta.env.VITE_AUTOMATICALLY_DETECT_UPDATE === 'Y';
if (!canAutoUpdateApp) return; if (!canAutoUpdateApp) return;
let isShow = false; let isShow = false;
let updateInterval: ReturnType<typeof setInterval> | undefined;
document.addEventListener('visibilitychange', async () => { // Check if updates should be checked
const preConditions = [!isShow, document.visibilityState === 'visible', !import.meta.env.DEV]; const shouldCheckForUpdates = [!isShow, document.visibilityState === 'visible', !import.meta.env.DEV].every(Boolean);
if (!preConditions.every(Boolean)) return; const checkForUpdates = async () => {
if (!shouldCheckForUpdates) return;
const buildTime = await getHtmlBuildTime(); const buildTime = await getHtmlBuildTime();
// If build time hasn't changed, no update is needed
if (buildTime === BUILD_TIME) { if (buildTime === BUILD_TIME) {
return; return;
} }
isShow = true; isShow = true;
// Show update notification
const n = window.$notification?.create({ const n = window.$notification?.create({
title: $t('system.updateTitle'), title: $t('system.updateTitle'),
content: $t('system.updateContent'), content: $t('system.updateContent'),
@ -60,7 +67,28 @@ export function setupAppVersionNotification() {
isShow = false; isShow = false;
} }
}); });
}); };
const startUpdateInterval = () => {
if (updateInterval) {
clearInterval(updateInterval);
}
updateInterval = setInterval(checkForUpdates, UPDATE_CHECK_INTERVAL);
};
// If updates should be checked, set up the visibility change listener and start the update interval
if (shouldCheckForUpdates) {
// Check for updates when the document is visible
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
checkForUpdates();
startUpdateInterval();
}
});
// Start the update interval
startUpdateInterval();
}
} }
async function getHtmlBuildTime() { async function getHtmlBuildTime() {