feat: 修改应用信息界面,对于已安装应用,安装按钮变为打开按钮,并添加卸载按钮

This commit is contained in:
2026-02-27 23:03:10 +08:00
parent 3a9c9dda22
commit 6ea628d869
4 changed files with 42 additions and 26 deletions

View File

@@ -412,27 +412,41 @@ ipcMain.handle("check-installed", async (_event, pkgname: string) => {
const checkScript = "/opt/spark-store/extras/check-is-installed"; const checkScript = "/opt/spark-store/extras/check-is-installed";
let isInstalled = false; let isInstalled = false;
const child = spawn(checkScript, [pkgname], { // 首先尝试使用内置脚本
shell: false, if (fs.existsSync(checkScript)) {
env: process.env, const child = spawn(checkScript, [pkgname], {
}); shell: false,
env: process.env,
await new Promise<void>((resolve) => {
child.on("error", (err) => {
logger.error(`check-installed 执行失败: ${err?.message || err}`);
resolve();
}); });
child.on("close", (code) => { await new Promise<void>((resolve) => {
if (code === 0) { child.on("error", (err) => {
isInstalled = true; logger.error(`check-installed 脚本执行失败: ${err?.message || err}`);
logger.info(`应用已安装: ${pkgname}`); resolve();
} else { });
logger.info(`应用未安装: ${pkgname} (exit ${code})`);
} child.on("close", (code) => {
resolve(); if (code === 0) {
isInstalled = true;
logger.info(`应用已安装 (脚本检测): ${pkgname}`);
}
resolve();
});
}); });
});
if (isInstalled) return true;
}
// 如果脚本不存在或检测不到,使用 dpkg-query 作为后备
logger.info(`尝试使用 dpkg-query 检测: ${pkgname}`);
const { code } = await runCommandCapture("dpkg-query", ["-W", "-f='${Status}'", pkgname]);
if (code === 0) {
isInstalled = true;
logger.info(`应用已安装 (dpkg-query 检测): ${pkgname}`);
} else {
logger.info(`应用未安装: ${pkgname}`);
}
return isInstalled; return isInstalled;
}); });
@@ -456,7 +470,7 @@ ipcMain.on("remove-installed", async (_event, pkgname: string) => {
} }
const child = spawn( const child = spawn(
execCommand, execCommand,
[...execParams, "aptss", "remove", pkgname ], [...execParams, "aptss", "remove", pkgname],
{ {
shell: true, shell: true,
env: process.env, env: process.env,
@@ -579,8 +593,8 @@ ipcMain.handle("launch-app", async (_event, pkgname: string) => {
logger.warn("No pkgname provided for launch-app"); logger.warn("No pkgname provided for launch-app");
} }
const execCommand = "/opt/spark-store/extras/host-spawn"; const execCommand = "/opt/spark-store/extras/app-launcher";
const execParams = ["/opt/spark-store/extras/app-launcher", "launch", pkgname]; const execParams = ["start", pkgname];
logger.info( logger.info(
`Launching app: ${pkgname} with command: ${execCommand} ${execParams.join(" ")}`, `Launching app: ${pkgname} with command: ${execCommand} ${execParams.join(" ")}`,

View File

@@ -633,8 +633,8 @@ const onUninstallSuccess = () => {
} }
}; };
const installCompleteCallback = () => { const installCompleteCallback = (pkgname?: string) => {
if (currentApp.value) { if (currentApp.value && (!pkgname || currentApp.value.pkgname === pkgname)) {
checkAppInstalled(currentApp.value); checkAppInstalled(currentApp.value);
} }
}; };

View File

@@ -236,8 +236,10 @@ const activeDownload = computed(() => {
const { installFeedback } = useInstallFeedback(appPkgname); const { installFeedback } = useInstallFeedback(appPkgname);
const { isCompleted } = useDownloadItemStatus(appPkgname); const { isCompleted } = useDownloadItemStatus(appPkgname);
const installBtnText = computed(() => { const installBtnText = computed(() => {
if (props.isinstalled) {
return "已安装";
}
if (isCompleted.value) { if (isCompleted.value) {
// TODO: 似乎有一个时间差,安装好了之后并不是立马就可以从已安装列表看见
return "已安装"; return "已安装";
} }
if (installFeedback.value) { if (installFeedback.value) {

View File

@@ -12,7 +12,7 @@ export function removeDownloadItem(pkgname: string) {
} }
} }
export function watchDownloadsChange(cb: () => void) { export function watchDownloadsChange(cb: (pkgname: string) => void) {
const statusById = new Map<number, DownloadItemStatus>(); const statusById = new Map<number, DownloadItemStatus>();
for (const item of downloads.value) { for (const item of downloads.value) {
@@ -25,7 +25,7 @@ export function watchDownloadsChange(cb: () => void) {
for (const item of list) { for (const item of list) {
const prevStatus = statusById.get(item.id); const prevStatus = statusById.get(item.id);
if (item.status === "completed" && prevStatus !== "completed") { if (item.status === "completed" && prevStatus !== "completed") {
cb(); cb(item.pkgname);
} }
statusById.set(item.id, item.status); statusById.set(item.id, item.status);
} }