UNPKG

@ngneat/loadoff

Version:

<p align="center"> <img width="20%" height="20%" src="./logo.svg"> </p>

1 lines 8.12 kB
{"version":3,"file":"ngneat-loadoff.mjs","sources":["../../../../projects/ngneat/loadoff/src/lib/loadingFor.ts","../../../../projects/ngneat/loadoff/src/lib/toAsyncState.ts","../../../../projects/ngneat/loadoff/src/lib/asyncStore.ts","../../../../projects/ngneat/loadoff/src/lib/retainResponse.ts","../../../../projects/ngneat/loadoff/src/lib/operators.ts","../../../../projects/ngneat/loadoff/src/ngneat-loadoff.ts"],"sourcesContent":["import { BehaviorSubject, defer, MonoTypeOperatorFunction, Observable } from 'rxjs';\nimport { finalize } from 'rxjs/operators';\n\nfunction loadingTracker<T>(tracker: BehaviorSubject<boolean>) {\n return function (source: Observable<T>) {\n return defer(() => {\n tracker.next(true);\n\n return source;\n }).pipe(finalize(() => tracker.next(false)));\n };\n}\n\nexport function loadingFor<K extends PropertyKey>(...keys: K[]) {\n const result: Record<\n K,\n {\n inProgress$: Observable<boolean>;\n track: <T>() => MonoTypeOperatorFunction<T>;\n }\n > = {} as any;\n\n for (const key of keys) {\n const subject = new BehaviorSubject<boolean>(false);\n\n result[key] = {\n inProgress$: subject.asObservable(),\n track<T>() {\n return loadingTracker<T>(subject);\n },\n };\n }\n\n return result;\n}\n","import { of, OperatorFunction, pipe } from 'rxjs';\nimport { catchError, map, startWith } from 'rxjs/operators';\n\nexport class AsyncState<T, E = any> {\n res: T | undefined = undefined;\n error: E | undefined = undefined;\n loading = true;\n success = false;\n complete = false;\n\n constructor(state: Partial<AsyncState<T, E>> = {}) {\n Object.assign(this, state);\n }\n}\n\nexport function createAsyncState<T, E = any>(state: Partial<AsyncState<T, E>> = {}) {\n return new AsyncState(state);\n}\n\nexport function createSyncState<T, E = any>(res: T) {\n return new AsyncState<T, E>({\n loading: false,\n complete: true,\n res,\n });\n}\n\nexport function isSuccess<T>(state: AsyncState<T>): state is AsyncState<T> & { res: T } {\n return state.success;\n}\n\nexport function hasError<T>(state: AsyncState<T>): state is AsyncState<T> & { res: undefined } {\n return !!state.error;\n}\n\nexport function isComplete(state: AsyncState<unknown>) {\n return state.complete;\n}\n\nexport function isLoading(state: AsyncState<unknown>) {\n return state.loading;\n}\n\nexport function toAsyncState<T, E = any>(): OperatorFunction<T, AsyncState<T, E>> {\n return pipe(\n map((res) => {\n return new AsyncState<T, E>({\n res,\n loading: false,\n complete: true,\n success: true,\n });\n }),\n startWith(new AsyncState<T, E>()),\n catchError((error) => {\n console.error(error);\n\n return of(\n new AsyncState<T, E>({\n error,\n loading: false,\n complete: true,\n })\n );\n })\n );\n}\n","import { BehaviorSubject, MonoTypeOperatorFunction, pipe } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { AsyncState } from './toAsyncState';\n\nexport function createAsyncStore<Response, E = any>() {\n const store = new BehaviorSubject<AsyncState<Response, E>>(new AsyncState());\n\n function update(data: Response | ((res: Response) => Response)) {\n let resolved = data;\n\n if (typeof data === 'function') {\n resolved = (data as Function)(store.getValue().res);\n }\n\n store.next(\n new AsyncState({\n res: resolved as Response,\n loading: false,\n complete: true,\n success: true,\n })\n );\n }\n\n return {\n value$: store.asObservable(),\n getValue: store.getValue(),\n update,\n track<T extends Response>(): MonoTypeOperatorFunction<T> {\n return pipe(\n tap({\n next(data) {\n update(data);\n },\n error(err) {\n store.next(\n new AsyncState<T>({\n error: err,\n loading: false,\n complete: true,\n })\n );\n },\n })\n );\n },\n };\n}\n","import { OperatorFunction, pipe } from 'rxjs';\nimport { scan, startWith } from 'rxjs/operators';\nimport { AsyncState, createAsyncState } from './toAsyncState';\n\n/**\n * Operator that retains the previous response on a new emission of an AsyncState item.\n * This can be useful for implementing a refresh mechanism, where you want to keep displaying the old value while fetching a new value\n */\nexport function retainResponse<T, E = any>(\n startWithValue: AsyncState<T, E> = createAsyncState<T, E>()\n): OperatorFunction<AsyncState<T, E>, AsyncState<T, E>> {\n return pipe(\n startWith(startWithValue),\n scan(\n (acc: AsyncState<T, E>, val: AsyncState<T, E>) =>\n new AsyncState<T, E>({\n ...val,\n res: val.success ? val.res : acc.res,\n })\n )\n );\n}\n","\nimport { OperatorFunction } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\nimport { AsyncState } from \"./toAsyncState\";\n\nexport function someLoading(): OperatorFunction<AsyncState<unknown>[], boolean> {\n return map(states => states.some(s => s.loading))\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}