Skip to content

Commit

Permalink
fix(cart): item states get added for a cart retrieval actions (#2799)
Browse files Browse the repository at this point in the history
  • Loading branch information
griest024 committed May 14, 2024
1 parent c7f164e commit 2a8c77f
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 14 deletions.
15 changes: 2 additions & 13 deletions libs/cart/state/src/reducers/cart-item-entities/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<T extends DaffCartItem = DaffCartItem> extends DaffOperationEntityStateAdapter<T> {
list<S extends DaffOperationEntityState<T> = DaffOperationEntityState<T>>(entities: T[], state: S): S {
return this.adapter.setAll(
daffCartItemsEntityTransform<T>(state.entities, entities),
state,
);
}
}

/**
* Cart Item Entities Adapter for changing/overwriting entity state.
*/
export const daffCartItemEntitiesAdapter = (() => {
let cache;
return <T extends DaffCartItem = DaffCartItem>(): DaffOperationEntityStateAdapter<T> => cache = cache ?? new DaffCartItemEntityStateAdapter(createEntityAdapter<DaffOperationEntity<T>>({ selectId: item => item.id }));
return <T extends DaffCartItem = DaffCartItem>(): DaffOperationEntityStateAdapter<T> => cache = cache ?? daffCreateOperationEntityStateAdapter(createEntityAdapter<DaffOperationEntity<T>>({ selectId: item => item.id }));
})();
Original file line number Diff line number Diff line change
@@ -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<T extends DaffCart = DaffCart> = ActionReducer<DaffCartReducersState<T>, DaffCartItemActions<T>>;

/**
* A meta reducer for determining and setting the correct `daffState` values on cart items.
*/
export function daffCartSetItemStateMetaReducer<T extends DaffCart = DaffCart>(reducer: Reducer<T>): Reducer<T> {
return (state, action) => {
switch (action.type) {
case DaffCartItemActionTypes.CartItemAddSuccessAction:
case DaffCartItemActionTypes.CartItemUpdateSuccessAction:
return reducer(
state,
{
...action,
payload: {
...action.payload,
items: daffCartItemsEntityTransform<T['items'][number]>(state.cartItems.entities, action.payload.items),
},
},
);

default:
return reducer(state, action);
}
};
}
6 changes: 5 additions & 1 deletion libs/cart/state/src/reducers/token/config.token.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

/**
Expand All @@ -20,7 +21,10 @@ export const DAFF_CART_STORE_CONFIG = new InjectionToken<StoreConfig<DaffCartRed
{
providedIn: 'any',
factory: () => ({
metaReducers: inject(DAFF_CART_META_REDUCERS),
metaReducers: [
daffCartSetItemStateMetaReducer,
...inject(DAFF_CART_META_REDUCERS),
],
}),
},
);

0 comments on commit 2a8c77f

Please sign in to comment.