From 2a8c77f50c21509b43f00c6791f78c85cacc8de3 Mon Sep 17 00:00:00 2001 From: griest024 Date: Tue, 14 May 2024 18:46:23 -0400 Subject: [PATCH] fix(cart): item states get added for a cart retrieval actions (#2799) --- .../reducers/cart-item-entities/adapter.ts | 15 +------- .../set-state-meta-reducer.ts | 37 +++++++++++++++++++ .../state/src/reducers/token/config.token.ts | 6 ++- 3 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 libs/cart/state/src/reducers/cart-item-entities/set-state-meta-reducer.ts diff --git a/libs/cart/state/src/reducers/cart-item-entities/adapter.ts b/libs/cart/state/src/reducers/cart-item-entities/adapter.ts index 30b7dd6283..28909d4664 100644 --- a/libs/cart/state/src/reducers/cart-item-entities/adapter.ts +++ b/libs/cart/state/src/reducers/cart-item-entities/adapter.ts @@ -3,25 +3,14 @@ import { createEntityAdapter } from '@ngrx/entity'; import { DaffCartItem } from '@daffodil/cart'; import { DaffOperationEntity, - DaffOperationEntityState, DaffOperationEntityStateAdapter, + daffCreateOperationEntityStateAdapter, } from '@daffodil/core/state'; -import { daffCartItemsEntityTransform } from '../../helpers/public_api'; - -export class DaffCartItemEntityStateAdapter extends DaffOperationEntityStateAdapter { - list = DaffOperationEntityState>(entities: T[], state: S): S { - return this.adapter.setAll( - daffCartItemsEntityTransform(state.entities, entities), - state, - ); - } -} - /** * Cart Item Entities Adapter for changing/overwriting entity state. */ export const daffCartItemEntitiesAdapter = (() => { let cache; - return (): DaffOperationEntityStateAdapter => cache = cache ?? new DaffCartItemEntityStateAdapter(createEntityAdapter>({ selectId: item => item.id })); + return (): DaffOperationEntityStateAdapter => cache = cache ?? daffCreateOperationEntityStateAdapter(createEntityAdapter>({ selectId: item => item.id })); })(); diff --git a/libs/cart/state/src/reducers/cart-item-entities/set-state-meta-reducer.ts b/libs/cart/state/src/reducers/cart-item-entities/set-state-meta-reducer.ts new file mode 100644 index 0000000000..1cb00fbcf0 --- /dev/null +++ b/libs/cart/state/src/reducers/cart-item-entities/set-state-meta-reducer.ts @@ -0,0 +1,37 @@ +import { ActionReducer } from '@ngrx/store'; + +import { DaffCart } from '@daffodil/cart'; + +import { + DaffCartItemActionTypes, + DaffCartItemActions, +} from '../../actions/public_api'; +import { daffCartItemsEntityTransform } from '../../helpers/public_api'; +import { DaffCartReducersState } from '../cart-reducers-state.interface'; + +type Reducer = ActionReducer, DaffCartItemActions>; + +/** + * A meta reducer for determining and setting the correct `daffState` values on cart items. + */ +export function daffCartSetItemStateMetaReducer(reducer: Reducer): Reducer { + return (state, action) => { + switch (action.type) { + case DaffCartItemActionTypes.CartItemAddSuccessAction: + case DaffCartItemActionTypes.CartItemUpdateSuccessAction: + return reducer( + state, + { + ...action, + payload: { + ...action.payload, + items: daffCartItemsEntityTransform(state.cartItems.entities, action.payload.items), + }, + }, + ); + + default: + return reducer(state, action); + } + }; +} diff --git a/libs/cart/state/src/reducers/token/config.token.ts b/libs/cart/state/src/reducers/token/config.token.ts index 81ab972ce9..61777158ad 100644 --- a/libs/cart/state/src/reducers/token/config.token.ts +++ b/libs/cart/state/src/reducers/token/config.token.ts @@ -8,6 +8,7 @@ import { StoreConfig } from '@ngrx/store'; import { DaffCart } from '@daffodil/cart'; import { DAFF_CART_META_REDUCERS } from './meta.token'; +import { daffCartSetItemStateMetaReducer } from '../cart-item-entities/set-state-meta-reducer'; import { DaffCartReducersState } from '../cart-reducers-state.interface'; /** @@ -20,7 +21,10 @@ export const DAFF_CART_STORE_CONFIG = new InjectionToken ({ - metaReducers: inject(DAFF_CART_META_REDUCERS), + metaReducers: [ + daffCartSetItemStateMetaReducer, + ...inject(DAFF_CART_META_REDUCERS), + ], }), }, );