From 1fb81c04097cdf01afb63306fb23ad09dd5201a3 Mon Sep 17 00:00:00 2001 From: vmomenv <51269338+vmomenv@users.noreply.github.com> Date: Thu, 12 Mar 2026 08:19:37 +0000 Subject: [PATCH] feat: display cross-version installation status in app detail modal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replaced single `currentAppIsInstalled` boolean with `currentAppSparkInstalled` and `currentAppApmInstalled` in global store. - Updated `checkAppInstalled` logic in `App.vue` to fetch the installation status for both Spark and APM versions via `ipcRenderer`. - Passed both flags to `AppDetailModal.vue` as props. - Enhanced `AppDetailModal.vue` to compute the "install" button text dynamically: if viewing Spark and APM is installed, it displays `(已安装apm版)`; if viewing APM and Spark is installed, it displays `(已安装spark版)`. The button is also disabled in these scenarios to prevent duplicate cross-version installations. --- src/App.vue | 46 +++++++++++++++++++++++++------ src/components/AppDetailModal.vue | 24 ++++++++++++++-- src/global/storeConfig.ts | 3 +- src/modules/processInstall.ts | 16 +++++++++-- 4 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/App.vue b/src/App.vue index a039a719..7ff753f8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -63,7 +63,8 @@ :show="showModal" :app="currentApp" :screenshots="screenshots" - :isinstalled="currentAppIsInstalled" + :spark-installed="currentAppSparkInstalled" + :apm-installed="currentAppApmInstalled" @close="closeDetail" @install="onDetailInstall" @remove="onDetailRemove" @@ -152,7 +153,8 @@ import UninstallConfirmModal from "./components/UninstallConfirmModal.vue"; import { APM_STORE_BASE_URL, currentApp, - currentAppIsInstalled, + currentAppSparkInstalled, + currentAppApmInstalled, currentStoreMode, } from "./global/storeConfig"; import { @@ -393,7 +395,8 @@ const openDetail = (app: App | Record) => { loadScreenshots(fullApp); showModal.value = true; - currentAppIsInstalled.value = false; + currentAppSparkInstalled.value = false; + currentAppApmInstalled.value = false; checkAppInstalled(fullApp); nextTick(() => { @@ -405,11 +408,38 @@ const openDetail = (app: App | Record) => { }; const checkAppInstalled = (app: App) => { - window.ipcRenderer - .invoke("check-installed", { pkgname: app.pkgname, origin: app.origin }) - .then((isInstalled: boolean) => { - currentAppIsInstalled.value = isInstalled; - }); + if (app.isMerged) { + if (app.sparkApp) { + window.ipcRenderer + .invoke("check-installed", { + pkgname: app.sparkApp.pkgname, + origin: "spark", + }) + .then((isInstalled: boolean) => { + currentAppSparkInstalled.value = isInstalled; + }); + } + if (app.apmApp) { + window.ipcRenderer + .invoke("check-installed", { + pkgname: app.apmApp.pkgname, + origin: "apm", + }) + .then((isInstalled: boolean) => { + currentAppApmInstalled.value = isInstalled; + }); + } + } else { + window.ipcRenderer + .invoke("check-installed", { pkgname: app.pkgname, origin: app.origin }) + .then((isInstalled: boolean) => { + if (app.origin === "spark") { + currentAppSparkInstalled.value = isInstalled; + } else { + currentAppApmInstalled.value = isInstalled; + } + }); + } }; const loadScreenshots = (app: App) => { diff --git a/src/components/AppDetailModal.vue b/src/components/AppDetailModal.vue index 75d60120..cc9445a5 100644 --- a/src/components/AppDetailModal.vue +++ b/src/components/AppDetailModal.vue @@ -97,7 +97,9 @@ : 'from-brand to-brand-dark' " @click="handleInstall" - :disabled="installFeedback || isCompleted" + :disabled=" + installFeedback || isCompleted || isOtherVersionInstalled + " > (); const emit = defineEmits<{ @@ -326,15 +329,30 @@ const activeDownload = computed(() => { return downloads.value.find((d) => d.pkgname === displayApp.value?.pkgname); }); +const isinstalled = computed(() => { + return viewingOrigin.value === "spark" + ? props.sparkInstalled + : props.apmInstalled; +}); + +const isOtherVersionInstalled = computed(() => { + return viewingOrigin.value === "spark" + ? props.apmInstalled + : props.sparkInstalled; +}); + const { installFeedback } = useInstallFeedback(appPkgname); const { isCompleted } = useDownloadItemStatus(appPkgname); const installBtnText = computed(() => { - if (props.isinstalled) { + if (isinstalled.value) { return "已安装"; } if (isCompleted.value) { return "已安装"; } + if (isOtherVersionInstalled.value) { + return viewingOrigin.value === "spark" ? "已安装apm版" : "已安装spark版"; + } if (installFeedback.value) { const status = activeDownload.value?.status; if (status === "downloading") { diff --git a/src/global/storeConfig.ts b/src/global/storeConfig.ts index d7838bc8..7ea92177 100644 --- a/src/global/storeConfig.ts +++ b/src/global/storeConfig.ts @@ -9,6 +9,7 @@ export const APM_STORE_STATS_BASE_URL: string = // 下面的变量用于存储当前应用的信息,其实用在多个组件中 export const currentApp = ref(null); -export const currentAppIsInstalled = ref(false); +export const currentAppSparkInstalled = ref(false); +export const currentAppApmInstalled = ref(false); export const currentStoreMode = ref("hybrid"); diff --git a/src/modules/processInstall.ts b/src/modules/processInstall.ts index 3c0100c7..94b82a32 100644 --- a/src/modules/processInstall.ts +++ b/src/modules/processInstall.ts @@ -3,7 +3,8 @@ import pino from "pino"; import { APM_STORE_STATS_BASE_URL, currentApp, - currentAppIsInstalled, + currentAppSparkInstalled, + currentAppApmInstalled, } from "../global/storeConfig"; import { APM_STORE_BASE_URL } from "../global/storeConfig"; import { downloads } from "../global/downloadStatus"; @@ -138,9 +139,18 @@ export const handleRemove = (appObj?: App) => { window.ipcRenderer.on("remove-complete", (_event, log: DownloadResult) => { if (log.success) { - currentAppIsInstalled.value = false; + if (log.origin === "spark") { + currentAppSparkInstalled.value = false; + } else { + currentAppApmInstalled.value = false; + } } else { - currentAppIsInstalled.value = true; + // We could potentially restore the value, but if remove failed, it should still be installed. + if (log.origin === "spark") { + currentAppSparkInstalled.value = true; + } else { + currentAppApmInstalled.value = true; + } console.error("卸载失败:", log.message); } });