mirror of
https://github.com/Zagrios/bs-manager.git
synced 2026-07-03 14:08:25 +02:00
78 lines
3.3 KiB
TypeScript
78 lines
3.3 KiB
TypeScript
import { useEffect, useState } from "react";
|
|
import { BsmProgressBar } from "renderer/components/progress-bar/bsm-progress-bar.component";
|
|
import { BsmImage } from "renderer/components/shared/bsm-image.component";
|
|
import TitleBar from "renderer/components/title-bar/title-bar.component";
|
|
import { useTranslation } from "renderer/hooks/use-translation.hook";
|
|
import { IpcService } from "renderer/services/ipc.service";
|
|
import { NotificationService } from "renderer/services/notification.service";
|
|
import { ProgressBarService } from "renderer/services/progress-bar.service";
|
|
import { ModelSaberService } from "renderer/services/thrird-partys/model-saber.service";
|
|
import { MSModel } from "shared/models/models/model-saber.model";
|
|
import defaultImage from "../../../../assets/images/default-version-img.jpg";
|
|
import { ModelsDownloaderService } from "renderer/services/models-management/models-downloader.service";
|
|
import { useService } from "renderer/hooks/use-service.hook";
|
|
import { lastValueFrom } from "rxjs";
|
|
|
|
export default function OneClickDownloadModel() {
|
|
|
|
const ipc = useService(IpcService);
|
|
const modelSaber = useService(ModelSaberService);
|
|
const progress = useService(ProgressBarService);
|
|
const modelDownloader = useService(ModelsDownloaderService);
|
|
const notification = useService(NotificationService);
|
|
|
|
const [model, setModel] = useState<MSModel>(null);
|
|
const t = useTranslation();
|
|
|
|
const cover = model ? model.thumbnail : null;
|
|
const title = model ? model.name : null;
|
|
|
|
useEffect(() => {
|
|
|
|
const promise = (async () => {
|
|
const infos = await lastValueFrom(ipc.sendV2<{ id: string; type: string }>("one-click-model-info"));
|
|
|
|
const model = await modelSaber.getModelById(infos.id);
|
|
|
|
if (!model) {
|
|
throw new Error("Failed to get model from ModelSaber");
|
|
}
|
|
|
|
setModel(() => model);
|
|
|
|
progress.open();
|
|
|
|
const res = await modelDownloader.oneClickInstallModel(model);
|
|
|
|
if (!res) {
|
|
throw new Error("Failed to download model");
|
|
}
|
|
})();
|
|
|
|
promise.catch(() => {
|
|
notification.notifySystem({ title: t("notifications.types.error"), body: t("notifications.models.one-click-install.error") });
|
|
});
|
|
|
|
promise.then(() => {
|
|
notification.notifySystem({ title: "OneClick", body: t("notifications.models.one-click-install.success") });
|
|
});
|
|
|
|
promise.finally(() => {
|
|
window.electron.window.close();
|
|
});
|
|
|
|
}, []);
|
|
|
|
return (
|
|
<div className="relative w-screen h-screen overflow-hidden">
|
|
{cover && <BsmImage className="absolute top-0 left-0 w-full h-full object-cover" image={cover} />}
|
|
<div className="w-full h-full backdrop-brightness-50 backdrop-blur-md flex flex-col justify-start items-center gap-10">
|
|
<TitleBar template="oneclick-download-model.html" />
|
|
<BsmImage className="aspect-[1/1] w-1/2 object-cover rounded-md shadow-black shadow-lg" placeholder={defaultImage} image={cover} errorImage={defaultImage} />
|
|
<h1 className="overflow-hidden font-bold italic text-xl text-gray-200 tracking-wide w-full text-center whitespace-nowrap text-ellipsis px-2">{title}</h1>
|
|
</div>
|
|
<BsmProgressBar />
|
|
</div>
|
|
);
|
|
}
|