@ynmstudio/utils
Version:
YNM Utilities for Angular
1 lines • 15.8 kB
Source Map (JSON)
{"version":3,"file":"ynmstudio-utils-loading-bar.mjs","sources":["../../../projects/ynm-utils/loading-bar/src/core/loading-bar.config.ts","../../../projects/ynm-utils/loading-bar/src/core/loading-bar.state.ts","../../../projects/ynm-utils/loading-bar/src/core/loading-bar.service.ts","../../../projects/ynm-utils/loading-bar/src/interceptors/loading-bar.interceptor.ts","../../../projects/ynm-utils/loading-bar/src/ynmstudio-utils-loading-bar.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface LoadingBarConfig {\n latencyThreshold?: number;\n}\n\nexport const LOADING_BAR_CONFIG = new InjectionToken<LoadingBarConfig>('LOADING_BAR_CONFIG');","import { Subject, timer, of, Observable } from 'rxjs';\nimport { map, switchMap, take, tap, startWith, shareReplay } from 'rxjs/operators';\nimport { LoadingBarConfig } from './loading-bar.config';\n\nexport interface LoadingBarStateInterface {\n action?: 'start' | 'complete' | 'set' | 'stop' | 'increment';\n value: number;\n initialValue: number;\n}\n\nexport class LoadingBarState {\n private state: LoadingBarStateInterface = {\n action: undefined,\n value: 0,\n initialValue: 0,\n };\n #requests: any = null;\n #disabled: boolean = false;\n readonly #stream$ = new Subject<LoadingBarStateInterface>();\n private _value$: Observable<number> | null = null;\n\n constructor(private config: LoadingBarConfig = {}) {\n this.config = {\n latencyThreshold: 0,\n ...config,\n };\n }\n\n get value$() {\n if (this._value$) {\n return this._value$;\n }\n\n return (this._value$ = this.#stream$.pipe(\n startWith(this.state),\n switchMap((s) => this.timer$(s)),\n shareReplay(),\n map((s) => s.value),\n ));\n }\n\n start(initialValue = 2) {\n if (this.#disabled) {\n return;\n }\n\n this.next({ action: 'start', initialValue });\n }\n\n stop() {\n this.next({ action: 'stop' });\n }\n\n complete() {\n this.next({ action: 'complete' });\n }\n\n disable() {\n this.#disabled = true;\n }\n\n set(value: number) {\n this.next({ action: 'set', value });\n }\n\n increment(value = 0) {\n this.next({ action: 'increment', value });\n }\n\n private next(state: Partial<LoadingBarStateInterface>, emitEvent = true) {\n switch (state.action) {\n case 'start':\n this.#requests = (this.#requests || 0) + 1;\n break;\n case 'complete':\n this.#requests = (this.#requests || 1) - 1;\n if (this.#requests > 0) {\n return;\n }\n break;\n case 'stop':\n this.#requests = 0;\n break;\n case 'increment':\n state.value = this._increment(state.value);\n break;\n }\n\n this.state = { ...this.state, action: undefined, ...state };\n if (emitEvent) {\n this.#stream$.next(this.state);\n }\n }\n\n private timer$ = (s: LoadingBarStateInterface) => {\n let state$: Observable<Partial<LoadingBarStateInterface>> = of(s);\n switch (s.action) {\n case 'start':\n case 'increment':\n case 'set': {\n if (s.action === 'start' && this.config.latencyThreshold === 0 && s.value === 0) {\n s.value = s.initialValue;\n }\n\n if (this.#requests > 0) {\n state$ = timer(this.config.latencyThreshold ?? 0, 250).pipe(\n map((t) => ({ ...s, value: t === 0 ? this.state.value || s.initialValue : this._increment() })),\n );\n }\n break;\n }\n case 'complete':\n case 'stop': {\n // Attempt to aggregate any start/complete calls within 500ms:\n state$ =\n s.value === 0\n ? of({ ...s })\n : timer(0, 500).pipe(\n take(2),\n map((t) => ({ value: t === 0 ? 100 : 0 })),\n );\n break;\n }\n }\n\n return state$.pipe(\n map((next) => <LoadingBarStateInterface>{ ...next, action: 'set' }),\n tap((next) => this.next(next, false)),\n );\n };\n\n private _increment(rnd = 0) {\n const stat = this.state.value;\n if (stat >= 99) {\n rnd = 0;\n }\n\n if (rnd === 0) {\n if (stat >= 0 && stat < 25) {\n // Start out between 3 - 6% increments\n rnd = Math.random() * (5 - 3 + 1) + 3;\n } else if (stat >= 25 && stat < 65) {\n // increment between 0 - 3%\n rnd = Math.random() * 3;\n } else if (stat >= 65 && stat < 90) {\n // increment between 0 - 2%\n rnd = Math.random() * 2;\n } else if (stat >= 90 && stat < 99) {\n // finally, increment it .5 %\n rnd = 0.5;\n } else {\n // after 99%, don't increment:\n rnd = 0;\n }\n }\n\n return rnd + stat;\n }\n}","import { Injectable, NgZone, Optional } from '@angular/core';\nimport { PLATFORM_ID, Inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { LoadingBarState } from './loading-bar.state';\nimport { Subject, combineLatest, Observable, OperatorFunction } from 'rxjs';\nimport { switchMap, map, startWith } from 'rxjs/operators';\nimport { LOADING_BAR_CONFIG, LoadingBarConfig } from './loading-bar.config';\n\n@Injectable({ providedIn: 'root' })\nexport class LoadingBarService {\n private readonly refs: { [id: string]: LoadingBarState } = {};\n private readonly streams$ = new Subject<void>();\n readonly value$ = this.streams$.pipe(\n startWith(null),\n switchMap(() => combineLatest(Object.keys(this.refs).map((s) => this.refs[s].value$))),\n runInZone(this.zone),\n map((v) => Math.max(0, ...v)),\n );\n\n\n constructor(\n @Inject(PLATFORM_ID) private platformId: Object,\n @Optional() @Inject(LOADING_BAR_CONFIG) private config: LoadingBarConfig = {},\n @Optional() private zone?: NgZone,\n ) { }\n\n /** @deprecated use `useRef` instead. */\n start(initialValue = 2) {\n this.useRef().start(initialValue);\n }\n\n /** @deprecated use `useRef` instead. */\n set(value: number) {\n this.useRef().set(value);\n }\n\n /** @deprecated use `useRef` instead. */\n increment(value?: number) {\n this.useRef().increment(value);\n }\n\n /** @deprecated use `useRef` instead. */\n complete() {\n this.useRef().complete();\n }\n\n /** @deprecated use `useRef` instead. */\n stop() {\n this.useRef().stop();\n }\n\n useRef(id: string = 'default'): LoadingBarState {\n if (!this.refs[id]) {\n this.refs[id] = new LoadingBarState(this.config);\n this.streams$.next();\n\n if (!isPlatformBrowser(this.platformId)) {\n this.refs[id].disable();\n }\n }\n\n return this.refs[id];\n }\n}\n\n// https://stackoverflow.com/a/57452361/1406096\nexport function runInZone<T>(zone?: NgZone): OperatorFunction<T, T> {\n if (!zone) {\n return (source) => source;\n }\n\n return (source) =>\n new Observable((observer) =>\n source.subscribe(\n (value: T) => zone.run(() => observer.next(value)),\n (e: any) => zone.run(() => observer.error(e)),\n () => zone.run(() => observer.complete()),\n ),\n );\n}","import { inject, isDevMode } from \"@angular/core\";\nimport { LoadingBarService } from \"../public_api\";\nimport { HttpContextToken, HttpHandlerFn, HttpRequest } from \"@angular/common/http\";\nimport { finalize, tap } from \"rxjs/operators\";\n\nexport const NGX_LOADING_BAR_IGNORED = new HttpContextToken<boolean>(() => false);\n\nexport const loadingBarInterceptor = (\n req: HttpRequest<unknown>, next: HttpHandlerFn\n) => {\n\n const loader = inject(LoadingBarService)\n\n if (req.context.get(NGX_LOADING_BAR_IGNORED) === true) {\n return next(req);\n }\n\n let started = false;\n const ref = loader.useRef('http');\n return next(req).pipe(\n tap(() => {\n if (!started) {\n ref.start();\n started = true;\n }\n }),\n finalize(() => started && ref.complete()),\n );\n}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}