From 1e62040ee07c6435de49b3f8ae6387958ceee9bc Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 26 Jun 2022 23:29:23 +0200 Subject: [PATCH] add global progress bar --- src/renderer/App.tsx | 2 + .../bsm-progress-bar.component.tsx | 45 +++++++++++++++++ src/renderer/services/progress-bar.service.ts | 50 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 src/renderer/components/progress-bar/bsm-progress-bar.component.tsx create mode 100644 src/renderer/services/progress-bar.service.ts diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 658546fe..940723e8 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -5,6 +5,7 @@ import { AvailableVersionsList } from "./pages/available-versions-list.component import { VersionViewer } from "./pages/version-viewer.component"; import { Modal } from "./components/modal/modal.component"; import { SettingsPage } from "./pages/settings-page.component"; +import { BsmProgressBar } from "./components/progress-bar/bsm-progress-bar.component"; export default function App() { @@ -20,6 +21,7 @@ export default function App() { }/> }/> + diff --git a/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx b/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx new file mode 100644 index 00000000..26b9cdfa --- /dev/null +++ b/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx @@ -0,0 +1,45 @@ +import { useEffect, useState } from "react" +import { ProgressBarService } from "renderer/services/progress-bar.service"; +import { AnimatePresence, motion } from "framer-motion"; +import BeatRunningImg from "../../../../assets/beat-running.png" +import BeatWaitingImg from "../../../../assets/beat-waiting.png" + +export function BsmProgressBar() { + + const progressBarService = ProgressBarService.getInstance(); + + const [progress, setProgress] = useState(0); + const [visible, setVisible] = useState(false); + + useEffect(() => { + + const progressSub = progressBarService.progression$.subscribe(val => setProgress(val)); + const visibleSub = progressBarService.visible$.subscribe(state => setVisible(state)); + + return () => { + progressSub.unsubscribe(); + visibleSub.unsubscribe(); + } + }, []) + + + return ( + { visible && + +
+ { !!progress && ( + <> +
+
+ +
+ {`${progress}%`} +
+ + )} + { !progress && } +
+
+ }
+ ) +} diff --git a/src/renderer/services/progress-bar.service.ts b/src/renderer/services/progress-bar.service.ts new file mode 100644 index 00000000..a9d735fe --- /dev/null +++ b/src/renderer/services/progress-bar.service.ts @@ -0,0 +1,50 @@ +import { BehaviorSubject, distinctUntilChanged, filter, Observable, Subscription } from "rxjs"; + +export class ProgressBarService{ + + private static instance: ProgressBarService; + + private readonly _progression$: BehaviorSubject; + private readonly _visible$: BehaviorSubject; + + private subscription: Subscription; + + public static getInstance(): ProgressBarService{ + if(!ProgressBarService.instance){ ProgressBarService.instance = new ProgressBarService(); } + return ProgressBarService.instance; + } + + private constructor(){ + this._progression$ = new BehaviorSubject(0); + this._visible$ = new BehaviorSubject(false); + } + + public subscribreTo(obs: Observable){ + if(this.subscription){ this.unsubscribe(); } + this.subscription = obs.pipe(distinctUntilChanged()).subscribe(value => { + this.progression$.next(value); + }); + } + + public unsubscribe(){ + this.subscription.unsubscribe(); + this.subscription = null; + } + + public show(obs?: Observable){ + if(obs){ this.subscribreTo(obs); } + this.visible$.next(true); + } + public hide(unsubscribe: boolean){ + if(unsubscribe){ this.unsubscribe(); } + this.visible$.next(false); + } + + public get progression$(): BehaviorSubject{ return this._progression$; } + public get visible$(): BehaviorSubject{ return this._visible$; } + + + + + +} \ No newline at end of file