feat: enhance app detail modal to prioritize installed version based on installation status

- Updated `openDetail` function to check installation status for both Spark and APM versions, setting `viewingOrigin` accordingly.
- Modified logic to determine which app version to display in screenshots based on installation status.
- Improved handling of `viewingOrigin` in `AppDetailModal.vue` to default to Spark if no specific version is installed.
This commit is contained in:
2026-03-15 10:54:33 +08:00
parent b0ec3d50c4
commit 4ecea4a8b8
2 changed files with 38 additions and 12 deletions

View File

@@ -350,7 +350,7 @@ const selectCategory = (category: string) => {
} }
}; };
const openDetail = (app: App | Record<string, unknown>) => { const openDetail = async (app: App | Record<string, unknown>) => {
// 提取 pkgname必须存在 // 提取 pkgname必须存在
const pkgname = (app as Record<string, unknown>).pkgname as string; const pkgname = (app as Record<string, unknown>).pkgname as string;
if (!pkgname) { if (!pkgname) {
@@ -389,10 +389,40 @@ const openDetail = (app: App | Record<string, unknown>) => {
} as App; } as App;
} }
// 后续逻辑使用 fullApp // 合并应用:先检查 Spark/APM 安装状态,已安装的版本优先展示
if (fullApp.isMerged && (fullApp.sparkApp || fullApp.apmApp)) {
const [sparkInstalled, apmInstalled] = await Promise.all([
fullApp.sparkApp
? window.ipcRenderer.invoke("check-installed", {
pkgname: fullApp.sparkApp.pkgname,
origin: "spark",
}) as Promise<boolean>
: Promise.resolve(false),
fullApp.apmApp
? window.ipcRenderer.invoke("check-installed", {
pkgname: fullApp.apmApp.pkgname,
origin: "apm",
}) as Promise<boolean>
: Promise.resolve(false),
]);
if (sparkInstalled && !apmInstalled) {
fullApp.viewingOrigin = "spark";
} else if (apmInstalled && !sparkInstalled) {
fullApp.viewingOrigin = "apm";
}
// 若都安装或都未安装,不设置 viewingOrigin由模态框默认展示 spark
}
const displayAppForScreenshots =
fullApp.viewingOrigin !== undefined && fullApp.isMerged
? (fullApp.viewingOrigin === "spark"
? fullApp.sparkApp
: fullApp.apmApp) ?? fullApp
: fullApp;
currentApp.value = fullApp; currentApp.value = fullApp;
currentScreenIndex.value = 0; currentScreenIndex.value = 0;
loadScreenshots(fullApp); loadScreenshots(displayAppForScreenshots);
showModal.value = true; showModal.value = true;
currentAppSparkInstalled.value = false; currentAppSparkInstalled.value = false;
@@ -891,10 +921,7 @@ const loadCategories = async () => {
for (const mode of modes) { for (const mode of modes) {
const finalArch = mode === "spark" ? `${arch}-store` : `${arch}-apm`; const finalArch = mode === "spark" ? `${arch}-store` : `${arch}-apm`;
const path = const path = `/${finalArch}/categories.json`;
mode === "spark"
? "/store/categories.json"
: `/${finalArch}/categories.json`;
try { try {
const response = await axiosInstance.get(cacheBuster(path)); const response = await axiosInstance.get(cacheBuster(path));
@@ -943,10 +970,7 @@ const loadApps = async (onFirstBatch?: () => void) => {
const finalArch = const finalArch =
mode === "spark" ? `${arch}-store` : `${arch}-apm`; mode === "spark" ? `${arch}-store` : `${arch}-apm`;
const path = const path = `/${finalArch}/${category}/applist.json`;
mode === "spark"
? `/store/${category}/applist.json`
: `/${finalArch}/${category}/applist.json`;
logger.info(`加载分类: ${category} (来源: ${mode})`); logger.info(`加载分类: ${category} (来源: ${mode})`);
const categoryApps = await fetchWithRetry<AppJson[]>( const categoryApps = await fetchWithRetry<AppJson[]>(

View File

@@ -298,7 +298,9 @@ watch(
isIconLoaded.value = false; isIconLoaded.value = false;
if (newApp) { if (newApp) {
if (newApp.isMerged) { if (newApp.isMerged) {
viewingOrigin.value = newApp.sparkApp ? "spark" : "apm"; // 若父组件已根据安装状态设置了优先展示的版本,则使用;否则默认 Spark
viewingOrigin.value =
newApp.viewingOrigin ?? (newApp.sparkApp ? "spark" : "apm");
} else { } else {
viewingOrigin.value = newApp.origin; viewingOrigin.value = newApp.origin;
} }