@spartacus/core
Version:
Spartacus - the core framework
106 lines • 15.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { filter, map, switchMap, withLatestFrom } from 'rxjs/operators';
import { createFrom } from '../../util/create-from';
import { CartActions } from '../store/index';
import { CartAddEntryEvent, CartAddEntryFailEvent, CartAddEntrySuccessEvent, CartRemoveEntryFailEvent, CartRemoveEntrySuccessEvent, CartUpdateEntryFailEvent, CartUpdateEntrySuccessEvent, MergeCartSuccessEvent, } from './cart.events';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "../../event/event.service";
import * as i3 from "../facade/active-cart.service";
/**
* Registers events for the active cart
*/
export class CartEventBuilder {
constructor(actionsSubject, event, activeCartService) {
this.actionsSubject = actionsSubject;
this.event = event;
this.activeCartService = activeCartService;
this.register();
}
/**
* Registers events for the active cart
*/
register() {
this.registerAddEntry();
this.registerRemoveEntry();
this.registerUpdateEntry();
this.registerMergeCartSuccess();
}
/**
* Register events for adding entry to the active cart
*/
registerAddEntry() {
this.registerMapped({
action: CartActions.CART_ADD_ENTRY,
event: CartAddEntryEvent,
});
this.registerMapped({
action: CartActions.CART_ADD_ENTRY_SUCCESS,
event: CartAddEntrySuccessEvent,
});
this.registerMapped({
action: CartActions.CART_ADD_ENTRY_FAIL,
event: CartAddEntryFailEvent,
});
}
registerRemoveEntry() {
this.registerMapped({
action: CartActions.CART_REMOVE_ENTRY_SUCCESS,
event: CartRemoveEntrySuccessEvent,
});
this.registerMapped({
action: CartActions.CART_REMOVE_ENTRY_FAIL,
event: CartRemoveEntryFailEvent,
});
}
registerUpdateEntry() {
this.registerMapped({
action: CartActions.CART_UPDATE_ENTRY_SUCCESS,
event: CartUpdateEntrySuccessEvent,
});
this.registerMapped({
action: CartActions.CART_UPDATE_ENTRY_FAIL,
event: CartUpdateEntryFailEvent,
});
}
registerMergeCartSuccess() {
this.registerMapped({
action: CartActions.MERGE_CART_SUCCESS,
event: MergeCartSuccessEvent,
});
}
/**
* Registers a stream of target events mapped from the source actions that contain the cart id equal to the active cart id.
*
* @param mapping mapping declaration - from `action` string type to `event` class type
* (an with optional `factory` function - by default `action.payload` will be assigned to the properties of the event instance).
*/
registerMapped(mapping) {
const eventStream$ = this.getAction(mapping.action).pipe(switchMap((action) => {
// SwitchMap was used instead of withLatestFrom, because we only want to subscribe to cart stream when action is dispatched.
// Using withLatestFrom would trigger subscription to cart observables on event subscription and that causes side effects,
// such as loading cart when we don't yet need it.
return of(action).pipe(withLatestFrom(this.activeCartService.getActive(), this.activeCartService.getActiveCartId()));
}), filter(([action, _activeCart, activeCartId]) => action.payload['cartId'] === activeCartId), map(([action, activeCart]) => createFrom(mapping.event, Object.assign(Object.assign({}, action.payload), { cartCode: activeCart.code, entry: action.payload.entry
? action.payload.entry
: activeCart.entries[Number(action.payload.entryNumber)] }))));
return this.event.register(mapping.event, eventStream$);
}
/**
* Returns a stream of actions only of a given type(s)
*
* @param actionType type(s) of actions
*/
getAction(actionType) {
return this.actionsSubject.pipe(ofType(...[].concat(actionType)));
}
}
CartEventBuilder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartEventBuilder, deps: [{ token: i1.ActionsSubject }, { token: i2.EventService }, { token: i3.ActiveCartService }], target: i0.ɵɵFactoryTarget.Injectable });
CartEventBuilder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartEventBuilder, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CartEventBuilder, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: function () { return [{ type: i1.ActionsSubject }, { type: i2.EventService }, { type: i3.ActiveCartService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1ldmVudC5idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvY2FydC9ldmVudC9jYXJ0LWV2ZW50LmJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLDJCQUEyQixFQUMzQixxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUM7Ozs7O0FBRXZCOztHQUVHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixZQUNZLGNBQThCLEVBQzlCLEtBQW1CLEVBQ25CLGlCQUFvQztRQUZwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBRTlDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDTyxRQUFRO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIs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RUQ7Ozs7T0FJRztJQUNPLFNBQVMsQ0FDakIsVUFBNkI7UUFFN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDN0IsTUFBTSxDQUFDLEdBQUksRUFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUMvQyxDQUFDO0lBQ0osQ0FBQzs7NkdBakhVLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTsyRkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG9mVHlwZSB9IGZyb20gJ0BuZ3J4L2VmZmVjdHMnO1xuaW1wb3J0IHsgQWN0aW9uc1N1YmplY3QgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgd2l0aExhdGVzdEZyb20gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9ldmVudC9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblRvRXZlbnRNYXBwaW5nIH0gZnJvbSAnLi4vLi4vc3RhdGUvZXZlbnQvYWN0aW9uLXRvLWV2ZW50LW1hcHBpbmcnO1xuaW1wb3J0IHsgY3JlYXRlRnJvbSB9IGZyb20gJy4uLy4uL3V0aWwvY3JlYXRlLWZyb20nO1xuaW1wb3J0IHsgQWN0aXZlQ2FydFNlcnZpY2UgfSBmcm9tICcuLi9mYWNhZGUvYWN0aXZlLWNhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0QWN0aW9ucyB9IGZyb20gJy4uL3N0b3JlL2luZGV4JztcbmltcG9ydCB7XG4gIENhcnRBZGRFbnRyeUV2ZW50LFxuICBDYXJ0QWRkRW50cnlGYWlsRXZlbnQsXG4gIENhcnRBZGRFbnRyeVN1Y2Nlc3NFdmVudCxcbiAgQ2FydFJlbW92ZUVudHJ5RmFpbEV2ZW50LFxuICBDYXJ0UmVtb3ZlRW50cnlTdWNjZXNzRXZlbnQsXG4gIENhcnRVcGRhdGVFbnRyeUZhaWxFdmVudCxcbiAgQ2FydFVwZGF0ZUVudHJ5U3VjY2Vzc0V2ZW50LFxuICBNZXJnZUNhcnRTdWNjZXNzRXZlbnQsXG59IGZyb20gJy4vY2FydC5ldmVudHMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBldmVudHMgZm9yIHRoZSBhY3RpdmUgY2FydFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENhcnRFdmVudEJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYWN0aW9uc1N1YmplY3Q6IEFjdGlvbnNTdWJqZWN0LFxuICAgIHByb3RlY3RlZCBldmVudDogRXZlbnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY3RpdmVDYXJ0U2VydmljZTogQWN0aXZlQ2FydFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBldmVudHMgZm9yIHRoZSBhY3RpdmUgY2FydFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyKCkge1xuICAgIHRoaXMucmVnaXN0ZXJBZGRFbnRyeSgpO1xuICAgIHRoaXMucmVnaXN0ZXJSZW1vdmVFbnRyeSgpO1xuICAgIHRoaXMucmVnaXN0ZXJVcGRhdGVFbnRyeSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNZXJnZUNhcnRTdWNjZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgZXZlbnRzIGZvciBhZGRpbmcgZW50cnkgdG8gdGhlIGFjdGl2ZSBjYXJ0XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJBZGRFbnRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWFwcGVkKHtcbiAgICAgIGFjdGlvbjogQ2FydEFjdGlvbnMuQ0FSVF9BRERfRU5UUlksXG4gICAgICBldmVudDogQ2FydEFkZEVudHJ5RXZlbnQsXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1hcHBlZCh7XG4gICAgICBhY3Rpb246IENhcnRBY3Rpb25zLkNBUlRfQUREX0VOVFJZX1NVQ0NFU1MsXG4gICAgICBldmVudDogQ2FydEFkZEVudHJ5U3VjY2Vzc0V2ZW50LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNYXBwZWQoe1xuICAgICAgYWN0aW9uOiBDYXJ0QWN0aW9ucy5DQVJUX0FERF9FTlRSWV9GQUlMLFxuICAgICAgZXZlbnQ6IENhcnRBZGRFbnRyeUZhaWxFdmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclJlbW92ZUVudHJ5KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNYXBwZWQoe1xuICAgICAgYWN0aW9uOiBDYXJ0QWN0aW9ucy5DQVJUX1JFTU9WRV9FTlRSWV9TVUNDRVNTLFxuICAgICAgZXZlbnQ6IENhcnRSZW1vdmVFbnRyeVN1Y2Nlc3NFdmVudCxcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWFwcGVkKHtcbiAgICAgIGFjdGlvbjogQ2FydEFjdGlvbnMuQ0FSVF9SRU1PVkVfRU5UUllfRkFJTCxcbiAgICAgIGV2ZW50OiBDYXJ0UmVtb3ZlRW50cnlGYWlsRXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJVcGRhdGVFbnRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWFwcGVkKHtcbiAgICAgIGFjdGlvbjogQ2FydEFjdGlvbnMuQ0FSVF9VUERBVEVfRU5UUllfU1VDQ0VTUyxcbiAgICAgIGV2ZW50OiBDYXJ0VXBkYXRlRW50cnlTdWNjZXNzRXZlbnQsXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1hcHBlZCh7XG4gICAgICBhY3Rpb246IENhcnRBY3Rpb25zLkNBUlRfVVBEQVRFX0VOVFJZX0ZBSUwsXG4gICAgICBldmVudDogQ2FydFVwZGF0ZUVudHJ5RmFpbEV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyTWVyZ2VDYXJ0U3VjY2VzcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWFwcGVkKHtcbiAgICAgIGFjdGlvbjogQ2FydEFjdGlvbnMuTUVSR0VfQ0FSVF9TVUNDRVNTLFxuICAgICAgZXZlbnQ6IE1lcmdlQ2FydFN1Y2Nlc3NFdmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzdHJlYW0gb2YgdGFyZ2V0IGV2ZW50cyBtYXBwZWQgZnJvbSB0aGUgc291cmNlIGFjdGlvbnMgdGhhdCBjb250YWluIHRoZSBjYXJ0IGlkIGVxdWFsIHRvIHRoZSBhY3RpdmUgY2FydCBpZC5cbiAgICpcbiAgICogQHBhcmFtIG1hcHBpbmcgbWFwcGluZyBkZWNsYXJhdGlvbiAtIGZyb20gYGFjdGlvbmAgc3RyaW5nIHR5cGUgdG8gYGV2ZW50YCBjbGFzcyB0eXBlXG4gICAqICAgKGFuIHdpdGggb3B0aW9uYWwgYGZhY3RvcnlgIGZ1bmN0aW9uIC0gYnkgZGVmYXVsdCBgYWN0aW9uLnBheWxvYWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnRpZXMgb2YgdGhlIGV2ZW50IGluc3RhbmNlKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3Rlck1hcHBlZDxUPihtYXBwaW5nOiBBY3Rpb25Ub0V2ZW50TWFwcGluZzxUPik6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50U3RyZWFtJCA9IHRoaXMuZ2V0QWN0aW9uKG1hcHBpbmcuYWN0aW9uKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgLy8gU3dpdGNoTWFwIHdhcyB1c2VkIGluc3RlYWQgb2Ygd2l0aExhdGVzdEZyb20sIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHN1YnNjcmliZSB0byBjYXJ0IHN0cmVhbSB3aGVuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLlxuICAgICAgICAvLyBVc2luZyB3aXRoTGF0ZXN0RnJvbSB3b3VsZCB0cmlnZ2VyIHN1YnNjcmlwdGlvbiB0byBjYXJ0IG9ic2VydmFibGVzIG9uIGV2ZW50IHN1YnNjcmlwdGlvbiBhbmQgdGhhdCBjYXVzZXMgc2lkZSBlZmZlY3RzLFxuICAgICAgICAvLyBzdWNoIGFzIGxvYWRpbmcgY2FydCB3aGVuIHdlIGRvbid0IHlldCBuZWVkIGl0LlxuICAgICAgICByZXR1cm4gb2YoYWN0aW9uKS5waXBlKFxuICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDYXJ0U2VydmljZS5nZXRBY3RpdmUoKSxcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UuZ2V0QWN0aXZlQ2FydElkKClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGZpbHRlcihcbiAgICAgICAgKFthY3Rpb24sIF9hY3RpdmVDYXJ0LCBhY3RpdmVDYXJ0SWRdKSA9PlxuICAgICAgICAgIGFjdGlvbi5wYXlsb2FkWydjYXJ0SWQnXSA9PT0gYWN0aXZlQ2FydElkXG4gICAgICApLFxuICAgICAgbWFwKChbYWN0aW9uLCBhY3RpdmVDYXJ0XSkgPT5cbiAgICAgICAgY3JlYXRlRnJvbShtYXBwaW5nLmV2ZW50LCB7XG4gICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgY2FydENvZGU6IGFjdGl2ZUNhcnQuY29kZSxcbiAgICAgICAgICBlbnRyeTogYWN0aW9uLnBheWxvYWQuZW50cnlcbiAgICAgICAgICAgID8gYWN0aW9uLnBheWxvYWQuZW50cnlcbiAgICAgICAgICAgIDogYWN0aXZlQ2FydC5lbnRyaWVzW051bWJlcihhY3Rpb24ucGF5bG9hZC5lbnRyeU51bWJlcildLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnQucmVnaXN0ZXIobWFwcGluZy5ldmVudCwgZXZlbnRTdHJlYW0kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyZWFtIG9mIGFjdGlvbnMgb25seSBvZiBhIGdpdmVuIHR5cGUocylcbiAgICpcbiAgICogQHBhcmFtIGFjdGlvblR5cGUgdHlwZShzKSBvZiBhY3Rpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QWN0aW9uKFxuICAgIGFjdGlvblR5cGU6IHN0cmluZyB8IHN0cmluZ1tdXG4gICk6IE9ic2VydmFibGU8eyB0eXBlOiBzdHJpbmc7IHBheWxvYWQ/OiBhbnkgfT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbnNTdWJqZWN0LnBpcGUoXG4gICAgICBvZlR5cGUoLi4uKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQoYWN0aW9uVHlwZSkpXG4gICAgKTtcbiAgfVxufVxuIl19