Selaa lähdekoodia

Add Merge Items action to ShoppingCart reducer

Tatiana Inama 6 vuotta sitten
vanhempi
commit
a81af8604a

+ 15 - 2
recipes/src/containers/ShoppingCart/actions.ts

@@ -19,6 +19,8 @@ export const REJECT_SAVE_CART = 'REJECT_SAVE_CART';
 
 export const DELETE_CART = 'DELETE_CART';
 
+export const MERGE_ITEMS_CART = 'MERGE_ITEMS_CART';
+
 export const addRecipeToCart = (recipe: ShoppingRecipe): AddRecipeToCart => ({
   type: ADD_RECIPE_TO_CART,
   payload: recipe
@@ -108,6 +110,14 @@ export const deleteCart = (): DeleteCartAction => ({
   type: DELETE_CART
 })
 
+export const mergeItemsCart = (deletedItems: string[], newItem: ShoppingItem): MergeItemsCartAction => ({
+  type: MERGE_ITEMS_CART,
+  payload: {
+    items: deletedItems,
+    newItem
+  }
+})
+
 export type AddRecipeToCart = {
   type: typeof ADD_RECIPE_TO_CART,
   payload: ShoppingRecipe
@@ -138,6 +148,7 @@ export interface PendingSaveCartAction extends Action<'PENDING_SAVE_CART'> { car
 export interface ConfirmSaveCartAction extends Action<'CONFIRM_SAVE_CART'> { cart: DBShoppingCart };
 export interface RejectSaveCartAction extends Action<'REJECT_SAVE_CART'> { error: string };
 export interface DeleteCartAction extends Action<'DELETE_CART'> {};
+export interface MergeItemsCartAction extends Action<'MERGE_ITEMS_CART'> { payload: { items: string[], newItem: ShoppingItem }};
 
 export type ActionTypes = 
   AddRecipeToCart | 
@@ -151,7 +162,8 @@ export type ActionTypes =
   PendingSaveCartAction |
   ConfirmSaveCartAction |
   RejectSaveCartAction |
-  DeleteCartAction;
+  DeleteCartAction |
+  MergeItemsCartAction;
 
 export default {
   addRecipeToCart,
@@ -159,5 +171,6 @@ export default {
   removeItemFromCart,
   removeAll,
   addAll,
-  deleteCart
+  deleteCart,
+  mergeItemsCart
 }

+ 9 - 1
recipes/src/containers/ShoppingCart/reducers.ts

@@ -11,9 +11,11 @@ import { ActionTypes,
   REJECT_SAVE_CART,
   DELETE_CART,
   REQUEST_CART,
-  RECEIVE_CART
+  RECEIVE_CART,
+  MERGE_ITEMS_CART
 } from './actions';
 import { createShoppingList, getItemsFromRecipe } from './services';
+import { insert, reject } from 'ramda';
 
 const initialState: ShoppingCartState = {
     items: [],
@@ -92,6 +94,12 @@ const shoppingCartReducer = (
         isFetching: false,
         items: action.payload.items
       }
+    case MERGE_ITEMS_CART:
+      const index = state.items.findIndex(i => i._original === action.payload.items[0]);
+      return {
+        ...state,
+        items: insert(index, action.payload.newItem, state.items.filter((item) => !action.payload.items.includes(item._original)))
+      }
     default:
       return state
   }