@alauda-fe/common
Version:
Alauda frontend team common codes.
63 lines • 12.3 kB
JavaScript
/**
* @packageDocumentation
* @module async-data
*/
import { get, isEqual } from 'lodash-es';
import { Subject, combineLatest, interval, merge, of, catchError, distinctUntilChanged, filter, map, scan, startWith, switchMap, tap, } from 'rxjs';
import { publishRef } from '../core/public-api';
export class AsyncDataLoader {
constructor(config) {
this.reloadAction$$ = new Subject();
this.dataMapper$$ = new Subject();
this.snapshot = {
params: null,
data: null,
loading: false,
error: null,
};
const { params$, params, dataFilter, silent } = config;
const queryParams$ = params$ || of(params || null);
this.loadState$ = combineLatest([
queryParams$,
this.reloadAction$$.pipe(startWith(null)),
]).pipe(switchMap(([queryParams, startData]) => {
this.snapshot.params = queryParams;
return this.buildFetcher(config)(queryParams).pipe(map(data => ({ data })), catchError((error) => of({ error })), startWith({
data: startData || null,
loading: !startData,
}));
}), map(state => ({
data: null,
loading: false,
error: null,
...state,
})), publishRef());
this.rawData$ = merge(this.loadState$.pipe(map(state => (prev) => state.loading && silent ? prev : state.data)), this.dataMapper$$).pipe(scan((acc, mapper) => mapper(acc), null), tap(data => {
this.snapshot.data = data;
}), publishRef());
this.data$ = this.rawData$.pipe(filter(dataFilter ?? (data => !!data)), publishRef());
this.loading$ = this.loadState$.pipe(map(state => state.loading), distinctUntilChanged(), tap(loading => {
this.snapshot.loading = loading;
}), publishRef());
this.error$ = this.loadState$.pipe(map(state => state.error), distinctUntilChanged(), tap(error => {
this.snapshot.error = error;
}), publishRef());
}
reload(data) {
this.reloadAction$$.next(data);
}
mapData(mapper) {
this.dataMapper$$.next(mapper);
}
buildFetcher(config) {
const { fetcher, interval: period, intervalFilter, compare, } = config;
if (!period) {
return fetcher;
}
const compareFn = Array.isArray(compare)
? (a, b) => isEqual(get(a, compare), get(b, compare))
: compare;
return params => interval(period).pipe(filter(intervalFilter ?? (() => true)), startWith(0), switchMap(() => fetcher(params)), distinctUntilChanged(compareFn));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtZGF0YS1sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvYXN5bmMtZGF0YS9hc3luYy1kYXRhLWxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBRUwsT0FBTyxFQUNQLGFBQWEsRUFDYixRQUFRLEVBQ1IsS0FBSyxFQUNMLEVBQUUsRUFDRixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBaUIzRCxNQUFNLE9BQU8sZUFBZTtJQW9CMUIsWUFBWSxNQUEyRDtRQWpCdEQsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBWSxDQUFDO1FBQ3pDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFFN0QsYUFBUSxHQUErRDtZQUNyRSxNQUFNLEVBQUUsSUFBSTtZQUNaLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFLEtBQUs7WUFDZCxLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUM7UUFVQSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRXZELE1BQU0sWUFBWSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQzlCLFlBQVk7WUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBUyxDQUFDLENBQUM7U0FDL0Ms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QUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxZQUFZLENBQ2xCLE1BQTJEO1FBRTNELE1BQU0sRUFDSixPQUFPLEVBQ1AsUUFBUSxFQUFFLE1BQU0sRUFDaEIsY0FBYyxFQUNkLE9BQU8sR0FDUixHQUFHLE1BQXdDLENBQUM7UUFFN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUksRUFBRSxDQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVaLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FDZCxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNuQixNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDdEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNaLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDaEMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQ2hDLENBQUM7SUFDTixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBhc3luYy1kYXRhXG4gKi9cblxuaW1wb3J0IHsgZ2V0LCBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGludGVydmFsLFxuICBtZXJnZSxcbiAgb2YsXG4gIGNhdGNoRXJyb3IsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFN0cmluZ01hcCwgcHVibGlzaFJlZiB9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7XG4gIERhdGFFcnJvcixcbiAgRGF0YU1hcHBlcixcbiAgRGF0YVN0YXRlQWRhcHRlcixcbiAgRmV0Y2hlcixcbiAgTG9hZGVyQ29uZmlnLFxuICBMb2FkZXJDb25maWdXaXRoSW50ZXJ2YWwsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jTG9hZFN0YXRlPEQ+IHtcbiAgZGF0YT86IEQ7XG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICBlcnJvcj86IERhdGFFcnJvcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jRGF0YUxvYWRlcjxEID0gdW5rbm93biwgUCA9IFN0cmluZ01hcD5cbiAgaW1wbGVtZW50cyBEYXRhU3RhdGVBZGFwdGVyPEQ+XG57XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVsb2FkQWN0aW9uJCQgPSBuZXcgU3ViamVjdDx2b2lkIHwgRD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhTWFwcGVyJCQgPSBuZXcgU3ViamVjdDxEYXRhTWFwcGVyPEQ+PigpO1xuXG4gIHNuYXBzaG90OiB7IGRhdGE6IEQ7IHBhcmFtczogUDsgbG9hZGluZzogYm9vbGVhbjsgZXJyb3I6IERhdGFFcnJvciB9ID0ge1xuICAgIHBhcmFtczogbnVsbCxcbiAgICBkYXRhOiBudWxsLFxuICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgIGVycm9yOiBudWxsLFxuICB9O1xuXG4gIGxvYWRTdGF0ZSQ6IE9ic2VydmFibGU8QXN5bmNMb2FkU3RhdGU8RD4+O1xuXG4gIHJhd0RhdGEkOiBPYnNlcnZhYmxlPEQ+O1xuICBkYXRhJDogT2JzZXJ2YWJsZTxEPjtcbiAgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIGVycm9yJDogT2JzZXJ2YWJsZTxEYXRhRXJyb3I+O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9hZGVyQ29uZmlnPEQsIFA+IHwgTG9hZGVyQ29uZmlnV2l0aEludGVydmFsPEQsIFA+KSB7XG4gICAgY29uc3QgeyBwYXJhbXMkLCBwYXJhbXMsIGRhdGFGaWx0ZXIsIHNpbGVudCB9ID0gY29uZmlnO1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMkID0gcGFyYW1zJCB8fCBvZihwYXJhbXMgfHwgbnVsbCk7XG5cbiAgICB0aGlzLmxvYWRTdGF0ZSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHF1ZXJ5UGFyYW1zJCxcbiAgICAgIHRoaXMucmVsb2FkQWN0aW9uJCQucGlwZShzdGFydFdpdGgobnVsbCBhcyBEKSksXG4gICAgXSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW3F1ZXJ5UGFyYW1zLCBzdGFydERhdGFdKSA9PiB7XG4gICAgICAgIHRoaXMuc25hcHNob3QucGFyYW1zID0gcXVlcnlQYXJhbXM7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkRmV0Y2hlcihjb25maWcpKHF1ZXJ5UGFyYW1zKS5waXBlKFxuICAgICAgICAgIG1hcChkYXRhID0+ICh7IGRhdGEgfSkpLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBEYXRhRXJyb3IpID0+IG9mKHsgZXJyb3IgfSkpLFxuICAgICAgICAgIHN0YXJ0V2l0aCh7XG4gICAgICAgICAgICBkYXRhOiBzdGFydERhdGEgfHwgbnVsbCxcbiAgICAgICAgICAgIGxvYWRpbmc6ICFzdGFydERhdGEsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIG1hcChzdGF0ZSA9PiAoe1xuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgfSkpLFxuICAgICAgcHVibGlzaFJlZigpLFxuICAgICk7XG5cbiAgICB0aGlzLnJhd0RhdGEkID0gbWVyZ2UoXG4gICAgICB0aGlzLmxvYWRTdGF0ZSQucGlwZShcbiAgICAgICAgbWFwKHN0YXRlID0+IChwcmV2OiBEKSA9PiBzdGF0ZS5sb2FkaW5nICYmIHNpbGVudCA/IHByZXYgOiBzdGF0ZS5kYXRhKSxcbiAgICAgICksXG4gICAgICB0aGlzLmRhdGFNYXBwZXIkJCxcbiAgICApLnBpcGUoXG4gICAgICBzY2FuPERhdGFNYXBwZXI8RD4sIEQ+KChhY2MsIG1hcHBlcikgPT4gbWFwcGVyKGFjYyksIG51bGwpLFxuICAgICAgdGFwKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLnNuYXBzaG90LmRhdGEgPSBkYXRhO1xuICAgICAgfSksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICAgIHRoaXMuZGF0YSQgPSB0aGlzLnJhd0RhdGEkLnBpcGUoXG4gICAgICBmaWx0ZXIoZGF0YUZpbHRlciA/PyAoZGF0YSA9PiAhIWRhdGEpKSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuXG4gICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKFxuICAgICAgbWFwKHN0YXRlID0+IHN0YXRlLmxvYWRpbmcpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRhcChsb2FkaW5nID0+IHtcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5sb2FkaW5nID0gbG9hZGluZztcbiAgICAgIH0pLFxuICAgICAgcHVibGlzaFJlZigpLFxuICAgICk7XG5cbiAgICB0aGlzLmVycm9yJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKFxuICAgICAgbWFwKHN0YXRlID0+IHN0YXRlLmVycm9yKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICB0YXAoZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLnNuYXBzaG90LmVycm9yID0gZXJyb3I7XG4gICAgICB9KSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuICB9XG5cbiAgcmVsb2FkKGRhdGE/OiBEKSB7XG4gICAgdGhpcy5yZWxvYWRBY3Rpb24kJC5uZXh0KGRhdGEpO1xuICB9XG5cbiAgbWFwRGF0YShtYXBwZXI6IERhdGFNYXBwZXI8RD4pIHtcbiAgICB0aGlzLmRhdGFNYXBwZXIkJC5uZXh0KG1hcHBlcik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmV0Y2hlcihcbiAgICBjb25maWc6IExvYWRlckNvbmZpZzxELCBQPiB8IExvYWRlckNvbmZpZ1dpdGhJbnRlcnZhbDxELCBQPixcbiAgKTogRmV0Y2hlcjxELCBQPiB7XG4gICAgY29uc3Qge1xuICAgICAgZmV0Y2hlcixcbiAgICAgIGludGVydmFsOiBwZXJpb2QsXG4gICAgICBpbnRlcnZhbEZpbHRlcixcbiAgICAgIGNvbXBhcmUsXG4gICAgfSA9IGNvbmZpZyBhcyBMb2FkZXJDb25maWdXaXRoSW50ZXJ2YWw8RCwgUD47XG5cbiAgICBpZiAoIXBlcmlvZCkge1xuICAgICAgcmV0dXJuIGZldGNoZXI7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZUZuID0gQXJyYXkuaXNBcnJheShjb21wYXJlKVxuICAgICAgPyAoYTogRCwgYjogRCkgPT4gaXNFcXVhbChnZXQoYSwgY29tcGFyZSksIGdldChiLCBjb21wYXJlKSlcbiAgICAgIDogY29tcGFyZTtcblxuICAgIHJldHVybiBwYXJhbXMgPT5cbiAgICAgIGludGVydmFsKHBlcmlvZCkucGlwZShcbiAgICAgICAgZmlsdGVyKGludGVydmFsRmlsdGVyID8/ICgoKSA9PiB0cnVlKSksXG4gICAgICAgIHN0YXJ0V2l0aCgwKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZldGNoZXIocGFyYW1zKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGNvbXBhcmVGbiksXG4gICAgICApO1xuICB9XG59XG4iXX0=