{"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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"}