mirror of
https://github.com/Zagrios/bs-manager.git
synced 2026-07-03 14:08:25 +02:00
Merge branch 'v1.5.0' into feature/playlists/107
This commit is contained in:
@@ -3,25 +3,27 @@ import { BsmProgressBar } from "renderer/components/progress-bar/bsm-progress-ba
|
||||
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 { MapsDownloaderService } from "renderer/services/maps-downloader.service";
|
||||
import { NotificationService } from "renderer/services/notification.service";
|
||||
import { ProgressBarService } from "renderer/services/progress-bar.service";
|
||||
import { BeatSaverService } from "renderer/services/thrird-partys/beat-saver.service";
|
||||
import { lastValueFrom } from "rxjs";
|
||||
import { BsvMapDetail } from "shared/models/maps";
|
||||
import defaultImage from "../../../../assets/images/default-version-img.jpg";
|
||||
import { useService } from "renderer/hooks/use-service.hook";
|
||||
import { useWindowArgs } from "renderer/hooks/use-window-args.hook";
|
||||
import { useWindowControls } from "renderer/hooks/use-window-controls.hook";
|
||||
|
||||
export default function OneClickDownloadMap() {
|
||||
|
||||
const ipc = useService(IpcService);
|
||||
|
||||
const bsv = useService(BeatSaverService);
|
||||
const mapsDownloader = useService(MapsDownloaderService);
|
||||
const progressBar = useService(ProgressBarService);
|
||||
const notification = useService(NotificationService);
|
||||
|
||||
const { close: closeWindow } = useWindowControls();
|
||||
const { mapId, isHash } = useWindowArgs("mapId", "isHash");
|
||||
const [mapInfo, setMapInfo] = useState<BsvMapDetail>(null);
|
||||
|
||||
const t = useTranslation();
|
||||
|
||||
const cover = mapInfo ? mapInfo.versions.at(0).coverURL : null;
|
||||
@@ -31,14 +33,16 @@ export default function OneClickDownloadMap() {
|
||||
|
||||
progressBar.open();
|
||||
|
||||
const promise = (async () => {
|
||||
const ipcRes = await lastValueFrom(ipc.sendV2<{ id: string; isHash: boolean }>("one-click-map-info"));
|
||||
console.log("AAAA", mapId, isHash);
|
||||
|
||||
const mapDetails = ipcRes.isHash ? (await bsv.getMapDetailsFromHashs([ipcRes.id])).at(0) : await bsv.getMapDetailsById(ipcRes.id);
|
||||
const promise = (async () => {
|
||||
|
||||
const mapDetails = isHash === "true" ? (await bsv.getMapDetailsFromHashs([mapId])).at(0) : await bsv.getMapDetailsById(mapId);
|
||||
console.log(mapDetails);
|
||||
|
||||
setMapInfo(() => mapDetails);
|
||||
|
||||
const res = await mapsDownloader.oneClickInstallMap(mapDetails);
|
||||
|
||||
const res = await mapsDownloader.oneClickInstallMap(mapDetails).then(() => true).catch(() => false);
|
||||
|
||||
progressBar.complete();
|
||||
|
||||
@@ -57,9 +61,9 @@ export default function OneClickDownloadMap() {
|
||||
});
|
||||
|
||||
promise.finally(() => {
|
||||
window.electron.window.close();
|
||||
closeWindow();
|
||||
});
|
||||
|
||||
|
||||
}, []);
|
||||
|
||||
return (
|
||||
|
||||
@@ -3,7 +3,6 @@ import { BsmProgressBar } from "renderer/components/progress-bar/bsm-progress-ba
|
||||
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";
|
||||
@@ -11,16 +10,18 @@ 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";
|
||||
import { useWindowArgs } from "renderer/hooks/use-window-args.hook";
|
||||
import { useWindowControls } from "renderer/hooks/use-window-controls.hook";
|
||||
|
||||
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 { close: closeWindow } = useWindowControls();
|
||||
const { modelId } = useWindowArgs("modelId");
|
||||
const [model, setModel] = useState<MSModel>(null);
|
||||
const t = useTranslation();
|
||||
|
||||
@@ -30,9 +31,8 @@ export default function OneClickDownloadModel() {
|
||||
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);
|
||||
const model = await modelSaber.getModelById(modelId);
|
||||
|
||||
if (!model) {
|
||||
throw new Error("Failed to get model from ModelSaber");
|
||||
@@ -58,7 +58,7 @@ export default function OneClickDownloadModel() {
|
||||
});
|
||||
|
||||
promise.finally(() => {
|
||||
window.electron.window.close();
|
||||
closeWindow();
|
||||
});
|
||||
|
||||
}, []);
|
||||
|
||||
@@ -13,16 +13,19 @@ import { useService } from "renderer/hooks/use-service.hook";
|
||||
import { useConstant } from "renderer/hooks/use-constant.hook";
|
||||
import { BPList } from "shared/models/playlists/playlist.interface";
|
||||
import { useOnUpdate } from "renderer/hooks/use-on-update.hook";
|
||||
import { useWindowArgs } from "renderer/hooks/use-window-args.hook";
|
||||
import { useWindowControls } from "renderer/hooks/use-window-controls.hook";
|
||||
|
||||
export default function OneClickDownloadPlaylist() {
|
||||
|
||||
|
||||
|
||||
const t = useTranslation();
|
||||
const playlistDownloader = useService(PlaylistDownloaderService);
|
||||
const notification = useService(NotificationService);
|
||||
|
||||
|
||||
const { close: closeWindow } = useWindowControls();
|
||||
const mapsContainer = useRef<HTMLDivElement>(null);
|
||||
const playlistUrl = useConstant(() => new URLSearchParams(window.location.search).get("playlistUrl"));
|
||||
const { playlistUrl } = useWindowArgs("playlistUrl");
|
||||
const download$ = useConstant(() => playlistDownloader.oneClickInstallPlaylist(playlistUrl));
|
||||
const playlistInfos = useObservable<BPList>(() => download$.pipe(filter(progress => !!progress.data?.playlistInfos), map(progress => progress.data.playlistInfos), take(1)));
|
||||
const downloadedMaps = useObservable(() => download$.pipe(filter(progress => !!progress.data?.downloadedMaps), map(progress => progress.data.downloadedMaps)));
|
||||
@@ -34,7 +37,7 @@ export default function OneClickDownloadPlaylist() {
|
||||
}).catch(() => {
|
||||
notification.notifySystem({ title: t("notifications.types.error"), body: t("notifications.playlists.one-click-install.error") });
|
||||
}).finally(() => {
|
||||
window.electron.window.close();
|
||||
closeWindow();
|
||||
});
|
||||
|
||||
}, []);
|
||||
@@ -61,7 +64,7 @@ export default function OneClickDownloadPlaylist() {
|
||||
<BsmImage className="mt-2 aspect-square w-1/2 object-cover rounded-md shadow-black shadow-lg" placeholder={defaultImage} image={playlistImage()} errorImage={defaultImage} />
|
||||
<h1 className="mt-4 overflow-hidden font-bold italic text-xl text-gray-200 tracking-wide w-full text-center whitespace-nowrap text-ellipsis px-2">{playlistInfos?.playlistTitle}</h1>
|
||||
<div className="w-full py-3 flex items-center justify-center max-w-full overflow-x-scroll overflow-y-hidden scrollbar scrollbar-thin scrollbar-track-transparent scrollbar-thumb-neutral-900" ref={mapsContainer}>
|
||||
<div className="flex justify-start items-start gap-2.5">{downloadedMaps?.map(map => map?.coverUrl &&
|
||||
<div className="flex justify-start items-start gap-2.5">{downloadedMaps?.map(map => map?.coverUrl &&
|
||||
<motion.img layout="position" key={map.hash} className="block aspect-square w-14 object-cover rounded-md shadow-black shadow-md" src={map?.coverUrl} initial={{ scale: 0 }} animate={{ scale: 1 }} whileHover={{ rotate: 5 }} />
|
||||
)}</div>
|
||||
</div>
|
||||
|
||||
@@ -13,20 +13,22 @@ import { BsNoteFill } from "renderer/components/svgs/icons/bs-note-fill.componen
|
||||
import { useThemeColor } from "renderer/hooks/use-theme-color.hook";
|
||||
import { BsmButton } from "renderer/components/shared/bsm-button.component";
|
||||
import { motion } from "framer-motion"
|
||||
import { BSLaunchError, BSLaunchEventType, LaunchOption } from "shared/models/bs-launch";
|
||||
import { BSLaunchError, BSLaunchEventType } from "shared/models/bs-launch";
|
||||
import { NotificationService } from "renderer/services/notification.service";
|
||||
import { useTranslation } from "renderer/hooks/use-translation.hook";
|
||||
import { useWindowControls } from "renderer/hooks/use-window-controls.hook";
|
||||
|
||||
export default function ShortcutLaunch() {
|
||||
|
||||
|
||||
const windows = useService(WindowManagerService);
|
||||
const ipc = useService(IpcService);
|
||||
const bsLauncher = useService(BSLauncherService);
|
||||
const notification = useService(NotificationService);
|
||||
|
||||
const { close: closeWindow } = useWindowControls();
|
||||
const t = useTranslation();
|
||||
const color = useThemeColor("second-color");
|
||||
const launchOptions = useObservable(() => ipc.sendV2<LaunchOption>("shortcut-launch-options").pipe(take(1)), null)
|
||||
const launchOptions = useObservable(() => ipc.sendV2("shortcut-launch-options").pipe(take(1)), null)
|
||||
const [rotation, setRotation] = useState(0);
|
||||
const [status, setStatus] = useState<BSLaunchEventType>();
|
||||
|
||||
@@ -57,7 +59,7 @@ export default function ShortcutLaunch() {
|
||||
});
|
||||
|
||||
sub.add(() => {
|
||||
window.electron.window.close();
|
||||
closeWindow();
|
||||
});
|
||||
|
||||
return () => sub.unsubscribe();
|
||||
|
||||
Reference in New Issue
Block a user