Skip to content

Instantly share code, notes, and snippets.

@SanskarSans
Created October 15, 2017 01:14
Show Gist options
  • Save SanskarSans/c6664a50e5461b1073b026dbaf049a14 to your computer and use it in GitHub Desktop.
Save SanskarSans/c6664a50e5461b1073b026dbaf049a14 to your computer and use it in GitHub Desktop.
//reducer for adding and updating menu. Adding is working fine but editing is not working as in editing, the user can switch
// from one menu to another
const restaurantsMenu = {
food_beverages: {
restaurant: {
food_menu: [],
beverages_menu: []
},
coffee_shop: {
food_menu: [],
beverages_menu: []
},
bar: {
food_menu: [],
beverages_menu: []
},
pub: {
food_menu: [],
beverages_menu: []
},
room_service: {
food_menu: [],
beverages_menu: []
}
}
};
const initialState = fromJS({
loading: false,
loaded: false,
response: {},
error: null,
restaurantsMenu,
bar: {}
});
function foodAndBeverage(state = initialState, action) {
switch (action.type) {
case LOAD_FOOD_AND_BEVERAGE:
case POST_FOOD_AND_BEVERAGE:
case DELETE_FOOD_AND_BEVERAGE:
case EDIT_FOOD_AND_BEVERAGE:
return state.merge({
loading: true,
loaded: false,
response: null,
error: null
});
case LOAD_FOOD_AND_BEVERAGE_SUCCESS:
return state
.merge({
loading: false,
loaded: true,
response: action.response.message,
error: null
})
.updateIn(['restaurantsMenu', 'food_beverages'], menus => {
const menu = Object.assign(
{},
{ ...menus.toJS(), ...action.response.data.food_beverages }
);
return fromJS(menu);
});
case POST_FOOD_AND_BEVERAGE_SUCCESS: {
const { data, message } = action.response;
return state
.merge({
loading: false,
loaded: true,
response: message,
error: null
})
.updateIn(['restaurantsMenu', 'food_beverages', data.type], menus => {
let newFoodMenu = menus.get('food_menu');
let newBeverageMenu = menus.get('beverages_menu');
data.dataList.food_menu.map(food => {
newFoodMenu = menus.get('food_menu').push(fromJS(food));
});
data.dataList.beverages_menu.map(beverage => {
newBeverageMenu = menus.get('beverages_menu').push(fromJS(beverage));
});
return menus.merge({
food_menu: newFoodMenu,
beverages_menu: newBeverageMenu
});
});
}
case EDIT_FOOD_AND_BEVERAGE_SUCCESS: {
const {
data,
food_beverage_type,
menuId,
menu_type,
new_date_inserted,
message
} = action.response.data;
return state
.merge({
loading: false,
loaded: true,
response: message,
error: null
})
.updateIn(
['restaurantsMenu', 'food_beverages', food_beverage_type, new_date_inserted.type],
menus => {
const updated_menu_type = new_date_inserted.type;
if (menu_type === updated_menu_type) {
return menus.map(menu => {
if (menu.get('_id') === menuId) {
return menu.merge({
menu_title: data.menu_title,
type: updated_menu_type
});
}
return fromJS(menu);
});
}
if (menu_type !== updated_menu_type) {
const updateUnmatched = state.updateIn(
['restaurantsMenu', 'food_beverages', food_beverage_type, menu_type],
menus_instance => menus_instance.filter(instance => instance.get('_id') !== menuId)
);
const menusNotToUpdate = updateUnmatched.getIn([
'restaurantsMenu',
'food_beverages',
food_beverage_type,
menu_type
]);
return state.updateIn(
['restaurantsMenu', 'food_beverages', food_beverage_type],
menus =>
menus.merge({
[menu_type]: menusNotToUpdate,
[updated_menu_type]: data
})
);
// return menus.merge({
// food_menu: newFoodMenu,
// beverages_menu: newBeverageMenu
// });
// return menus.push(fromJS(data));
}
}
);
}
case DELETE_FOOD_AND_BEVERAGE_SUCCESS: {
const { data, message } = action.response;
return state
.merge({
loading: false,
loaded: true,
response: message,
error: null
})
.updateIn(
['restaurantsMenu', 'food_beverages', data.food_beverage_type, data.menu_type],
menus => menus.filter(menu => menu.get('_id') !== data.menuId)
);
}
case LOAD_FOOD_AND_BEVERAGE_FAILURE:
case POST_FOOD_AND_BEVERAGE_FAILURE:
case DELETE_FOOD_AND_BEVERAGE_FAILURE:
case EDIT_FOOD_AND_BEVERAGE_FAILURE:
return state.merge({
loading: false,
loaded: true,
response: null,
error: action.error
});
default:
return state;
}
}
export default foodAndBeverage;
// the shape of state
state shape {
"food_beverages": {
"restaurant": {
"food_menu": [
{
"updated_on": "2017-10-12T10:59:51.093Z",
"document_name": "food-beverage-1507805871955-568b6.jpg",
"document_mimetype": "image/jpeg",
"document_original_name": "tandoori-chicken.jpg",
"menu_title": "Tandoori",
"_id": "59df4ab156fea940b6ad3ef5",
"type": "food_menu",
"updated_by": "property_user25@yopmail.com",
"added_on": "2017-10-12T10:57:53.816Z"
}
],
"beverages_menu": [
{
"updated_on": "2017-10-12T11:17:38.090Z",
"document_name": "food-beverage-1507807029255-f71ea.jpeg",
"document_mimetype": "image/jpeg",
"document_original_name": "Macbook-Apple-Imac-Computer-HD-Wallpaper-Desktop.jpeg",
"menu_title": "maharaja-mac",
"_id": "59df4f3d56fea940b6ad3f0a",
"type": "beverages_menu",
"updated_by": "property_user25@yopmail.com",
"added_on": "2017-10-12T11:17:17.923Z"
}
]
},
"coffee_shop": {
"food_menu": [],
"beverages_menu": []
},
"bar": {
"food_menu": [],
"beverages_menu": []
},
"pub": {
"food_menu": [],
"beverages_menu": []
},
"room_service": {
"food_menu": [],
"beverages_menu": []
}
}
}
action data that is received when edited and server sends the response
{
"type": "Project/PropertyDashboard/FoodAndBeverages/EDIT_FOOD_AND_BEVERAGE_SUCCESS",
"response": {
"status": 200,
"message": "Food and Beverages item info updated successfully",
"data": {
"propertyId": "59d5c0011e933417530807ab",
"food_beverage_type": "restaurant",
"menu_type": "food_menu",
"new_date_inserted": {
"type": "beverages_menu"
},
"data": {
"menu_title": "Ma",
"type": "beverages_menu",
"updated_on": "2017-10-15T01:13:00.023Z",
"updated_by": "property_user25@yopmail.com"
},
"menuId": "59df4f3d56fea940b6ad3f0a"
}
}
}
step 1 image - https://imgur.com/a/ZeQdr
step 2 image - https://imgur.com/a/lrAf5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment