From 4abf04c12a6acbbfdd5c699fd18316e0973f1e2d Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:17:19 +0200 Subject: [PATCH 1/3] [bugfix-157] create cancellable observable --- .../models/rx/cancellable-observable.class.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/shared/models/rx/cancellable-observable.class.ts diff --git a/src/shared/models/rx/cancellable-observable.class.ts b/src/shared/models/rx/cancellable-observable.class.ts new file mode 100644 index 00000000..590b4546 --- /dev/null +++ b/src/shared/models/rx/cancellable-observable.class.ts @@ -0,0 +1,42 @@ +import { BehaviorSubject, Observable, Observer, filter, lastValueFrom, take } from "rxjs"; + +export class CancellableObservable extends Observable { + + private readonly _isCancelled$ = new BehaviorSubject(false); + + constructor(subscriber: (obs: CancellableObserver) => void) { + + super((observer: Observer) => { + + const cancellableObserver: CancellableObserver = Object.assign(observer, { + $isCancelled: () => this.$isCancelled(), + onCancel: (callback: () => void) => this.onCancel(callback) + }); + + subscriber(cancellableObserver); + }); + + lastValueFrom(this).finally(() => this._isCancelled$.complete()); + } + + public cancel(): void { + this._isCancelled$.next(true); + } + + public onCancel(callback: () => void): void { + this.$isCancelled().pipe(filter(isCancelled => isCancelled), take(1)).subscribe(callback); + } + + public $isCancelled(): Observable { + return this._isCancelled$.asObservable(); + } + + public isCancelled(): boolean { + return this._isCancelled$.getValue(); + } +} + +export interface CancellableObserver extends Observer { + readonly $isCancelled: () => Observable; + readonly onCancel: (callback: () => void) => void; +} \ No newline at end of file From 1009a4c02a2d272dc6d44ca4ea44f55c73e9916e Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Tue, 23 May 2023 22:25:19 +0200 Subject: [PATCH 2/3] [bugfix-157] Fix loading maps percent collision --- .../local-maps-list-panel.component.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx b/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx index 92126e30..e8ac25cf 100644 --- a/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx @@ -9,7 +9,7 @@ import { MapsDownloaderService } from "renderer/services/maps-downloader.service import { VariableSizeList } from "react-window" import { MapsRow } from "./maps-row.component" import { BehaviorSubject } from "rxjs" -import { debounceTime, last, map, mergeMap } from "rxjs/operators" +import { debounceTime, last, mergeMap, tap } from "rxjs/operators" import { BeatSaverService } from "renderer/services/thrird-partys/beat-saver.service" import { OsDiagnosticService } from "renderer/services/os-diagnostic.service" import { useTranslation } from "renderer/hooks/use-translation.hook" @@ -115,11 +115,8 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc const loadMapsObs$ = mapsManager.getMaps(version); - loadMapsObs$.pipe(map(progess => { - return Math.floor(((progess.loaded / progess.total) * 100)); - })).subscribe(percent => loadPercent$.next(percent)); - subs.push(loadMapsObs$.pipe( + tap(progress => loadPercent$.next(Math.floor(((progress.loaded / progress.total) * 100)))), last(), mergeMap(async progress => { if(os.isOffline){ return progress.maps; } From e1bfcd7bc062adb42a278003adf6b397c2569873 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Tue, 23 May 2023 22:29:11 +0200 Subject: [PATCH 3/3] [bugfix-157] no need of cancellable observable --- .../models/rx/cancellable-observable.class.ts | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 src/shared/models/rx/cancellable-observable.class.ts diff --git a/src/shared/models/rx/cancellable-observable.class.ts b/src/shared/models/rx/cancellable-observable.class.ts deleted file mode 100644 index 590b4546..00000000 --- a/src/shared/models/rx/cancellable-observable.class.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { BehaviorSubject, Observable, Observer, filter, lastValueFrom, take } from "rxjs"; - -export class CancellableObservable extends Observable { - - private readonly _isCancelled$ = new BehaviorSubject(false); - - constructor(subscriber: (obs: CancellableObserver) => void) { - - super((observer: Observer) => { - - const cancellableObserver: CancellableObserver = Object.assign(observer, { - $isCancelled: () => this.$isCancelled(), - onCancel: (callback: () => void) => this.onCancel(callback) - }); - - subscriber(cancellableObserver); - }); - - lastValueFrom(this).finally(() => this._isCancelled$.complete()); - } - - public cancel(): void { - this._isCancelled$.next(true); - } - - public onCancel(callback: () => void): void { - this.$isCancelled().pipe(filter(isCancelled => isCancelled), take(1)).subscribe(callback); - } - - public $isCancelled(): Observable { - return this._isCancelled$.asObservable(); - } - - public isCancelled(): boolean { - return this._isCancelled$.getValue(); - } -} - -export interface CancellableObserver extends Observer { - readonly $isCancelled: () => Observable; - readonly onCancel: (callback: () => void) => void; -} \ No newline at end of file