Files
spark-store/src/modules/processInstall.ts
2026-02-12 19:21:17 +08:00

136 lines
4.0 KiB
TypeScript

// window.ipcRenderer.on('main-process-message', (_event, ...args) => {
// console.log('[Receive Main-process message]:', ...args)
// })
import pino from "pino";
import { currentApp, currentAppIsInstalled } from "../global/storeConfig";
import { APM_STORE_BASE_URL } from "../global/storeConfig";
import { downloads } from "../global/downloadStatus";
import {
InstallLog,
DownloadItem,
DownloadResult,
App,
DownloadItemStatus,
} from "../global/typedefinition";
let downloadIdCounter = 0;
const logger = pino({ name: "processInstall.ts" });
export const handleInstall = () => {
if (!currentApp.value?.pkgname) return;
if (downloads.value.find((d) => d.pkgname === currentApp.value?.pkgname)) {
logger.info(`任务已存在,忽略重复添加: ${currentApp.value.pkgname}`);
return;
}
downloadIdCounter += 1;
// 创建下载任务
const download: DownloadItem = {
id: downloadIdCounter,
name: currentApp.value.name,
pkgname: currentApp.value.pkgname,
version: currentApp.value.version,
icon: `${APM_STORE_BASE_URL}/${window.apm_store.arch}/${currentApp.value.category}/${currentApp.value.pkgname}/icon.png`,
status: "queued",
progress: 0,
downloadedSize: 0,
totalSize: 0,
speed: 0,
timeRemaining: 0,
startTime: Date.now(),
logs: [{ time: Date.now(), message: "开始下载..." }],
source: "APM Store",
retry: false,
};
downloads.value.push(download);
// Send to main process to start download
window.ipcRenderer.send("queue-install", JSON.stringify(download));
// const encodedPkg = encodeURIComponent(currentApp.value.Pkgname);
// openApmStoreUrl(`apmstore://install?pkg=${encodedPkg}`, {
// fallbackText: `/usr/bin/apm-installer --install ${currentApp.value.Pkgname}`
// });
};
export const handleRetry = (download_: DownloadItem) => {
if (!download_?.pkgname) return;
download_.retry = true;
// Send to main process to start download
window.ipcRenderer.send("queue-install", JSON.stringify(download_));
};
export const handleUpgrade = (app: App) => {
if (!app.pkgname) return;
if (downloads.value.find((d) => d.pkgname === app.pkgname)) {
logger.info(`任务已存在,忽略重复添加: ${app.pkgname}`);
return;
}
downloadIdCounter += 1;
const download: DownloadItem = {
id: downloadIdCounter,
name: app.name,
pkgname: app.pkgname,
version: app.version,
icon: `${APM_STORE_BASE_URL}/${window.apm_store.arch}/${app.category}/${app.pkgname}/icon.png`,
status: "queued",
progress: 0,
downloadedSize: 0,
totalSize: 0,
speed: 0,
timeRemaining: 0,
startTime: Date.now(),
logs: [{ time: Date.now(), message: "开始更新..." }],
source: "APM Update",
retry: false,
upgradeOnly: true,
};
downloads.value.push(download);
window.ipcRenderer.send("queue-install", JSON.stringify(download));
};
export const handleRemove = () => {
if (!currentApp.value?.pkgname) return;
window.ipcRenderer.send("remove-installed", currentApp.value.pkgname);
};
window.ipcRenderer.on("remove-complete", (_event, log: DownloadResult) => {
if (log.success) {
currentAppIsInstalled.value = false;
} else {
currentAppIsInstalled.value = true;
console.error("卸载失败:", log.message);
}
});
window.ipcRenderer.on("install-status", (_event, log: InstallLog) => {
const downloadObj = downloads.value.find((d) => d.id === log.id);
if (downloadObj) downloadObj.status = log.message as DownloadItemStatus;
});
window.ipcRenderer.on("install-log", (_event, log: InstallLog) => {
const downloadObj = downloads.value.find((d) => d.id === log.id);
if (downloadObj)
downloadObj.logs.push({
time: log.time,
message: log.message,
});
});
window.ipcRenderer.on("install-complete", (_event, log: DownloadResult) => {
const downloadObj = downloads.value.find((d) => d.id === log.id);
if (downloadObj) {
if (log.success) {
downloadObj.status = "completed";
} else {
downloadObj.status = "failed";
}
}
});