@spartacus/core
Version:
Spartacus - the core framework
85 lines • 14.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, EMPTY, iif, isObservable, merge, of, Subscription, using, } from 'rxjs';
import { catchError, distinctUntilChanged, pluck, share, switchMapTo, takeUntil, tap, } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../../event/event.service";
export class QueryService {
constructor(eventService) {
this.eventService = eventService;
this.subscriptions = new Subscription();
}
create(loaderFactory, options) {
var _a, _b, _c, _d, _e, _f;
const initialState = {
data: undefined,
error: false,
loading: true,
};
const state$ = new BehaviorSubject(initialState);
// if the query will be unsubscribed from while the data is being loaded, we will end up with the loading flag set to true
// we want to retry this load on next subscription
const onSubscribeLoad$ = iif(() => state$.value.loading, of(undefined));
const loadTrigger$ = this.getTriggersStream([
onSubscribeLoad$,
...((_a = options === null || options === void 0 ? void 0 : options.reloadOn) !== null && _a !== void 0 ? _a : []),
...((_b = options === null || options === void 0 ? void 0 : options.resetOn) !== null && _b !== void 0 ? _b : []),
]);
const resetTrigger$ = this.getTriggersStream((_c = options === null || options === void 0 ? void 0 : options.resetOn) !== null && _c !== void 0 ? _c : []);
const reloadTrigger$ = this.getTriggersStream((_d = options === null || options === void 0 ? void 0 : options.reloadOn) !== null && _d !== void 0 ? _d : []);
const load$ = loadTrigger$.pipe(tap(() => {
if (!state$.value.loading) {
state$.next(Object.assign(Object.assign({}, state$.value), { loading: true }));
}
}), switchMapTo(loaderFactory().pipe(takeUntil(resetTrigger$))), tap((data) => {
state$.next({ loading: false, error: false, data });
}), catchError((error, retryStream$) => {
state$.next({ loading: false, error, data: undefined });
return retryStream$;
}), share());
// reload logic
if ((_e = options === null || options === void 0 ? void 0 : options.reloadOn) === null || _e === void 0 ? void 0 : _e.length) {
this.subscriptions.add(reloadTrigger$.subscribe(() => {
if (!state$.value.loading) {
state$.next(Object.assign(Object.assign({}, state$.value), { loading: true }));
}
}));
}
// reset logic
if ((_f = options === null || options === void 0 ? void 0 : options.resetOn) === null || _f === void 0 ? void 0 : _f.length) {
this.subscriptions.add(resetTrigger$.subscribe(() => {
if (state$.value.data !== undefined ||
state$.value.error !== false ||
state$.value.loading !== false) {
state$.next(initialState);
}
}));
}
const query$ = using(() => load$.subscribe(), () => state$);
const data$ = query$.pipe(pluck('data'), distinctUntilChanged());
return { get: () => data$, getState: () => query$ };
}
getTriggersStream(triggers) {
if (!triggers.length) {
return EMPTY;
}
const observables = triggers.map((trigger) => {
if (isObservable(trigger)) {
return trigger;
}
return this.eventService.get(trigger);
});
return merge(...observables);
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
QueryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: QueryService, deps: [{ token: i1.EventService }], target: i0.ɵɵFactoryTarget.Injectable });
QueryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: QueryService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: QueryService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.EventService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWwvY29tbWFuZC1xdWVyeS9xdWVyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFDTCxlQUFlLEVBQ2YsS0FBSyxFQUNMLEdBQUcsRUFDSCxZQUFZLEVBQ1osS0FBSyxFQUVMLEVBQUUsRUFDRixZQUFZLEVBQ1osS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDOzs7QUFvQnhCLE1BQU0sT0FBTyxZQUFZO0lBR3ZCLFlBQXNCLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRnRDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVNLENBQUM7SUFFcEQsTUFBTSxDQUNKLGFBQWtDLEVBQ2xDLE9BR0M7O1FBRUQsTUFBTSxZQUFZLEdBQWtCO1lBQ2xDLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLEtBQUs7WUFDWixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsWUFBWSxDQUFDLENBQUM7UUFFaEUsMEhBQTBIO1FBQzFILGtEQUFrRDtRQUNsRCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDMUMsZ0JB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QU0sQ0FBQyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUVqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQXlCO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1lBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7O3lHQXJHVSxZQUFZOzZHQUFaLFlBQVksY0FGWCxNQUFNOzJGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIEVNUFRZLFxuICBpaWYsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBTdWJzY3JpcHRpb24sXG4gIHVzaW5nLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBwbHVjayxcbiAgc2hhcmUsXG4gIHN3aXRjaE1hcFRvLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXZlbnQvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDeEV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnQvY3gtZXZlbnQnO1xuXG5leHBvcnQgdHlwZSBRdWVyeU5vdGlmaWVyID0gT2JzZXJ2YWJsZTx1bmtub3duPiB8IFR5cGU8Q3hFdmVudD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlTdGF0ZTxUPiB7XG4gIGxvYWRpbmc6IGJvb2xlYW47XG4gIGVycm9yOiBmYWxzZSB8IEVycm9yO1xuICBkYXRhOiBUIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5PFQsIFAgZXh0ZW5kcyB1bmtub3duW10gPSBbXT4ge1xuICBnZXQoLi4ucGFyYW1zOiBQKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0U3RhdGUoLi4ucGFyYW1zOiBQKTogT2JzZXJ2YWJsZTxRdWVyeVN0YXRlPFQ+Pjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXJ5U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSkge31cblxuICBjcmVhdGU8VD4oXG4gICAgbG9hZGVyRmFjdG9yeTogKCkgPT4gT2JzZXJ2YWJsZTxUPixcbiAgICBvcHRpb25zPzoge1xuICAgICAgcmVsb2FkT24/OiBRdWVyeU5vdGlmaWVyW107XG4gICAgICByZXNldE9uPzogUXVlcnlOb3RpZmllcltdO1xuICAgIH1cbiAgKTogUXVlcnk8VD4ge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogUXVlcnlTdGF0ZTxUPiA9IHtcbiAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yOiBmYWxzZSxcbiAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlcnlTdGF0ZTxUPj4oaW5pdGlhbFN0YXRlKTtcblxuICAgIC8vIGlmIHRoZSBxdWVyeSB3aWxsIGJlIHVuc3Vic2NyaWJlZCBmcm9tIHdoaWxlIHRoZSBkYXRhIGlzIGJlaW5nIGxvYWRlZCwgd2Ugd2lsbCBlbmQgdXAgd2l0aCB0aGUgbG9hZGluZyBmbGFnIHNldCB0byB0cnVlXG4gICAgLy8gd2Ugd2FudCB0byByZXRyeSB0aGlzIGxvYWQgb24gbmV4dCBzdWJzY3JpcHRpb25cbiAgICBjb25zdCBvblN1YnNjcmliZUxvYWQkID0gaWlmKCgpID0+IHN0YXRlJC52YWx1ZS5sb2FkaW5nLCBvZih1bmRlZmluZWQpKTtcblxuICAgIGNvbnN0IGxvYWRUcmlnZ2VyJCA9IHRoaXMuZ2V0VHJpZ2dlcnNTdHJlYW0oW1xuICAgICAgb25TdWJzY3JpYmVMb2FkJCwgLy8gd2UgbmVlZCB0byBldmFsdWF0ZSBvblN1YnNjcmliZUxvYWQkIGJlZm9yZSBvdGhlciB0cmlnZ2VycyBpbiBvcmRlciB0byBhdm9pZCBvdGhlciB0cmlnZ2VycyBjaGFuZ2luZyBzdGF0ZSQgdmFsdWVcbiAgICAgIC4uLihvcHRpb25zPy5yZWxvYWRPbiA/PyBbXSksXG4gICAgICAuLi4ob3B0aW9ucz8ucmVzZXRPbiA/PyBbXSksXG4gICAgXSk7XG5cbiAgICBjb25zdCByZXNldFRyaWdnZXIkID0gdGhpcy5nZXRUcmlnZ2Vyc1N0cmVhbShvcHRpb25zPy5yZXNldE9uID8/IFtdKTtcbiAgICBjb25zdCByZWxvYWRUcmlnZ2VyJCA9IHRoaXMuZ2V0VHJpZ2dlcnNTdHJlYW0ob3B0aW9ucz8ucmVsb2FkT24gPz8gW10pO1xuXG4gICAgY29uc3QgbG9hZCQgPSBsb2FkVHJpZ2dlciQucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmICghc3RhdGUkLnZhbHVlLmxvYWRpbmcpIHtcbiAgICAgICAgICBzdGF0ZSQubmV4dCh7IC4uLnN0YXRlJC52YWx1ZSwgbG9hZGluZzogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXBUbyhsb2FkZXJGYWN0b3J5KCkucGlwZSh0YWtlVW50aWwocmVzZXRUcmlnZ2VyJCkpKSxcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xuICAgICAgICBzdGF0ZSQubmV4dCh7IGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogZmFsc2UsIGRhdGEgfSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yLCByZXRyeVN0cmVhbSQpID0+IHtcbiAgICAgICAgc3RhdGUkLm5leHQoeyBsb2FkaW5nOiBmYWxzZSwgZXJyb3IsIGRhdGE6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgcmV0dXJuIHJldHJ5U3RyZWFtJDtcbiAgICAgIH0pLFxuICAgICAgc2hhcmUoKVxuICAgICk7XG5cbiAgICAvLyByZWxvYWQgbG9naWNcbiAgICBpZiAob3B0aW9ucz8ucmVsb2FkT24/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgcmVsb2FkVHJpZ2dlciQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXN0YXRlJC52YWx1ZS5sb2FkaW5nKSB7XG4gICAgICAgICAgICBzdGF0ZSQubmV4dCh7IC4uLnN0YXRlJC52YWx1ZSwgbG9hZGluZzogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHJlc2V0IGxvZ2ljXG4gICAgaWYgKG9wdGlvbnM/LnJlc2V0T24/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgcmVzZXRUcmlnZ2VyJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXRlJC52YWx1ZS5kYXRhICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHN0YXRlJC52YWx1ZS5lcnJvciAhPT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHN0YXRlJC52YWx1ZS5sb2FkaW5nICE9PSBmYWxzZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc3RhdGUkLm5leHQoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5JCA9IHVzaW5nKFxuICAgICAgKCkgPT4gbG9hZCQuc3Vic2NyaWJlKCksXG4gICAgICAoKSA9PiBzdGF0ZSRcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YSQgPSBxdWVyeSQucGlwZShwbHVjaygnZGF0YScpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgIHJldHVybiB7IGdldDogKCkgPT4gZGF0YSQsIGdldFN0YXRlOiAoKSA9PiBxdWVyeSQgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUcmlnZ2Vyc1N0cmVhbSh0cmlnZ2VyczogUXVlcnlOb3RpZmllcltdKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgaWYgKCF0cmlnZ2Vycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG4gICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSB0cmlnZ2Vycy5tYXAoKHRyaWdnZXIpID0+IHtcbiAgICAgIGlmIChpc09ic2VydmFibGUodHJpZ2dlcikpIHtcbiAgICAgICAgcmV0dXJuIHRyaWdnZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ldmVudFNlcnZpY2UuZ2V0KHRyaWdnZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBtZXJnZSguLi5vYnNlcnZhYmxlcyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19