Merge branch 'master' into feature/add-changelog-modal/178

This commit is contained in:
Shidorien
2024-01-08 09:43:59 +01:00
63 changed files with 662 additions and 512 deletions
@@ -13,7 +13,7 @@ import { ConfigurationService } from "./configuration.service";
import { ArchiveProgress } from "shared/models/archive.interface";
import { map, last, catchError } from "rxjs/operators";
import { ProgressionInterface } from "shared/models/progress-bar";
import { VersionFolderLinkerService, VersionLinkerActionType } from "./version-folder-linker.service";
import { FolderLinkState, VersionFolderLinkerService, VersionLinkerActionType } from "./version-folder-linker.service";
export class MapsManagerService {
private static instance: MapsManagerService;
@@ -176,6 +176,10 @@ export class MapsManagerService {
}
public $mapsLinkingPending(version: BSVersion): Observable<boolean> {
return this.linker.$isVersionFolderPending(version, MapsManagerService.RELATIVE_MAPS_FOLDER);
return this.linker.$isPending(version, MapsManagerService.RELATIVE_MAPS_FOLDER);
}
public $mapsFolderLinkState(version: BSVersion): Observable<FolderLinkState> {
return this.linker.$folderLinkedState(version, MapsManagerService.RELATIVE_MAPS_FOLDER);
}
}
@@ -1,6 +1,6 @@
import { MSModelType } from "shared/models/models/model-saber.model";
import { IpcService } from "../ipc.service";
import { VersionFolderLinkerService, VersionLinkerActionListener, VersionLinkerActionType } from "../version-folder-linker.service";
import { FolderLinkState, VersionFolderLinkerService, VersionLinkerActionListener, VersionLinkerActionType } from "../version-folder-linker.service";
import { MODEL_TYPE_FOLDERS } from "shared/models/models/constants";
import { Observable, lastValueFrom, map } from "rxjs";
import { BSVersion } from "shared/bs-version.interface";
@@ -49,7 +49,11 @@ export class ModelsManagerService {
}
public $modelsLinkingPending(version: BSVersion, type: MSModelType): Observable<boolean> {
return this.versionFolderLinked.$isVersionFolderPending(version, MODEL_TYPE_FOLDERS[type]);
return this.versionFolderLinked.$isPending(version, MODEL_TYPE_FOLDERS[type]);
}
public $modelsLinkingState(version: BSVersion, type: MSModelType): Observable<FolderLinkState> {
return this.versionFolderLinked.$folderLinkedState(version, MODEL_TYPE_FOLDERS[type]);
}
public onModelsFolderLinked(callback: VersionLinkerActionListener): void {
@@ -1,6 +1,6 @@
import { LinkOptions, UnlinkOptions } from "main/services/folder-linker.service";
import { map, distinctUntilChanged, filter, mergeMap, shareReplay } from "rxjs/operators";
import { BehaviorSubject, Observable } from "rxjs";
import { BehaviorSubject, Observable, of } from "rxjs";
import { BSVersion } from "shared/bs-version.interface";
import { IpcService } from "./ipc.service";
import { ProgressBarService } from "./progress-bar.service";
@@ -62,6 +62,13 @@ export class VersionFolderLinkerService {
return this.ipcService.sendV2<boolean, VersionLinkerAction>("link-version-folder-action", { args: action });
}
private get currentAction$(): Observable<VersionLinkerAction> {
return this._queue$.pipe(
map(actions => actions.at(0)),
distinctUntilChanged()
);
}
public linkVersionFolder(action: VersionLinkFolderAction): Promise<boolean> {
const promise = new Promise<boolean>(resolve => {
const callBack: VersionLinkerActionListener = (performedAction, linked) => {
@@ -122,12 +129,33 @@ export class VersionFolderLinkerService {
return this.ipcService.sendV2("is-version-folder-linked", { args: { version, relativeFolder } });
}
public isPending(version: BSVersion, relativeFolder: string): Observable<boolean> {
return this.queue$.pipe(map(queue => queue.length > 0 && queue.some(action => action.version === version && action.relativeFolder === relativeFolder), distinctUntilChanged()));
public $folderLinkedState(version: BSVersion, relativeFolder: string): Observable<FolderLinkState> {
return this._queue$.pipe(
mergeMap(queue => {
const currentAction = queue.at(0);
if(currentAction && equal(currentAction.version, version) && currentAction.relativeFolder === relativeFolder) {
return of(FolderLinkState.Processing)
}
if(queue.some(action => equal(action.version, version) && action.relativeFolder === relativeFolder)) {
return of(FolderLinkState.Pending);
}
return this.isVersionFolderLinked(version, relativeFolder).pipe(
map(linked => linked ? FolderLinkState.Linked : FolderLinkState.Unlinked)
);
}),
distinctUntilChanged(),
shareReplay(1)
);
}
public isProcessing(version: BSVersion, relativeFolder: string): Observable<boolean> {
return this.currentAction$.pipe(map(action => action && action.version === version && action.relativeFolder === relativeFolder));
public $isPending(version: BSVersion, relativeFolder: string): Observable<boolean> {
return this.$folderLinkedState(version, relativeFolder).pipe(map(state => state === FolderLinkState.Pending));
}
public $isProcessing(version: BSVersion, relativeFolder: string): Observable<boolean> {
return this.$folderLinkedState(version, relativeFolder).pipe(map(state => state === FolderLinkState.Processing));
}
public getLinkedFolders(version: BSVersion, options?: { relative?: boolean }): Observable<string[]> {
@@ -137,27 +165,6 @@ export class VersionFolderLinkerService {
public relinkAllVersionsFolders(): Observable<void> {
return this.ipcService.sendV2("relink-all-versions-folders");
}
public $isVersionFolderPending(version: BSVersion, relativeFolder: string): Observable<boolean> {
return this.queue$.pipe(
mergeMap(async queue => {
return queue.some(q => q.relativeFolder.includes(relativeFolder) && equal(q.version, version));
}),
distinctUntilChanged(),
shareReplay(1)
);
}
public get currentAction$(): Observable<VersionLinkerAction> {
return this._queue$.pipe(
map(actions => actions.at(0)),
distinctUntilChanged()
);
}
public get queue$(): Observable<VersionLinkerAction[]> {
return this._queue$.asObservable();
}
}
export const enum VersionLinkerActionType {
@@ -182,3 +189,10 @@ export interface VersionUnlinkFolderAction extends VersionLinkerAction {
}
export type VersionLinkerActionListener = (action: VersionLinkerAction, linked: boolean) => void;
export enum FolderLinkState {
Linked,
Unlinked,
Pending,
Processing
}