import { useCallback, useMemo } from "react"; import semver from "semver"; import { useDeviceStore } from "@/hooks/stores"; import { JsonRpcError, RpcMethodNotFound } from "@/hooks/useJsonRpc"; import { getUpdateStatus, getLocalVersion as getLocalVersionRpc } from "@/utils/jsonrpc"; import notifications from "@/notifications"; import { m } from "@localizations/messages.js"; export interface VersionInfo { appVersion: string; systemVersion: string; } export interface SystemVersionInfo { local: VersionInfo; remote?: VersionInfo; systemUpdateAvailable: boolean; systemDowngradeAvailable: boolean; appUpdateAvailable: boolean; appDowngradeAvailable: boolean; error?: string; } export function useVersion() { const { appVersion, systemVersion, setAppVersion, setSystemVersion, } = useDeviceStore(); if (result.error) { notifications.error(m.updates_failed_check({ error: String(result.error) })); reject(new Error("Failed to check for updates")); } else { resolve(result); } } }); }); }, [send, setAppVersion, setSystemVersion]); const isOnDevVersion = useMemo(() => { if (appVersion && semver.prerelease(appVersion)) return true; if (systemVersion && semver.prerelease(systemVersion)) return true; return false; }, [appVersion, systemVersion]); const getLocalVersion = useCallback(() => { return new Promise((resolve, reject) => { send("getLocalVersion", {}, (resp: JsonRpcResponse) => { if ("error" in resp) { console.log(resp.error) if (resp.error.code === RpcMethodNotFound) { console.warn("Failed to get device version, using legacy version"); return getVersionInfo().then(result => resolve(result.local)).catch(reject); } console.error("Failed to get device version N", resp.error); notifications.error(m.updates_failed_get_device_version({ error: String(resp.error) })); reject(new Error("Failed to get device version")); } else { const result = resp.result as VersionInfo; setAppVersion(result.appVersion); setSystemVersion(result.systemVersion); resolve(result); } }); }); }, [send, setAppVersion, setSystemVersion, getVersionInfo]); return { getVersionInfo, getLocalVersion, appVersion, systemVersion, isOnDevVersion, }; }