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), + ], }), }, );