mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-04-26 09:20:18 +08:00
feat: 修改应用信息界面,对于已安装应用,安装按钮变为打开按钮,并添加卸载按钮
This commit is contained in:
@@ -412,6 +412,8 @@ 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;
|
||||||
|
|
||||||
|
// 首先尝试使用内置脚本
|
||||||
|
if (fs.existsSync(checkScript)) {
|
||||||
const child = spawn(checkScript, [pkgname], {
|
const child = spawn(checkScript, [pkgname], {
|
||||||
shell: false,
|
shell: false,
|
||||||
env: process.env,
|
env: process.env,
|
||||||
@@ -419,21 +421,33 @@ ipcMain.handle("check-installed", async (_event, pkgname: string) => {
|
|||||||
|
|
||||||
await new Promise<void>((resolve) => {
|
await new Promise<void>((resolve) => {
|
||||||
child.on("error", (err) => {
|
child.on("error", (err) => {
|
||||||
logger.error(`check-installed 执行失败: ${err?.message || err}`);
|
logger.error(`check-installed 脚本执行失败: ${err?.message || err}`);
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
|
|
||||||
child.on("close", (code) => {
|
child.on("close", (code) => {
|
||||||
if (code === 0) {
|
if (code === 0) {
|
||||||
isInstalled = true;
|
isInstalled = true;
|
||||||
logger.info(`应用已安装: ${pkgname}`);
|
logger.info(`应用已安装 (脚本检测): ${pkgname}`);
|
||||||
} else {
|
|
||||||
logger.info(`应用未安装: ${pkgname} (exit ${code})`);
|
|
||||||
}
|
}
|
||||||
resolve();
|
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;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -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(" ")}`,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user