@dereekb/rxjs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/package.json +13 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +5 -0
- package/src/index.js.map +1 -0
- package/src/lib/index.d.ts +6 -0
- package/src/lib/index.js +10 -0
- package/src/lib/index.js.map +1 -0
- package/src/lib/iterator/index.d.ts +6 -0
- package/src/lib/iterator/index.js +10 -0
- package/src/lib/iterator/index.js.map +1 -0
- package/src/lib/iterator/iteration.accumulator.d.ts +56 -0
- package/src/lib/iterator/iteration.accumulator.js +63 -0
- package/src/lib/iterator/iteration.accumulator.js.map +1 -0
- package/src/lib/iterator/iteration.accumulator.rxjs.d.ts +14 -0
- package/src/lib/iterator/iteration.accumulator.rxjs.js +35 -0
- package/src/lib/iterator/iteration.accumulator.rxjs.js.map +1 -0
- package/src/lib/iterator/iteration.d.ts +58 -0
- package/src/lib/iterator/iteration.js +3 -0
- package/src/lib/iterator/iteration.js.map +1 -0
- package/src/lib/iterator/iteration.mapped.d.ts +38 -0
- package/src/lib/iterator/iteration.mapped.js +36 -0
- package/src/lib/iterator/iteration.mapped.js.map +1 -0
- package/src/lib/iterator/iteration.mapped.page.d.ts +25 -0
- package/src/lib/iterator/iteration.mapped.page.js +36 -0
- package/src/lib/iterator/iteration.mapped.page.js.map +1 -0
- package/src/lib/iterator/iteration.next.d.ts +27 -0
- package/src/lib/iterator/iteration.next.js +55 -0
- package/src/lib/iterator/iteration.next.js.map +1 -0
- package/src/lib/iterator/iterator.page.d.ts +172 -0
- package/src/lib/iterator/iterator.page.js +238 -0
- package/src/lib/iterator/iterator.page.js.map +1 -0
- package/src/lib/loading/index.d.ts +7 -0
- package/src/lib/loading/index.js +11 -0
- package/src/lib/loading/index.js.map +1 -0
- package/src/lib/loading/loading.context.d.ts +8 -0
- package/src/lib/loading/loading.context.js +3 -0
- package/src/lib/loading/loading.context.js.map +1 -0
- package/src/lib/loading/loading.context.simple.d.ts +17 -0
- package/src/lib/loading/loading.context.simple.js +40 -0
- package/src/lib/loading/loading.context.simple.js.map +1 -0
- package/src/lib/loading/loading.context.state.d.ts +33 -0
- package/src/lib/loading/loading.context.state.js +52 -0
- package/src/lib/loading/loading.context.state.js.map +1 -0
- package/src/lib/loading/loading.context.state.model.d.ts +18 -0
- package/src/lib/loading/loading.context.state.model.js +37 -0
- package/src/lib/loading/loading.context.state.model.js.map +1 -0
- package/src/lib/loading/loading.context.state.page.d.ts +21 -0
- package/src/lib/loading/loading.context.state.page.js +46 -0
- package/src/lib/loading/loading.context.state.page.js.map +1 -0
- package/src/lib/loading/loading.context.value.d.ts +19 -0
- package/src/lib/loading/loading.context.value.js +36 -0
- package/src/lib/loading/loading.context.value.js.map +1 -0
- package/src/lib/loading/loading.state.d.ts +90 -0
- package/src/lib/loading/loading.state.js +188 -0
- package/src/lib/loading/loading.state.js.map +1 -0
- package/src/lib/lock.d.ts +56 -0
- package/src/lib/lock.js +109 -0
- package/src/lib/lock.js.map +1 -0
- package/src/lib/object.d.ts +10 -0
- package/src/lib/object.js +25 -0
- package/src/lib/object.js.map +1 -0
- package/src/lib/rxjs/array.d.ts +32 -0
- package/src/lib/rxjs/array.js +54 -0
- package/src/lib/rxjs/array.js.map +1 -0
- package/src/lib/rxjs/boolean.d.ts +5 -0
- package/src/lib/rxjs/boolean.js +12 -0
- package/src/lib/rxjs/boolean.js.map +1 -0
- package/src/lib/rxjs/index.d.ts +6 -0
- package/src/lib/rxjs/index.js +10 -0
- package/src/lib/rxjs/index.js.map +1 -0
- package/src/lib/rxjs/loading.d.ts +5 -0
- package/src/lib/rxjs/loading.js +12 -0
- package/src/lib/rxjs/loading.js.map +1 -0
- package/src/lib/rxjs/number.d.ts +5 -0
- package/src/lib/rxjs/number.js +12 -0
- package/src/lib/rxjs/number.js.map +1 -0
- package/src/lib/rxjs/rxjs.d.ts +7 -0
- package/src/lib/rxjs/rxjs.js +32 -0
- package/src/lib/rxjs/rxjs.js.map +1 -0
- package/src/lib/rxjs/value.d.ts +18 -0
- package/src/lib/rxjs/value.js +37 -0
- package/src/lib/rxjs/value.js.map +1 -0
- package/src/lib/subscription.d.ts +28 -0
- package/src/lib/subscription.js +68 -0
- package/src/lib/subscription.js.map +1 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { PageLoadingState } from "../loading";
|
|
2
|
+
import { Destroyable, Filter, Maybe, PageNumber, Page } from "@dereekb/util";
|
|
3
|
+
import { Observable } from "rxjs";
|
|
4
|
+
import { ItemIteratorNextRequest, PageItemIteration } from './iteration';
|
|
5
|
+
export interface ItemPageIteratorRequest<V, F, C extends ItemPageIterationConfig<F> = ItemPageIterationConfig<F>> extends Page {
|
|
6
|
+
/**
|
|
7
|
+
* The base iterator config.
|
|
8
|
+
*/
|
|
9
|
+
readonly iteratorConfig: C;
|
|
10
|
+
/**
|
|
11
|
+
* Page being loaded.
|
|
12
|
+
*/
|
|
13
|
+
readonly page: PageNumber;
|
|
14
|
+
/**
|
|
15
|
+
* Suggested limit of items to load per request.
|
|
16
|
+
*/
|
|
17
|
+
readonly limit?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the last successful item, if available.
|
|
20
|
+
*/
|
|
21
|
+
readonly lastItem$: Observable<Maybe<V>>;
|
|
22
|
+
/**
|
|
23
|
+
* The last successful result object, if available.
|
|
24
|
+
*/
|
|
25
|
+
readonly lastResult$: Observable<Maybe<ItemPageIteratorResult<V>>>;
|
|
26
|
+
/**
|
|
27
|
+
* The last state, if available.
|
|
28
|
+
*/
|
|
29
|
+
readonly lastState$: Observable<Maybe<PageLoadingState<ItemPageIteratorResult<V>>>>;
|
|
30
|
+
}
|
|
31
|
+
export interface ItemPageIteratorResult<V> {
|
|
32
|
+
/**
|
|
33
|
+
* Error result.
|
|
34
|
+
*/
|
|
35
|
+
error?: Error;
|
|
36
|
+
/**
|
|
37
|
+
* Returned values.
|
|
38
|
+
*/
|
|
39
|
+
value?: V;
|
|
40
|
+
/**
|
|
41
|
+
* True if the end has been reached.
|
|
42
|
+
*
|
|
43
|
+
* Alternatively, end is implied if values is undefined or empty.
|
|
44
|
+
*
|
|
45
|
+
* False can be specified to note that despite having no values passed, the end has not yet been reached.
|
|
46
|
+
*/
|
|
47
|
+
end?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface ItemPageIteratorDelegate<V, F, C extends ItemPageIterationConfig<F> = ItemPageIterationConfig<F>> {
|
|
50
|
+
/**
|
|
51
|
+
* Returns an observable of items given the input request.
|
|
52
|
+
*
|
|
53
|
+
* If the input goes out of bounds, the result should be
|
|
54
|
+
*/
|
|
55
|
+
loadItemsForPage: (request: ItemPageIteratorRequest<V, F, C>) => Observable<ItemPageIteratorResult<V>>;
|
|
56
|
+
}
|
|
57
|
+
export interface ItemPageIterationConfig<F = any> extends Filter<F> {
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Default number of pages that can be loaded.
|
|
61
|
+
*/
|
|
62
|
+
export declare const DEFAULT_ITEM_PAGE_ITERATOR_MAX = 100;
|
|
63
|
+
/**
|
|
64
|
+
* Used for generating new iterations.
|
|
65
|
+
*/
|
|
66
|
+
export declare class ItemPageIterator<V, F, C extends ItemPageIterationConfig<F> = any> {
|
|
67
|
+
readonly delegate: ItemPageIteratorDelegate<V, F, C>;
|
|
68
|
+
private _maxPageLoadLimit;
|
|
69
|
+
get maxPageLoadLimit(): number;
|
|
70
|
+
constructor(delegate: ItemPageIteratorDelegate<V, F, C>);
|
|
71
|
+
/**
|
|
72
|
+
* Creates a new instance based on the input config.
|
|
73
|
+
*
|
|
74
|
+
* @param config
|
|
75
|
+
* @returns
|
|
76
|
+
*/
|
|
77
|
+
instance(config: C): ItemPageIterationInstance<V, F, C>;
|
|
78
|
+
}
|
|
79
|
+
export interface ItemPageIterationInstanceState<V> {
|
|
80
|
+
/**
|
|
81
|
+
* Used for tracking the start/end of a specific next call.
|
|
82
|
+
*/
|
|
83
|
+
n: number;
|
|
84
|
+
current: Maybe<PageLoadingState<ItemPageIteratorResult<V>>>;
|
|
85
|
+
latestFinished: Maybe<PageLoadingState<ItemPageIteratorResult<V>>>;
|
|
86
|
+
lastSuccessful: Maybe<PageLoadingState<ItemPageIteratorResult<V>>>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Configured Iterator instance.
|
|
90
|
+
*/
|
|
91
|
+
export declare class ItemPageIterationInstance<V, F, C extends ItemPageIterationConfig<F> = ItemPageIterationConfig<F>> implements PageItemIteration<V, PageLoadingState<V>>, Destroyable {
|
|
92
|
+
readonly iterator: ItemPageIterator<V, F, C>;
|
|
93
|
+
readonly config: C;
|
|
94
|
+
/**
|
|
95
|
+
* Used for triggering loading of more content.
|
|
96
|
+
*/
|
|
97
|
+
private readonly _next;
|
|
98
|
+
private readonly _maxPageLoadLimit;
|
|
99
|
+
constructor(iterator: ItemPageIterator<V, F, C>, config: C);
|
|
100
|
+
readonly state$: Observable<ItemPageIterationInstanceState<V>>;
|
|
101
|
+
/**
|
|
102
|
+
* Used to track when a next() value changes, or the current changes.
|
|
103
|
+
*
|
|
104
|
+
* This returns the n value of next.
|
|
105
|
+
*/
|
|
106
|
+
readonly _nextTrigger$: Observable<ItemPageIterationInstanceState<V>>;
|
|
107
|
+
/**
|
|
108
|
+
* Same as _nextTrigger$, but catches finished loading events.
|
|
109
|
+
*/
|
|
110
|
+
readonly _nextFinished$: Observable<ItemPageIterationInstanceState<V>>;
|
|
111
|
+
/**
|
|
112
|
+
* The current page being loaded or the latest page finished loading.
|
|
113
|
+
*/
|
|
114
|
+
readonly currentPageResultState$: Observable<PageLoadingState<ItemPageIteratorResult<V>>>;
|
|
115
|
+
/**
|
|
116
|
+
* The latest page results that has finished loading.
|
|
117
|
+
*/
|
|
118
|
+
readonly latestPageResultState$: Observable<PageLoadingState<ItemPageIteratorResult<V>>>;
|
|
119
|
+
/**
|
|
120
|
+
* Whether or not the final item has been loaded.
|
|
121
|
+
*
|
|
122
|
+
* This observable will return false to the first listener, and will wait to emit again until the current state has finished loading, if loading.
|
|
123
|
+
*
|
|
124
|
+
* Will emit every time the latest page has finished loading.
|
|
125
|
+
*/
|
|
126
|
+
readonly hasReachedEndResult$: Observable<boolean>;
|
|
127
|
+
private readonly _currentPageResultState$;
|
|
128
|
+
/**
|
|
129
|
+
* Whether or not items are currently being loaded.
|
|
130
|
+
*/
|
|
131
|
+
readonly isLoading$: Observable<boolean>;
|
|
132
|
+
private readonly _lastFinishedPageResultState$;
|
|
133
|
+
private readonly _lastFinishedPageResult$;
|
|
134
|
+
private readonly _lastFinishedPageResultItem$;
|
|
135
|
+
/**
|
|
136
|
+
* The latest page results that has finished loading without an error.
|
|
137
|
+
*/
|
|
138
|
+
readonly latestSuccessfulPageResults$: Observable<PageLoadingState<ItemPageIteratorResult<V>>>;
|
|
139
|
+
get maxPageLoadLimit(): number;
|
|
140
|
+
set maxPageLoadLimit(maxPageLoadLimit: number);
|
|
141
|
+
nextPage(request?: ItemIteratorNextRequest): Promise<number>;
|
|
142
|
+
readonly currentState$: Observable<PageLoadingState<V>>;
|
|
143
|
+
readonly latestLoadedPage$: Observable<PageNumber>;
|
|
144
|
+
readonly numberOfPagesLoaded$: Observable<PageNumber>;
|
|
145
|
+
/**
|
|
146
|
+
* Whether or not there are more results to load.
|
|
147
|
+
*/
|
|
148
|
+
readonly hasNext$: Observable<boolean>;
|
|
149
|
+
/**
|
|
150
|
+
* Whether or not the successfulPageResultsCount has passed the maxPageLoadLimit
|
|
151
|
+
*/
|
|
152
|
+
readonly canLoadMore$: Observable<boolean>;
|
|
153
|
+
/**
|
|
154
|
+
* Observable of whether or not there are items that have finished loading, and if this iterator can load more.
|
|
155
|
+
*/
|
|
156
|
+
readonly hasNextAndCanLoadMore$: Observable<boolean>;
|
|
157
|
+
readonly latestState$: Observable<PageLoadingState<V>>;
|
|
158
|
+
readonly latestItems$: Observable<Maybe<V>>;
|
|
159
|
+
next(request?: ItemIteratorNextRequest): void;
|
|
160
|
+
protected _pushNext(request: ItemIteratorNextRequest): void;
|
|
161
|
+
destroy(): void;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Is considered the "end" result if:
|
|
165
|
+
*
|
|
166
|
+
* - end is true
|
|
167
|
+
* - end is not false and the result value is not empty/null. Uses hasValueOrNotEmpty internally to decide.
|
|
168
|
+
*
|
|
169
|
+
* @param result
|
|
170
|
+
* @returns
|
|
171
|
+
*/
|
|
172
|
+
export declare function isItemPageIteratorResultEndResult<V>(result: ItemPageIteratorResult<V>): boolean;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isItemPageIteratorResultEndResult = exports.ItemPageIterationInstance = exports.ItemPageIterator = exports.DEFAULT_ITEM_PAGE_ITERATOR_MAX = void 0;
|
|
4
|
+
const rxjs_1 = require("../rxjs");
|
|
5
|
+
const operators_1 = require("rxjs/operators");
|
|
6
|
+
const loading_1 = require("../loading");
|
|
7
|
+
const util_1 = require("@dereekb/util");
|
|
8
|
+
const rxjs_2 = require("rxjs");
|
|
9
|
+
const iteration_next_1 = require("./iteration.next");
|
|
10
|
+
// MARK: Iterator
|
|
11
|
+
/**
|
|
12
|
+
* Default number of pages that can be loaded.
|
|
13
|
+
*/
|
|
14
|
+
exports.DEFAULT_ITEM_PAGE_ITERATOR_MAX = 100;
|
|
15
|
+
/**
|
|
16
|
+
* Used for generating new iterations.
|
|
17
|
+
*/
|
|
18
|
+
class ItemPageIterator {
|
|
19
|
+
constructor(delegate) {
|
|
20
|
+
this.delegate = delegate;
|
|
21
|
+
this._maxPageLoadLimit = exports.DEFAULT_ITEM_PAGE_ITERATOR_MAX;
|
|
22
|
+
}
|
|
23
|
+
get maxPageLoadLimit() {
|
|
24
|
+
return this._maxPageLoadLimit;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates a new instance based on the input config.
|
|
28
|
+
*
|
|
29
|
+
* @param config
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
instance(config) {
|
|
33
|
+
return new ItemPageIterationInstance(this, config);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.ItemPageIterator = ItemPageIterator;
|
|
37
|
+
/**
|
|
38
|
+
* Configured Iterator instance.
|
|
39
|
+
*/
|
|
40
|
+
class ItemPageIterationInstance {
|
|
41
|
+
constructor(iterator, config) {
|
|
42
|
+
this.iterator = iterator;
|
|
43
|
+
this.config = config;
|
|
44
|
+
/**
|
|
45
|
+
* Used for triggering loading of more content.
|
|
46
|
+
*/
|
|
47
|
+
this._next = new rxjs_2.BehaviorSubject({ n: 0 });
|
|
48
|
+
this._maxPageLoadLimit = new rxjs_2.BehaviorSubject(this.iterator.maxPageLoadLimit);
|
|
49
|
+
// MARK: State
|
|
50
|
+
this.state$ = this._next.pipe((0, operators_1.delay)(0), (0, rxjs_2.exhaustMap)((request) => (0, rxjs_2.combineLatest)([this.hasNextAndCanLoadMore$, this._lastFinishedPageResultState$]).pipe((0, rxjs_2.first)(), (0, operators_1.map)(([hasNextAndCanLoadMore, prevResult]) => [itemPageIteratorShouldLoadNextPage(request, hasNextAndCanLoadMore, prevResult), prevResult]), (0, operators_1.mergeMap)(([shouldLoadNextPage, prevResult]) => {
|
|
51
|
+
if (shouldLoadNextPage) {
|
|
52
|
+
const nextPageNumber = nextIteratorPageNumber(prevResult); // retry number if error occured
|
|
53
|
+
const page = (0, util_1.filteredPage)(nextPageNumber, this.config);
|
|
54
|
+
const iteratorResultObs = this.iterator.delegate.loadItemsForPage({
|
|
55
|
+
iteratorConfig: this.config,
|
|
56
|
+
page: nextPageNumber,
|
|
57
|
+
lastItem$: this._lastFinishedPageResultItem$,
|
|
58
|
+
lastResult$: this._lastFinishedPageResult$,
|
|
59
|
+
lastState$: this._lastFinishedPageResultState$
|
|
60
|
+
}).pipe((0, operators_1.catchError)((error) => (0, rxjs_2.of)({ error }).pipe((0, rxjs_2.first)())));
|
|
61
|
+
const stateObs = iteratorResultObs.pipe((0, rxjs_2.first)(), (0, operators_1.map)((result) => {
|
|
62
|
+
if (result.error != null) {
|
|
63
|
+
return {
|
|
64
|
+
loading: false,
|
|
65
|
+
page: nextPageNumber,
|
|
66
|
+
error: result.error,
|
|
67
|
+
model: result
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return (0, loading_1.successPageResult)(nextPageNumber, result);
|
|
72
|
+
}
|
|
73
|
+
}), (0, operators_1.startWith)((0, loading_1.beginLoading)(page)), (0, rxjs_2.shareReplay)(1));
|
|
74
|
+
return stateObs;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return (0, rxjs_2.of)(prevResult).pipe();
|
|
78
|
+
}
|
|
79
|
+
}), (0, operators_1.map)((state) => ({ n: request.n, state })))), (0, operators_1.scan)((acc, x) => {
|
|
80
|
+
const { n, state: curr } = x;
|
|
81
|
+
let next = {
|
|
82
|
+
n,
|
|
83
|
+
current: curr,
|
|
84
|
+
latestFinished: acc.latestFinished,
|
|
85
|
+
lastSuccessful: acc.lastSuccessful
|
|
86
|
+
};
|
|
87
|
+
// If it was a replay of the previous result, change nothing.
|
|
88
|
+
if (acc.current !== curr) {
|
|
89
|
+
if ((0, loading_1.loadingStateHasFinishedLoading)(curr)) {
|
|
90
|
+
next.latestFinished = curr;
|
|
91
|
+
if (!(0, loading_1.loadingStateHasError)(curr)) {
|
|
92
|
+
next.lastSuccessful = curr;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return next;
|
|
97
|
+
}, {
|
|
98
|
+
n: -1,
|
|
99
|
+
current: { page: util_1.FIRST_PAGE },
|
|
100
|
+
latestFinished: undefined, lastSuccessful: undefined
|
|
101
|
+
}), (0, rxjs_2.shareReplay)(1));
|
|
102
|
+
/**
|
|
103
|
+
* Used to track when a next() value changes, or the current changes.
|
|
104
|
+
*
|
|
105
|
+
* This returns the n value of next.
|
|
106
|
+
*/
|
|
107
|
+
this._nextTrigger$ = this.state$.pipe((0, operators_1.distinctUntilChanged)((a, b) => a.n === b.n && a.current === b.current), (0, rxjs_2.shareReplay)(1), (0, operators_1.skip)(1) // Wait until a new state is emitted
|
|
108
|
+
);
|
|
109
|
+
/**
|
|
110
|
+
* Same as _nextTrigger$, but catches finished loading events.
|
|
111
|
+
*/
|
|
112
|
+
this._nextFinished$ = this._nextTrigger$.pipe((0, rxjs_2.filter)(x => (0, loading_1.loadingStateHasFinishedLoading)(x.current)));
|
|
113
|
+
/**
|
|
114
|
+
* The current page being loaded or the latest page finished loading.
|
|
115
|
+
*/
|
|
116
|
+
this.currentPageResultState$ = this.state$.pipe((0, operators_1.map)(x => x.current), (0, rxjs_1.filterMaybe)(), (0, rxjs_2.shareReplay)(1));
|
|
117
|
+
/**
|
|
118
|
+
* The latest page results that has finished loading.
|
|
119
|
+
*/
|
|
120
|
+
this.latestPageResultState$ = this.state$.pipe((0, operators_1.map)(x => x.latestFinished), (0, rxjs_1.filterMaybe)(), (0, operators_1.distinctUntilChanged)(), (0, rxjs_2.shareReplay)(1));
|
|
121
|
+
/**
|
|
122
|
+
* Whether or not the final item has been loaded.
|
|
123
|
+
*
|
|
124
|
+
* This observable will return false to the first listener, and will wait to emit again until the current state has finished loading, if loading.
|
|
125
|
+
*
|
|
126
|
+
* Will emit every time the latest page has finished loading.
|
|
127
|
+
*/
|
|
128
|
+
this.hasReachedEndResult$ = this.latestPageResultState$.pipe((0, operators_1.map)(x => isItemPageIteratorResultEndResult(x.model)), (0, operators_1.startWith)(false), // Has not reached the end
|
|
129
|
+
(0, rxjs_2.shareReplay)(1));
|
|
130
|
+
this._currentPageResultState$ = this.currentPageResultState$.pipe((0, operators_1.startWith)(undefined), (0, rxjs_2.shareReplay)(1));
|
|
131
|
+
/**
|
|
132
|
+
* Whether or not items are currently being loaded.
|
|
133
|
+
*/
|
|
134
|
+
this.isLoading$ = this._currentPageResultState$.pipe((0, operators_1.map)(x => (0, loading_1.loadingStateIsLoading)(x)), (0, operators_1.distinctUntilChanged)(), (0, rxjs_2.shareReplay)(1));
|
|
135
|
+
this._lastFinishedPageResultState$ = this.latestPageResultState$.pipe((0, operators_1.startWith)(undefined), (0, rxjs_2.shareReplay)(1));
|
|
136
|
+
this._lastFinishedPageResult$ = this._lastFinishedPageResultState$.pipe((0, operators_1.map)(x => x === null || x === void 0 ? void 0 : x.model));
|
|
137
|
+
this._lastFinishedPageResultItem$ = this._lastFinishedPageResult$.pipe((0, operators_1.map)(x => x === null || x === void 0 ? void 0 : x.value));
|
|
138
|
+
/**
|
|
139
|
+
* The latest page results that has finished loading without an error.
|
|
140
|
+
*/
|
|
141
|
+
this.latestSuccessfulPageResults$ = this.state$.pipe((0, operators_1.map)(x => x.lastSuccessful), (0, rxjs_1.filterMaybe)(), (0, rxjs_2.shareReplay)(1));
|
|
142
|
+
this.currentState$ = this.currentPageResultState$.pipe(mapItemPageLoadingStateFromResultPageLoadingState(), (0, rxjs_2.shareReplay)(1));
|
|
143
|
+
this.latestLoadedPage$ = this.latestPageResultState$.pipe((0, operators_1.map)(x => x.page), (0, operators_1.distinctUntilChanged)(), (0, rxjs_2.shareReplay)(1));
|
|
144
|
+
this.numberOfPagesLoaded$ = this.latestLoadedPage$.pipe((0, operators_1.map)(x => x + 1), (0, rxjs_2.shareReplay)(1));
|
|
145
|
+
// MARK: ItemIteration
|
|
146
|
+
/**
|
|
147
|
+
* Whether or not there are more results to load.
|
|
148
|
+
*/
|
|
149
|
+
this.hasNext$ = this.hasReachedEndResult$.pipe((0, operators_1.map)(x => !x), (0, rxjs_2.shareReplay)(1));
|
|
150
|
+
/**
|
|
151
|
+
* Whether or not the successfulPageResultsCount has passed the maxPageLoadLimit
|
|
152
|
+
*/
|
|
153
|
+
this.canLoadMore$ = (0, rxjs_2.combineLatest)([this._maxPageLoadLimit, this.numberOfPagesLoaded$.pipe((0, operators_1.startWith)(0))]).pipe((0, operators_1.map)(([maxPageLoadLimit, numberOfPagesLoaded]) => numberOfPagesLoaded < maxPageLoadLimit), (0, operators_1.distinctUntilChanged)(), (0, rxjs_2.shareReplay)(1));
|
|
154
|
+
/**
|
|
155
|
+
* Observable of whether or not there are items that have finished loading, and if this iterator can load more.
|
|
156
|
+
*/
|
|
157
|
+
this.hasNextAndCanLoadMore$ = (0, iteration_next_1.iterationHasNextAndCanLoadMore)(this);
|
|
158
|
+
this.latestState$ = this.latestPageResultState$.pipe(mapItemPageLoadingStateFromResultPageLoadingState(), (0, rxjs_2.shareReplay)(1));
|
|
159
|
+
this.latestItems$ = this.latestState$.pipe((0, operators_1.distinctUntilChanged)(), (0, operators_1.map)(x => x.model), (0, rxjs_2.shareReplay)(1));
|
|
160
|
+
}
|
|
161
|
+
// MARK: PageItemIteration
|
|
162
|
+
get maxPageLoadLimit() {
|
|
163
|
+
return this._maxPageLoadLimit.value;
|
|
164
|
+
}
|
|
165
|
+
set maxPageLoadLimit(maxPageLoadLimit) {
|
|
166
|
+
this._maxPageLoadLimit.next(Math.max(0, Math.ceil(maxPageLoadLimit)));
|
|
167
|
+
}
|
|
168
|
+
nextPage(request = {}) {
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
this._nextFinished$.pipe((0, rxjs_2.exhaustMap)(() => this.latestPageResultState$), (0, rxjs_2.first)()).subscribe({
|
|
171
|
+
next: (latestState) => {
|
|
172
|
+
if (latestState.error) {
|
|
173
|
+
reject(latestState.error);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
resolve(latestState.page);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
this.next(request);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
next(request = {}) {
|
|
184
|
+
this._pushNext(request);
|
|
185
|
+
}
|
|
186
|
+
_pushNext(request) {
|
|
187
|
+
this._next.next({
|
|
188
|
+
n: this._next.value.n + 1,
|
|
189
|
+
retry: request.retry,
|
|
190
|
+
page: request.page
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// MARK: Destroyable
|
|
194
|
+
destroy() {
|
|
195
|
+
this._next.complete();
|
|
196
|
+
this._maxPageLoadLimit.complete();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.ItemPageIterationInstance = ItemPageIterationInstance;
|
|
200
|
+
// MARK: Utility
|
|
201
|
+
/**
|
|
202
|
+
* Is considered the "end" result if:
|
|
203
|
+
*
|
|
204
|
+
* - end is true
|
|
205
|
+
* - end is not false and the result value is not empty/null. Uses hasValueOrNotEmpty internally to decide.
|
|
206
|
+
*
|
|
207
|
+
* @param result
|
|
208
|
+
* @returns
|
|
209
|
+
*/
|
|
210
|
+
function isItemPageIteratorResultEndResult(result) {
|
|
211
|
+
if (result.error != null) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
else if (result.end != null) {
|
|
215
|
+
return result.end;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
return !(0, util_1.hasValueOrNotEmpty)(result);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.isItemPageIteratorResultEndResult = isItemPageIteratorResultEndResult;
|
|
222
|
+
function itemPageIteratorShouldLoadNextPage(request, hasNextAndCanLoadMore, prevResult) {
|
|
223
|
+
return hasNextAndCanLoadMore && // Must be able to load more
|
|
224
|
+
Boolean((!(0, loading_1.loadingStateHasError)(prevResult)) || request.retry) && // Must not have any errors
|
|
225
|
+
Boolean(request.page == null || (nextIteratorPageNumber(prevResult) === request.page)); // Must match the page, if provided
|
|
226
|
+
}
|
|
227
|
+
function nextIteratorPageNumber(prevResult) {
|
|
228
|
+
return (0, loading_1.loadingStateHasError)(prevResult) ? prevResult.page : (0, util_1.getNextPageNumber)(prevResult);
|
|
229
|
+
}
|
|
230
|
+
function mapItemPageLoadingStateFromResultPageLoadingState() {
|
|
231
|
+
return (0, operators_1.map)(itemPageLoadingStateFromResultPageLoadingState);
|
|
232
|
+
}
|
|
233
|
+
function itemPageLoadingStateFromResultPageLoadingState(input) {
|
|
234
|
+
return (0, loading_1.mapLoadingStateResults)(input, {
|
|
235
|
+
mapValue: (result) => result.value
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=iterator.page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterator.page.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/iterator/iterator.page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './loading.context.state';
|
|
2
|
+
export * from './loading.context.state.page';
|
|
3
|
+
export * from './loading.context.state.model';
|
|
4
|
+
export * from './loading.context.simple';
|
|
5
|
+
export * from './loading.context';
|
|
6
|
+
export * from './loading.context.value';
|
|
7
|
+
export * from './loading.state';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
(0, tslib_1.__exportStar)(require("./loading.context.state"), exports);
|
|
5
|
+
(0, tslib_1.__exportStar)(require("./loading.context.state.page"), exports);
|
|
6
|
+
(0, tslib_1.__exportStar)(require("./loading.context.state.model"), exports);
|
|
7
|
+
(0, tslib_1.__exportStar)(require("./loading.context.simple"), exports);
|
|
8
|
+
(0, tslib_1.__exportStar)(require("./loading.context"), exports);
|
|
9
|
+
(0, tslib_1.__exportStar)(require("./loading.context.value"), exports);
|
|
10
|
+
(0, tslib_1.__exportStar)(require("./loading.state"), exports);
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/index.ts"],"names":[],"mappings":";;;AAAA,uEAAwC;AACxC,4EAA6C;AAC7C,6EAA8C;AAC9C,wEAAyC;AACzC,iEAAkC;AAClC,uEAAwC;AACxC,+DAAgC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { LoadingErrorPair } from './loading.state';
|
|
3
|
+
export interface LoadingContextEvent extends LoadingErrorPair {
|
|
4
|
+
loading: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface LoadingContext {
|
|
7
|
+
readonly stream$: Observable<LoadingContextEvent>;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.context.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { LoadingContext, LoadingContextEvent } from './loading.context';
|
|
3
|
+
/**
|
|
4
|
+
* Simple LoadingContext implementation
|
|
5
|
+
*/
|
|
6
|
+
export declare class SimpleLoadingContext implements LoadingContext {
|
|
7
|
+
private _subject;
|
|
8
|
+
private _error;
|
|
9
|
+
constructor(loading?: boolean);
|
|
10
|
+
destroy(): void;
|
|
11
|
+
hasError(): boolean;
|
|
12
|
+
clearError(): void;
|
|
13
|
+
get stream$(): Observable<LoadingContextEvent>;
|
|
14
|
+
setSuccess(): void;
|
|
15
|
+
setLoading(loading?: boolean): void;
|
|
16
|
+
setError(error: any, loading?: boolean): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimpleLoadingContext = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
/**
|
|
6
|
+
* Simple LoadingContext implementation
|
|
7
|
+
*/
|
|
8
|
+
class SimpleLoadingContext {
|
|
9
|
+
constructor(loading = true) {
|
|
10
|
+
this._subject = new rxjs_1.BehaviorSubject({ loading });
|
|
11
|
+
}
|
|
12
|
+
destroy() {
|
|
13
|
+
this._subject.complete();
|
|
14
|
+
}
|
|
15
|
+
hasError() {
|
|
16
|
+
return Boolean(this._error);
|
|
17
|
+
}
|
|
18
|
+
clearError() {
|
|
19
|
+
delete this._error;
|
|
20
|
+
}
|
|
21
|
+
get stream$() {
|
|
22
|
+
return this._subject.asObservable();
|
|
23
|
+
}
|
|
24
|
+
setSuccess() {
|
|
25
|
+
this.setLoading(false);
|
|
26
|
+
}
|
|
27
|
+
setLoading(loading = true) {
|
|
28
|
+
this._subject.next({
|
|
29
|
+
loading
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
setError(error, loading = false) {
|
|
33
|
+
this._subject.next({
|
|
34
|
+
loading,
|
|
35
|
+
error
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.SimpleLoadingContext = SimpleLoadingContext;
|
|
40
|
+
//# sourceMappingURL=loading.context.simple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.context.simple.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.context.simple.ts"],"names":[],"mappings":";;;AAAA,+BAAmD;AAGnD;;GAEG;AACH,MAAa,oBAAoB;IAK/B,YAAY,OAAO,GAAG,IAAI;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAe,CAAsB,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEM,QAAQ;QACb,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAEM,UAAU;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAEM,UAAU,CAAC,UAAmB,IAAI;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,KAAU,EAAE,UAAmB,KAAK;QAClD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,OAAO;YACP,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CAEF;AA1CD,oDA0CC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Maybe, Destroyable } from '@dereekb/util';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { LoadingContext, LoadingContextEvent } from './loading.context';
|
|
4
|
+
import { LoadingState } from './loading.state';
|
|
5
|
+
export interface AbstractLoadingStateLoadingEvent<T = any> extends LoadingContextEvent {
|
|
6
|
+
model?: Maybe<T>;
|
|
7
|
+
}
|
|
8
|
+
export interface AbstractLoadingEventForLoadingPairConfig<S extends LoadingState = LoadingState> {
|
|
9
|
+
/**
|
|
10
|
+
* The initial observable.
|
|
11
|
+
*/
|
|
12
|
+
obs?: Observable<S>;
|
|
13
|
+
/**
|
|
14
|
+
* Whether or not to show loading if a model is defined.
|
|
15
|
+
*/
|
|
16
|
+
showLoadingOnNoModel?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Abstract LoadingContext implementation using LoadingState.
|
|
20
|
+
*/
|
|
21
|
+
export declare abstract class AbstractLoadingStateLoadingContext<T = any, S extends LoadingState<T> = LoadingState<T>, E extends LoadingContextEvent = LoadingContextEvent, C extends AbstractLoadingEventForLoadingPairConfig<S> = AbstractLoadingEventForLoadingPairConfig<S>> implements LoadingContext, Destroyable {
|
|
22
|
+
private _stateSubject$;
|
|
23
|
+
private _config;
|
|
24
|
+
readonly stateSubject$: Observable<Observable<S>>;
|
|
25
|
+
readonly state$: Observable<S>;
|
|
26
|
+
readonly stateObs$: Observable<Maybe<Observable<S>>>;
|
|
27
|
+
readonly stream$: Observable<E>;
|
|
28
|
+
readonly loading$: Observable<boolean>;
|
|
29
|
+
constructor(config?: Observable<S> | C);
|
|
30
|
+
protected abstract loadingEventForLoadingPair(state: S, config: C): E;
|
|
31
|
+
setStateObs(state: Observable<S>): void;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AbstractLoadingStateLoadingContext = void 0;
|
|
4
|
+
const rxjs_1 = require("@dereekb/rxjs");
|
|
5
|
+
const rxjs_2 = require("rxjs");
|
|
6
|
+
const operators_1 = require("rxjs/operators");
|
|
7
|
+
/**
|
|
8
|
+
* Abstract LoadingContext implementation using LoadingState.
|
|
9
|
+
*/
|
|
10
|
+
class AbstractLoadingStateLoadingContext {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this._stateSubject$ = new rxjs_2.BehaviorSubject(undefined);
|
|
13
|
+
this.stateSubject$ = this._stateSubject$.pipe((0, rxjs_1.filterMaybe)(), (0, operators_1.distinctUntilChanged)(), (0, operators_1.shareReplay)(1));
|
|
14
|
+
this.state$ = this.stateSubject$.pipe((0, operators_1.switchMap)(x => x), (0, operators_1.shareReplay)(1));
|
|
15
|
+
this.stateObs$ = this._stateSubject$.asObservable();
|
|
16
|
+
this.stream$ = this._stateSubject$.pipe((0, operators_1.mergeMap)((obs) => {
|
|
17
|
+
const start = {
|
|
18
|
+
loading: true
|
|
19
|
+
};
|
|
20
|
+
if (obs) {
|
|
21
|
+
return obs.pipe((0, operators_1.startWith)(start), // Always start with loading. Observable may not always update immediately.
|
|
22
|
+
(0, operators_1.map)((x) => this.loadingEventForLoadingPair(x, this._config)));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return (0, rxjs_2.of)(start);
|
|
26
|
+
}
|
|
27
|
+
}), (0, operators_1.debounceTime)(0), // Debounce emissions
|
|
28
|
+
(0, operators_1.shareReplay)(1));
|
|
29
|
+
this.loading$ = this.stream$.pipe((0, operators_1.map)(x => x.loading), (0, operators_1.shareReplay)(1));
|
|
30
|
+
if ((0, rxjs_2.isObservable)(config)) {
|
|
31
|
+
this._config = {
|
|
32
|
+
obs: config
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this._config = config !== null && config !== void 0 ? config : {
|
|
37
|
+
showLoadingOnNoModel: false
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (this._config.obs) {
|
|
41
|
+
this.setStateObs(this._config.obs);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
setStateObs(state) {
|
|
45
|
+
this._stateSubject$.next(state);
|
|
46
|
+
}
|
|
47
|
+
destroy() {
|
|
48
|
+
this._stateSubject$.complete();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.AbstractLoadingStateLoadingContext = AbstractLoadingStateLoadingContext;
|
|
52
|
+
//# sourceMappingURL=loading.context.state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.context.state.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.context.state.ts"],"names":[],"mappings":";;;AACA,wCAA4C;AAC5C,+BAAqE;AACrE,8CAAsH;AAoBtH;;GAEG;AACH,MAAsB,kCAAkC;IA8BtD,YAAY,MAA0B;QA5B9B,mBAAc,GAAG,IAAI,sBAAe,CAAuB,SAAS,CAAC,CAAC;QAGrE,kBAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAA,kBAAW,GAAE,EAAE,IAAA,gCAAoB,GAAE,EAAE,IAAA,uBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QAChG,WAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAA,qBAAS,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAA,uBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QACpE,cAAS,GAAqC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QAEjF,YAAO,GAAkB,IAAI,CAAC,cAAc,CAAC,IAAI,CACxD,IAAA,oBAAQ,EAAC,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,IAAI;aACT,CAAC;YAEP,IAAI,GAAG,EAAE;gBACP,OAAO,GAAG,CAAC,IAAI,CACb,IAAA,qBAAS,EAAC,KAAiB,CAAC,EAAE,2EAA2E;gBACzG,IAAA,eAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAC7D,CAAC;aACH;iBAAM;gBACL,OAAO,IAAA,SAAE,EAAC,KAAK,CAAC,CAAC;aAClB;QACH,CAAC,CAAC,EACF,IAAA,wBAAY,EAAC,CAAC,CAAC,EAAG,qBAAqB;QACvC,IAAA,uBAAW,EAAC,CAAC,CAAC,CACf,CAAC;QAEO,aAAQ,GAAwB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,eAAG,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAA,uBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QAG9F,IAAI,IAAA,mBAAY,EAAC,MAAM,CAAC,EAAE;YACxB,IAAI,CAAC,OAAO,GAAG;gBACb,GAAG,EAAE,MAAM;aACP,CAAC;SACR;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI;gBACvB,oBAAoB,EAAE,KAAK;aACvB,CAAC;SACR;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACpC;IACH,CAAC;IAID,WAAW,CAAC,KAAoB;QAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;CAEF;AAxDD,gFAwDC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Maybe } from '@dereekb/util';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { LoadingContextEvent } from './loading.context';
|
|
4
|
+
import { AbstractLoadingEventForLoadingPairConfig, AbstractLoadingStateLoadingContext } from './loading.context.state';
|
|
5
|
+
import { LoadingState } from './loading.state';
|
|
6
|
+
export interface LoadingStateLoadingEvent<T = any> extends LoadingContextEvent {
|
|
7
|
+
model?: Maybe<T>;
|
|
8
|
+
}
|
|
9
|
+
export interface LoadingEventForLoadingPairConfig<S extends LoadingState = LoadingState> extends AbstractLoadingEventForLoadingPairConfig<S> {
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* LoadingContext implementation for a LoadingState.
|
|
13
|
+
*/
|
|
14
|
+
export declare class LoadingStateLoadingContext<T = any, S extends LoadingState<T> = LoadingState<T>> extends AbstractLoadingStateLoadingContext<T, S, LoadingStateLoadingEvent<T>, LoadingEventForLoadingPairConfig<S>> {
|
|
15
|
+
readonly model$: Observable<Maybe<T>>;
|
|
16
|
+
readonly modelAfterLoaded$: Observable<Maybe<T>>;
|
|
17
|
+
protected loadingEventForLoadingPair(pair: S, { showLoadingOnNoModel }?: LoadingEventForLoadingPairConfig): LoadingStateLoadingEvent<T>;
|
|
18
|
+
}
|