mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-04-26 09:20:18 +08:00
feat: display cross-version installation status in app detail modal
- 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.
This commit is contained in:
46
src/App.vue
46
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<string, unknown>) => {
|
||||
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<string, unknown>) => {
|
||||
};
|
||||
|
||||
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) => {
|
||||
|
||||
@@ -97,7 +97,9 @@
|
||||
: 'from-brand to-brand-dark'
|
||||
"
|
||||
@click="handleInstall"
|
||||
:disabled="installFeedback || isCompleted"
|
||||
:disabled="
|
||||
installFeedback || isCompleted || isOtherVersionInstalled
|
||||
"
|
||||
>
|
||||
<i
|
||||
class="fas"
|
||||
@@ -271,7 +273,8 @@ const props = defineProps<{
|
||||
show: boolean;
|
||||
app: App | null;
|
||||
screenshots: string[];
|
||||
isinstalled: boolean;
|
||||
sparkInstalled: boolean;
|
||||
apmInstalled: boolean;
|
||||
}>();
|
||||
|
||||
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") {
|
||||
|
||||
@@ -9,6 +9,7 @@ export const APM_STORE_STATS_BASE_URL: string =
|
||||
|
||||
// 下面的变量用于存储当前应用的信息,其实用在多个组件中
|
||||
export const currentApp = ref<App | null>(null);
|
||||
export const currentAppIsInstalled = ref(false);
|
||||
export const currentAppSparkInstalled = ref(false);
|
||||
export const currentAppApmInstalled = ref(false);
|
||||
|
||||
export const currentStoreMode = ref<StoreMode>("hybrid");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user