From 477ed19d201aa5dbfa7b46902a6a629622fcd85b Mon Sep 17 00:00:00 2001 From: tiny-craft <137850705+tiny-craft@users.noreply.github.com> Date: Sat, 7 Oct 2023 23:37:12 +0800 Subject: [PATCH] perf: update version compare logic --- frontend/src/stores/preferences.js | 7 +++++- frontend/src/utils/version.js | 36 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 frontend/src/utils/version.js diff --git a/frontend/src/stores/preferences.js b/frontend/src/stores/preferences.js index d14fa07..e04d264 100644 --- a/frontend/src/stores/preferences.js +++ b/frontend/src/stores/preferences.js @@ -12,6 +12,7 @@ import { BrowserOpenURL } from 'wailsjs/runtime/runtime.js' import { i18nGlobal } from '@/utils/i18n.js' import { enUS, NButton, NSpace, useOsTheme, zhCN } from 'naive-ui' import { h, nextTick } from 'vue' +import { compareVersion } from '@/utils/version.js' const osTheme = useOsTheme() const usePreferencesStore = defineStore('preferences', { @@ -244,7 +245,11 @@ const usePreferencesStore = defineStore('preferences', { const { success, data = {} } = await CheckForUpdate() if (success) { const { version = 'v1.0.0', latest, page_url: pageUrl } = data - if ((manual || latest > this.general.skipVersion) && latest > version && !isEmpty(pageUrl)) { + if ( + (manual || latest > this.general.skipVersion) && + compareVersion(latest, version) > 0 && + !isEmpty(pageUrl) + ) { const notiRef = $notification.show({ title: i18nGlobal.t('dialogue.upgrade.title'), content: i18nGlobal.t('dialogue.upgrade.new_version_tip', { ver: latest }), diff --git a/frontend/src/utils/version.js b/frontend/src/utils/version.js new file mode 100644 index 0000000..e82e162 --- /dev/null +++ b/frontend/src/utils/version.js @@ -0,0 +1,36 @@ +import { get, isEmpty, map, size, split, trimStart } from 'lodash' + +const toVerArr = (ver) => { + const v = trimStart(ver, 'v') + let vParts = split(v, '.') + if (isEmpty(vParts)) { + vParts = ['0'] + } + return map(vParts, (v) => { + let vNum = parseInt(v) + return isNaN(vNum) ? 0 : vNum + }) +} + +/** + * compare two version strings + * @param {string} v1 + * @param {string} v2 + * @return {number} + */ +export const compareVersion = (v1, v2) => { + if (v1 !== v2) { + const v1Nums = toVerArr(v1) + const v2Nums = toVerArr(v2) + const length = Math.max(size(v1Nums), size(v2Nums)) + + for (let i = 0; i < length; i++) { + const num1 = get(v1Nums, i, 0) + const num2 = get(v2Nums, i, 0) + if (num1 !== num2) { + return num1 > num2 ? 1 : -1 + } + } + } + return 0 +}