([]));
const [itemPerRow, setItemPerRow] = useState(2);
const [listHeight, setListHeight] = useState(0);
+ const [loadPercent$] = useState(new BehaviorSubject(0));
+
useImperativeHandle(forwardRef ,()=>({
deleteMaps(){
- const mapsToDelete = selectedMaps$.value.length === 0 ? maps : selectedMaps$.value
- mapsManager.deleteMaps(mapsToDelete, version).then(res => res && removeMapsFromList(mapsToDelete));
+ const mapsToDelete = selectedMaps$.value.length === 0 ? maps : selectedMaps$.value;
+ mapsManager.deleteMaps(mapsToDelete, version).then(res => {
+ if(!res){ return; }
+ removeMapsFromList(mapsToDelete);
+ selectedMaps$.next([]);
+ });
},
exportMaps(){
- mapsManager.exportMaps(version, selectedMaps$.value)
+ mapsManager.exportMaps(version, selectedMaps$.value);
+ },
+ getMaps(){
+ return maps;
}
}), [selectedMaps$.value, maps, version]);
@@ -47,13 +67,17 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc
loadMaps();
subs.push(mapsManager.versionLinked$.subscribe(loadMaps));
subs.push(mapsManager.versionUnlinked$.subscribe(loadMaps));
- mapsDownloader.addOnMapDownloadedListener(loadMaps);
+ mapsDownloader.addOnMapDownloadedListener((map, targerVersion) => {
+ if(targerVersion !== version){ return; }
+ setMaps(maps => maps ? [map, ...maps] : [map]);
+ });
}
return () => {
setMaps(() => null);
+ loadPercent$.next(0);
subs.forEach(s => s.unsubscribe());
- mapsDownloader.removeOnMapDownloadedListene(loadMaps);
+ mapsDownloader.removeOnMapDownloadedListener(loadMaps);
}
}, [isVisible, version]);
@@ -86,7 +110,32 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc
}, [isVisible, itemPerRow])
const loadMaps = () => {
- subs.push(mapsManager.getMaps(version).subscribe(localMaps => setMaps(() => [...localMaps])));
+
+ setMaps(() => null);
+ loadPercent$.next(0);
+
+ const loadMapsObs$ = mapsManager.getMaps(version);
+
+ loadMapsObs$.pipe(map(progess => {
+ console.log(progess);
+ return Math.floor(((progess.loaded / progess.total) * 100));
+ })).subscribe(percent => loadPercent$.next(percent));
+
+ subs.push(loadMapsObs$.pipe(
+ last(),
+ mergeMap(async progress => {
+ if(os.isOffline){ return progress.maps; }
+ const maps = progress.maps;
+ const details = await bsaver.getMapDetailsFromHashs(maps.map(map => map.hash));
+ return maps.map(map => {
+ map.bsaverInfo = details.find(d => d.versions.at(0).hash === map.hash);
+ return map;
+ })
+ })
+ ).subscribe({
+ next: maps => setMaps(() => maps),
+ complete: () => loadPercent$.next(0)
+ }));
}
const removeMapsFromList = (mapsToRemove: BsmLocalMap[]) => {
@@ -100,8 +149,6 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc
const onMapSelected = useCallback((map: BsmLocalMap) => {
- console.log(map);
-
const mapsCopy = [...selectedMaps$.value];
if(mapsCopy.some(selectedMap => selectedMap.hash === map.hash)){
const i = mapsCopy.findIndex(selectedMap => selectedMap.hash === map.hash);
@@ -111,12 +158,9 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc
mapsCopy.push(map);
}
- console.log(mapsCopy);
-
selectedMaps$.next(mapsCopy);
- }, [selectedMaps$.value]);
- console.log(selectedMaps$.value);
+ }, [selectedMaps$.value]);
const isMapFitFilter = (map: BsmLocalMap): boolean => {
@@ -257,6 +301,30 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc
return res;
})();
+ if(!maps){
+ return (
+
+
+
+ {t("modals.download-maps.loading-maps")}
+
+
+
+ );
+ }
+
+ if(!maps.length){
+ return (
+
+
+
+ {t("pages.version-viewer.maps.tabs.maps.empty-maps.text")}
+ {e.preventDefault(); mapsDownloader.openDownloadMapModal(version)}}/>
+
+
+ );
+ }
+
return (
108} itemCount={preppedMaps.length} itemData={preppedMaps} layout="vertical" style={{scrollbarGutter: "stable both-edges"}} itemKey={(i, data) => data[i].map(map => map.hash).join()}>
diff --git a/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx b/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx
index 6606288c..3e5e1484 100644
--- a/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx
+++ b/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx
@@ -59,7 +59,7 @@ export function MapsPlaylistsPanel({version}: Props) {
}
const handleMapsAddClick = () => {
- mapsDownloader.openDownloadMapModal(version);
+ mapsDownloader.openDownloadMapModal(version, mapsRef.current.getMaps?.());
}
const renderTab = (props: DetailedHTMLProps, HTMLLIElement>, text: string, index: number): JSX.Element => {
diff --git a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx
index 911310b1..b7c831cf 100644
--- a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx
+++ b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx
@@ -19,11 +19,11 @@ import equal from "fast-deep-equal/es6";
import { ProgressBarService } from "renderer/services/progress-bar.service";
import { useTranslation } from "renderer/hooks/use-translation.hook";
import { OsDiagnosticService } from "renderer/services/os-diagnostic.service";
+import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface";
-export const DownloadMapsModal: ModalComponent = ({data}) => {
+export const DownloadMapsModal: ModalComponent = ({resolver, data: { ownedMaps, version }}) => {
const beatSaver = BeatSaverService.getInstance();
- const mapsManager = MapsManagerService.getInstance();
const mapsDownloader = MapsDownloaderService.getInstance();
const progressBar = ProgressBarService.getInstance();
const os = OsDiagnosticService.getInstance();
@@ -36,7 +36,7 @@ export const DownloadMapsModal: ModalComponent = ({data}) => {
const [query, setQuery] = useState("");
const [maps, setMaps] = useState([]);
const [sortOrder, setSortOrder] = useState(BSV_SORT_ORDER.at(0));
- const [ownedMapHashs, setOwnedMapHashs] = useState([]);
+ const [ownedMapHashs, setOwnedMapHashs] = useState(ownedMaps?.map(map => map.hash) ?? []);
const [loading, setLoading] = useState(false);
const isOnline = useObservable(os.isOnline$);
const [searchParams, setSearchParams] = useState({
@@ -58,13 +58,12 @@ export const DownloadMapsModal: ModalComponent = ({data}) => {
useEffect(() => {
- mapsManager.getMaps(data, false).toPromise().then(maps => setOwnedMapHashs(maps.map(map => map.hash)));
-
- const onMapDownloaded = (map: BsvMapDetail, verion: BSVersion) => {
- if(!equal(verion, data) || !map?.versions){ return; }
- const downloadedHash = map.versions.at(0).hash;
+ const onMapDownloaded = (map: BsmLocalMap, targerVersion: BSVersion) => {
+ if(!equal(targerVersion, version)){ return; }
+ const downloadedHash = map.hash;
setOwnedMapHashs((prev) => [...prev, downloadedHash]);
}
+
mapsDownloader.addOnMapDownloadedListener(onMapDownloaded);
if(mapsDownloader.isDownloading){
@@ -72,7 +71,7 @@ export const DownloadMapsModal: ModalComponent = ({data}) => {
}
return () => {
- mapsDownloader.removeOnMapDownloadedListene(onMapDownloaded);
+ mapsDownloader.removeOnMapDownloadedListener(onMapDownloaded);
progressBar.setStyle(null);
}
}, [])
@@ -99,7 +98,7 @@ export const DownloadMapsModal: ModalComponent = ({data}) => {
const isMapOwned = map.versions.some(version => ownedMapHashs.includes(version.hash));
const isDownloading = map.id === currentDownload?.map?.id;
- const inQueue = mapsInQueue.some(toDownload => equal(toDownload.version, data) && toDownload.map.id === map.id);
+ const inQueue = mapsInQueue.some(toDownload => equal(toDownload.version, version) && toDownload.map.id === map.id);
return (
= ({data}) => {
}
const handleDownloadMap = useCallback((map: BsvMapDetail) => {
- mapsDownloader.addMapToDownload({map, version: data})
+ mapsDownloader.addMapToDownload({map, version})
}, []);
const handleCancelDownload = useCallback((map: BsvMapDetail) => {
- mapsDownloader.removeMapToDownload({map, version: data});
+ mapsDownloader.removeMapToDownload({map, version});
}, []);
const handleSortChange = (newSort: string) => {
@@ -170,7 +169,7 @@ export const DownloadMapsModal: ModalComponent = ({data}) => {
{e.preventDefault(); handleSearch()}}/>
-
+
{maps.length === 0 ? (

diff --git a/src/renderer/components/progress-bar/text-progress-bar.component.tsx b/src/renderer/components/progress-bar/text-progress-bar.component.tsx
new file mode 100644
index 00000000..87d996ef
--- /dev/null
+++ b/src/renderer/components/progress-bar/text-progress-bar.component.tsx
@@ -0,0 +1,20 @@
+import { CSSProperties } from "react";
+import { useObservable } from "renderer/hooks/use-observable.hook";
+import { Observable } from "rxjs"
+
+type Props = {
+ value$: Observable
,
+ className?: string,
+ style?: CSSProperties
+}
+
+export default function TextProgressBar({value$, className, style}: Props) {
+
+ const value = useObservable(value$);
+
+ const prefix = typeof value === "number" ? "%" : "";
+
+ return (
+ {`${value}${prefix}`}
+ )
+}
diff --git a/src/renderer/components/shared/bsm-image.component.tsx b/src/renderer/components/shared/bsm-image.component.tsx
index 3fc99e5d..038cdbb6 100644
--- a/src/renderer/components/shared/bsm-image.component.tsx
+++ b/src/renderer/components/shared/bsm-image.component.tsx
@@ -37,6 +37,6 @@ export const BsmImage = forwardRef(({className, image, errorImage, placeholder,
return (
// @ts-ignore
-
onClick?.(e)} alt=" "/>
+
onClick?.(e)} alt=" " decoding="async"/>
)
})
diff --git a/src/renderer/preload.d.ts b/src/renderer/preload.d.ts
index b8b7e9d0..bce2f371 100644
--- a/src/renderer/preload.d.ts
+++ b/src/renderer/preload.d.ts
@@ -1,15 +1,16 @@
-import { Channels, ReplyChannels } from 'main/preload';
+import { IpcChannel } from "shared/models/ipc/ipc-response.interface";
declare global {
interface Window {
electron: {
ipcRenderer: {
- sendMessage(channel: Channels, args: any): void;
+ sendMessage(channel: IpcChannel, args: any): void;
on(
- channel: ReplyChannels,
+ channel: IpcChannel,
func: (...args: any) => void
): (() => void) | undefined;
- once(channel: ReplyChannels, func: (...args: any) => void): void;
+ once(channel: IpcChannel, func: (...args: any) => void): void;
+ removeAllListeners(channel: IpcChannel): void;
};
};
}
diff --git a/src/renderer/services/ipc.service.ts b/src/renderer/services/ipc.service.ts
index f8bbe1b1..2f9ee7c1 100644
--- a/src/renderer/services/ipc.service.ts
+++ b/src/renderer/services/ipc.service.ts
@@ -1,5 +1,7 @@
+import { defaultIfEmpty } from "rxjs/operators";
import { Observable } from "rxjs";
import { IpcRequest, IpcResponse } from "shared/models/ipc";
+import { identity } from "rxjs";
export class IpcService {
@@ -47,4 +49,30 @@ export class IpcService {
return obs;
}
+ // TODO : Convert all IPCs calls to V2
+
+ public sendV2(channel: string, request?: IpcRequest, defaultValue?: T): Observable{
+ if(!request){ request = {args: null, responceChannel: null}; }
+ if(!request.responceChannel){ request.responceChannel = `${channel}_responce_${new Date().getTime()}`; }
+
+ const completeChannel = `${request.responceChannel}_complete`;
+ const errorChannel = `${request.responceChannel}_error`;
+
+ const obs = new Observable(observer => {
+ window.electron.ipcRenderer.on(request.responceChannel, (res: T) => observer.next(res));
+ window.electron.ipcRenderer.on(errorChannel, (err: Error) => observer.error(err));
+ window.electron.ipcRenderer.on(completeChannel, () => observer.complete());
+ }).pipe(defaultValue ? defaultIfEmpty(defaultValue) : identity);
+
+ window.electron.ipcRenderer.once(completeChannel, () => {
+ window.electron.ipcRenderer.removeAllListeners(request.responceChannel);
+ window.electron.ipcRenderer.removeAllListeners(errorChannel);
+ window.electron.ipcRenderer.removeAllListeners(completeChannel);
+ });
+
+ window.electron.ipcRenderer.sendMessage(channel, request);
+
+ return obs;
+ }
+
}
\ No newline at end of file
diff --git a/src/renderer/services/maps-downloader.service.ts b/src/renderer/services/maps-downloader.service.ts
index 297319b0..ddeb3db8 100644
--- a/src/renderer/services/maps-downloader.service.ts
+++ b/src/renderer/services/maps-downloader.service.ts
@@ -10,6 +10,7 @@ import { IpcService } from "./ipc.service";
import { OsDiagnosticService } from "./os-diagnostic.service";
import equal from "fast-deep-equal/es6";
import { CSSProperties } from "react";
+import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface";
export class MapsDownloaderService {
@@ -28,7 +29,7 @@ export class MapsDownloaderService {
private readonly mapsQueue$: BehaviorSubject = new BehaviorSubject([]);
private readonly currentDownload$: BehaviorSubject = new BehaviorSubject(null);
private queueMaxLenght = 0;
- private downloadedListerners: ((map: BsvMapDetail, version: BSVersion) => void)[] = [];
+ private downloadedListerners: ((map: BsmLocalMap, version: BSVersion) => void)[] = [];
public readonly progressBarStyle: CSSProperties = {zIndex: 100000, position: "fixed", bottom: "10px", right: 0};
private constructor(){
@@ -50,10 +51,10 @@ export class MapsDownloaderService {
while(this.mapsQueue$.value.at(0)){
const toDownload = this.mapsQueue$.value.at(0);
this.currentDownload$.next(toDownload);
- const downloaded = await this.downloadMap(toDownload.map, toDownload.version);
+ const downloaded = await this.downloadMap(toDownload.map, toDownload.version).toPromise();
if(downloaded){
- this.downloadedListerners.forEach(func => func(toDownload.map, toDownload.version));
+ this.downloadedListerners.forEach(func => func(downloaded, toDownload.version));
}
const newArr = [...this.mapsQueue$.value];
@@ -67,14 +68,13 @@ export class MapsDownloaderService {
this.progressBar.hide(true);
}
- private async downloadMap(map: BsvMapDetail, version: BSVersion): Promise{
- if(this.os.isOffline){ return false }
- const res = await this.ipc.send("download-map", {args: {map, version}});
- return res.success;
+ private downloadMap(map: BsvMapDetail, version: BSVersion): Observable{
+ if(this.os.isOffline){ return null }
+ return this.ipc.sendV2("download-map", {args: {map, version}});
}
- public async openDownloadMapModal(version?: BSVersion): Promise>{
- const res = await this.modals.openModal(DownloadMapsModal, version);
+ public async openDownloadMapModal(version?: BSVersion, ownedMaps: BsmLocalMap[] = []): Promise>{
+ const res = await this.modals.openModal(DownloadMapsModal, {version, ownedMaps});
this.progressBar.setStyle(null);
return res;
}
@@ -109,11 +109,11 @@ export class MapsDownloaderService {
return this.mapsQueue$.asObservable();
}
- public addOnMapDownloadedListener(func: (map: BsvMapDetail, version: BSVersion) => void){
+ public addOnMapDownloadedListener(func: (map: BsmLocalMap, version: BSVersion) => void){
this.downloadedListerners.push(func);
}
- public removeOnMapDownloadedListene(func: (map: BsvMapDetail, version: BSVersion) => void){
+ public removeOnMapDownloadedListener(func: (map: BsmLocalMap, version: BSVersion) => void){
const funcIndex = this.downloadedListerners.indexOf(func);
if(funcIndex < 0){ return; }
this.downloadedListerners.splice(funcIndex, 1);
diff --git a/src/renderer/services/maps-manager.service.ts b/src/renderer/services/maps-manager.service.ts
index 49382ebd..b4ba9147 100644
--- a/src/renderer/services/maps-manager.service.ts
+++ b/src/renderer/services/maps-manager.service.ts
@@ -2,8 +2,7 @@ import { LinkMapsModal } from "renderer/components/modal/modal-types/link-maps-m
import { UnlinkMapsModal } from "renderer/components/modal/modal-types/unlink-maps-modal.component";
import { Subject, Observable } from "rxjs";
import { BSVersion } from "shared/bs-version.interface";
-import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface";
-import { BeatSaverService } from "./thrird-partys/beat-saver.service";
+import { BsmLocalMapsProgress, BsmLocalMap, DeleteMapsProgress } from "shared/models/maps/bsm-local-map.interface";
import { IpcService } from "./ipc.service";
import { ModalExitCode, ModalService } from "./modale.service";
import { DeleteMapsModal } from "renderer/components/modal/modal-types/delete-maps-modal.component";
@@ -11,6 +10,10 @@ import { ProgressBarService } from "./progress-bar.service";
import { OpenSaveDialogOption } from "shared/models/ipc";
import { NotificationService } from "./notification.service";
import { ConfigurationService } from "./configuration.service";
+import { ArchiveProgress } from "shared/models/archive.interface";
+import { map, last, catchError } from "rxjs/operators";
+import { of } from "rxjs";
+import { ProgressionInterface } from "shared/models/progress-bar";
export class MapsManagerService {
@@ -24,7 +27,6 @@ export class MapsManagerService {
public static readonly REMEMBER_CHOICE_DELETE_MAP_KEY = "not-confirm-delete-map"
private readonly ipcService: IpcService;
- private readonly bsaver: BeatSaverService;
private readonly modal: ModalService;
private readonly progressBar: ProgressBarService;
private readonly notifications: NotificationService;
@@ -35,32 +37,14 @@ export class MapsManagerService {
private constructor(){
this.ipcService = IpcService.getInstance();
- this.bsaver = BeatSaverService.getInstance();
this.modal = ModalService.getInsance();
this.progressBar = ProgressBarService.getInstance();
this.notifications = NotificationService.getInstance();
this.config = ConfigurationService.getInstance();
}
- public getMaps(version?: BSVersion, withDetails = true): Observable{
- return new Observable(obs => {
- this.ipcService.send("get-version-maps", {args: version}).then(res => {
- if(!res.success){ return obs.complete();}
-
- obs.next(res.data);
-
- if(!withDetails){ return obs.complete(); }
-
- this.bsaver.getMapDetailsFromHashs(res.data.map(localMap => localMap.hash)).then(mapsDetails => {
- mapsDetails.forEach(details => {
- const corespondingMap = res.data.find(localMap => localMap.hash === details.versions.find(details => details?.hash === localMap.hash)?.hash);
- if(!corespondingMap){ return; }
- res.data.find(localMap => localMap.hash === details.versions.find(details => details?.hash === localMap.hash)?.hash).bsaverInfo = details
- });
- obs.next(res.data);
- })
- });
- });
+ public getMaps(version?: BSVersion): Observable{
+ return this.ipcService.sendV2("load-version-maps", {args: version}, {loaded: 0, total: 0, maps: []});
}
public versionHaveMapsLinked(version: BSVersion): Promise{
@@ -129,17 +113,15 @@ export class MapsManagerService {
const showProgressBar = this.progressBar.require();
- if(showProgressBar){
- this.progressBar.showFake(.008);
- }
+ const progress$ = this.ipcService.sendV2("delete-maps", {args: maps}).pipe(map(progress => (progress.deleted / progress.total) * 100));
- const res = await this.ipcService.send("delete-maps", {args: {maps}});
+ progress$.subscribe(console.log);
- if(showProgressBar){
- this.progressBar.hide(true);
- }
+ showProgressBar && this.progressBar.show(progress$, true);
- return res.success;
+ progress$.toPromise().finally(() => this.progressBar.hide(true));
+
+ return progress$.pipe(last(), map(() => true), catchError(() => of(false))).toPromise().catch(() => false);
}
public async exportMaps(version: BSVersion, maps?: BsmLocalMap[]): Promise{
@@ -152,18 +134,22 @@ export class MapsManagerService {
if(!resFile.success){ return; }
- this.progressBar.showFake(.008);
-
- const resExport = await this.ipcService.send("export-maps", {args: {version, maps, outPath: resFile.data}});
- if(!resExport.success && resExport.error.title){
- const {title, msg} = resExport.error;
- this.notifications.notifyError({title, desc: msg});
- }
- else {
+ const exportProgress$: Observable = await this.ipcService.sendV2("export-maps", {args: {version, maps, outPath: resFile.data}}).pipe(
+ map(p => {
+ return { progression: (p.prossesedFiles / p.totalFiles) * 100, label: `${p.prossesedFiles} / ${p.totalFiles}` } as ProgressionInterface
+ })
+ );
+
+ this.progressBar.show(exportProgress$, true);
+
+ await exportProgress$.toPromise().catch(e => {
+ this.notifications.notifyError({title: "notifications.types.error", desc: e.message});
+ }).then(() => {
this.notifications.notifySuccess({title: "Export terminé 🎉", duration: 3000});
- }
- this.progressBar.complete();
- this.progressBar.hide(true);
+ this.progressBar.complete();
+ this.progressBar.hide(true);
+ });
+
}
public async isDeepLinksEnabled(): Promise{
diff --git a/src/shared/models/archive.interface.ts b/src/shared/models/archive.interface.ts
new file mode 100644
index 00000000..438801b3
--- /dev/null
+++ b/src/shared/models/archive.interface.ts
@@ -0,0 +1,4 @@
+export interface ArchiveProgress{
+ totalFiles: number;
+ prossesedFiles: number;
+}
\ No newline at end of file
diff --git a/src/shared/models/ipc/ipc-request.interface.ts b/src/shared/models/ipc/ipc-request.interface.ts
index bcf754c9..c97881eb 100644
--- a/src/shared/models/ipc/ipc-request.interface.ts
+++ b/src/shared/models/ipc/ipc-request.interface.ts
@@ -1,4 +1,9 @@
+import { Observable } from "rxjs";
+import { IpcResponse } from "./ipc-response.interface";
+
export interface IpcRequest{
args?: T,
- responceChannel?: string
-}
\ No newline at end of file
+ responceChannel?: string,
+}
+
+export type IpcReplier= (data: Observable) => void;
\ No newline at end of file
diff --git a/src/shared/models/ipc/ipc-response.interface.ts b/src/shared/models/ipc/ipc-response.interface.ts
index ac8c512e..e9a3b175 100644
--- a/src/shared/models/ipc/ipc-response.interface.ts
+++ b/src/shared/models/ipc/ipc-response.interface.ts
@@ -4,4 +4,8 @@ export interface IpcResponse{
data?: T,
error?: BsmException,
success: boolean,
-}
\ No newline at end of file
+}
+
+export type IpcChannel = string;
+export type IpcErrorChannel = IpcChannel & `${string}_error`;
+export type IpcCompleteChannel = IpcChannel & `${string}_complete`;
\ No newline at end of file
diff --git a/src/shared/models/maps/bsm-local-map.interface.ts b/src/shared/models/maps/bsm-local-map.interface.ts
index 2c353465..e4d3e1d6 100644
--- a/src/shared/models/maps/bsm-local-map.interface.ts
+++ b/src/shared/models/maps/bsm-local-map.interface.ts
@@ -8,4 +8,15 @@ export interface BsmLocalMap {
rawInfo: RawMapInfoData,
bsaverInfo?: BsvMapDetail
path: string
+}
+
+export interface BsmLocalMapsProgress {
+ total: number,
+ loaded: number,
+ maps: BsmLocalMap[],
+}
+
+export interface DeleteMapsProgress {
+ total: number,
+ deleted: number
}
\ No newline at end of file
From 3aacd7575b2e91a36ef805ab1cd83ff05b8a401b Mon Sep 17 00:00:00 2001
From: MathieuG-P <40181755+Zagrios@users.noreply.github.com>
Date: Tue, 21 Feb 2023 01:00:39 +0100
Subject: [PATCH 19/23] fix oneclick map not work when no BS versions intalled
---
.../services/additional-content/local-maps-manager.service.ts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/main/services/additional-content/local-maps-manager.service.ts b/src/main/services/additional-content/local-maps-manager.service.ts
index 972593c5..fbf0e169 100644
--- a/src/main/services/additional-content/local-maps-manager.service.ts
+++ b/src/main/services/additional-content/local-maps-manager.service.ts
@@ -280,6 +280,10 @@ export class LocalMapsManagerService {
const downloadedMap = await this.downloadMap(map);
+ const sharedMapsPath = await this.getMapsFolderPath();
+
+ copySync(downloadedMap.path, path.join(sharedMapsPath, path.basename(downloadedMap.path)), {overwrite: true});
+
const versions = await this.localVersion.getInstalledVersions();
for(const version of versions){
From 8d28c3cfc80d5fe90c9b47d0b4a69ded69a46cfb Mon Sep 17 00:00:00 2001
From: MathieuG-P <40181755+Zagrios@users.noreply.github.com>
Date: Tue, 21 Feb 2023 01:28:42 +0100
Subject: [PATCH 20/23] oneclick map not install map in unlinked versions
---
.../services/additional-content/local-maps-manager.service.ts | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/main/services/additional-content/local-maps-manager.service.ts b/src/main/services/additional-content/local-maps-manager.service.ts
index fbf0e169..972593c5 100644
--- a/src/main/services/additional-content/local-maps-manager.service.ts
+++ b/src/main/services/additional-content/local-maps-manager.service.ts
@@ -280,10 +280,6 @@ export class LocalMapsManagerService {
const downloadedMap = await this.downloadMap(map);
- const sharedMapsPath = await this.getMapsFolderPath();
-
- copySync(downloadedMap.path, path.join(sharedMapsPath, path.basename(downloadedMap.path)), {overwrite: true});
-
const versions = await this.localVersion.getInstalledVersions();
for(const version of versions){
From 6b2879d9dc21e5ce550aab76cbac83a3db743700 Mon Sep 17 00:00:00 2001
From: MathieuG-P <40181755+Zagrios@users.noreply.github.com>
Date: Tue, 21 Feb 2023 01:39:17 +0100
Subject: [PATCH 21/23] bumb version
---
release/app/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/release/app/package.json b/release/app/package.json
index 1ba06a43..4f3c8f7a 100644
--- a/release/app/package.json
+++ b/release/app/package.json
@@ -1,6 +1,6 @@
{
"name": "bs-manager",
- "version": "1.0.1",
+ "version": "1.0.2-alpha.1",
"description": "A foundation for scalable desktop apps",
"main": "./dist/main/main.js",
"author": {
From dc70d2889f743f902d713ca600c4c065bfb4e2af Mon Sep 17 00:00:00 2001
From: MathieuG-P <40181755+Zagrios@users.noreply.github.com>
Date: Fri, 24 Feb 2023 01:10:15 +0100
Subject: [PATCH 22/23] fix unlink maps EN translation
---
assets/jsons/translations/en.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json
index aeab9e36..712517ca 100644
--- a/assets/jsons/translations/en.json
+++ b/assets/jsons/translations/en.json
@@ -45,7 +45,7 @@
"link-maps": {
"tooltips": {
"link": "Link maps",
- "unlink": "Unling maps"
+ "unlink": "Unlink maps"
}
}
},
From 5641c25cc1cf0d2533fa3cef33e90586182637e1 Mon Sep 17 00:00:00 2001
From: MathieuG-P <40181755+Zagrios@users.noreply.github.com>
Date: Fri, 24 Feb 2023 01:12:46 +0100
Subject: [PATCH 23/23] bumb version
---
release/app/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/release/app/package.json b/release/app/package.json
index 4f3c8f7a..bbf34f8a 100644
--- a/release/app/package.json
+++ b/release/app/package.json
@@ -1,6 +1,6 @@
{
"name": "bs-manager",
- "version": "1.0.2-alpha.1",
+ "version": "1.0.2",
"description": "A foundation for scalable desktop apps",
"main": "./dist/main/main.js",
"author": {