Files
neodlp/src/helpers/use-app-updater.ts

67 lines
3.0 KiB
TypeScript

import { config } from "@/config";
import { check as checkAppUpdate, Update } from "@tauri-apps/plugin-updater";
import { relaunch as relaunchApp } from "@tauri-apps/plugin-process";
import { useSettingsPageStatesStore } from "@/services/store";
import { useLogger } from "@/helpers/use-logger";
import { sendNotification } from '@tauri-apps/plugin-notification';
export default function useAppUpdater() {
const setIsCheckingAppUpdate = useSettingsPageStatesStore(state => state.setIsCheckingAppUpdate);
const setAppUpdate = useSettingsPageStatesStore(state => state.setAppUpdate);
const setIsUpdating = useSettingsPageStatesStore(state => state.setIsUpdatingApp);
const setDownloadProgress = useSettingsPageStatesStore(state => state.setAppUpdateDownloadProgress);
const enableNotifications = useSettingsPageStatesStore(state => state.settings.enable_notifications);
const updateNotification = useSettingsPageStatesStore(state => state.settings.update_notification);
const LOG = useLogger();
const checkForAppUpdate = async () => {
setIsCheckingAppUpdate(true);
try {
const update = await checkAppUpdate();
if (update) {
setAppUpdate(update);
console.log(`app update available v${update.version}`);
LOG.info('NEODLP', `App update available v${update.version}`);
if (enableNotifications && updateNotification) {
sendNotification({
title: `Update Available (v${update.version})`,
body: `A newer version of ${config.appName} is available. Please update to the latest version for the best experience`,
});
}
}
} catch (error) {
console.error(error);
} finally {
setIsCheckingAppUpdate(false);
}
}
const downloadAndInstallAppUpdate = async (update: Update) => {
setIsUpdating(true);
LOG.info('NEODLP', `Downloading and installing app update v${update.version}`);
let downloaded = 0;
let contentLength: number | undefined = 0;
await update.downloadAndInstall((event) => {
switch (event.event) {
case 'Started':
contentLength = event.data.contentLength;
console.log(`started downloading app update of ${event.data.contentLength} bytes`);
break;
case 'Progress':
downloaded += event.data.chunkLength;
const progress = (downloaded / (contentLength || 1)) * 100;
setDownloadProgress(Math.round(progress * 10) / 10);
console.log(`downloaded ${downloaded} bytes from ${contentLength} bytes of app update`);
break;
case 'Finished':
console.log('app update download finished');
setIsUpdating(false);
break;
}
});
await relaunchApp();
}
return { checkForAppUpdate, downloadAndInstallAppUpdate };
}