From 3da38d6e9f8d600476be276666ac7223aa5f172c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 2 Aug 2021 15:29:09 +0200 Subject: Fetch things in bulk for the homepage --- client/src/app/helpers/index.ts | 1 + client/src/app/helpers/rxjs.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 client/src/app/helpers/rxjs.ts (limited to 'client/src/app/helpers') diff --git a/client/src/app/helpers/index.ts b/client/src/app/helpers/index.ts index cc61255ba..beff749ec 100644 --- a/client/src/app/helpers/index.ts +++ b/client/src/app/helpers/index.ts @@ -1,5 +1,6 @@ export * from './locales' export * from './constants' export * from './i18n-utils' +export * from './rxjs' export * from './utils' export * from './zone' diff --git a/client/src/app/helpers/rxjs.ts b/client/src/app/helpers/rxjs.ts new file mode 100644 index 000000000..eb051f868 --- /dev/null +++ b/client/src/app/helpers/rxjs.ts @@ -0,0 +1,29 @@ +import { uniq } from 'lodash-es' +import { asyncScheduler, Observable } from 'rxjs' +import { bufferTime, distinctUntilChanged, filter, map, observeOn, share, switchMap } from 'rxjs/operators' +import { NgZone } from '@angular/core' +import { enterZone, leaveZone } from './zone' + +function buildBulkObservable (options: { + ngZone: NgZone + notifierObservable: Observable + time: number + bulkGet: (params: T[]) => Observable +}) { + const { ngZone, notifierObservable, time, bulkGet } = options + + return notifierObservable.pipe( + distinctUntilChanged(), + // We leave Angular zone so Protractor does not get stuck + bufferTime(time, leaveZone(ngZone, asyncScheduler)), + filter(params => params.length !== 0), + map(params => uniq(params)), + observeOn(enterZone(ngZone, asyncScheduler)), + switchMap(params => bulkGet(params)), + share() + ) +} + +export { + buildBulkObservable +} -- cgit v1.2.3