Created
December 1, 2017 15:57
-
-
Save sfrdmn/dcff4318646414d4c9e8f8ad0e4011b7 to your computer and use it in GitHub Desktop.
mcr_post_04
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const FOOD_ITEMS_FETCH_PENDING = 'FOOD_ITEMS_FETCH_PENDING' | |
const FOOD_ITEMS_FETCH_COMPLETE = 'FOOD_ITEMS_FETCH_COMPLETE' | |
const FOOD_ITEMS_FETCH_ERROR = 'FOOD_ITEMS_FETCH_ERROR' | |
const FOOD_ITEMS_ADD_PENDING = 'FOOD_ITEMS_ADD_PENDING' | |
const FOOD_ITEMS_ADD_COMPLETE = 'FOOD_ITEMS_ADD_COMPLETE' | |
const FOOD_ITEMS_ADD_ERROR = 'FOOD_ITEMS_ADD_ERROR' | |
// … | |
const addFoodItem = item => (dispatch) => { | |
dispatch({ type: FOOD_ITEMS_ADD_PENDING }) | |
foodService | |
.addFoodItem(item) | |
.then(payload => dispatch({ type: FOOD_ITEMS_ADD_COMPLETE, payload })) | |
.catch(payload => dispatch({ type: FOOD_ITEMS_ADD_ERROR, payload })) | |
} | |
const fetchFoodItems = item => (dispatch) => { | |
dispatch({ type: FOOD_ITEMS_FETCH_PENDING }) | |
foodService | |
.fetchFoodItems(item) | |
.then(payload => dispatch({ type: FOOD_ITEMS_FETCH_COMPLETE, payload })) | |
.catch(payload => dispatch({ type: FOOD_ITEMS_FETCH_ERROR, payload })) | |
} | |
// … | |
const reducer = (state, { type, payload }) => { | |
switch (type) { | |
case FOOD_ITEMS_FETCH_PENDING: | |
return { | |
...state, | |
foodItemsLoaded: false | |
} | |
case FOOD_ITEMS_FETCH_ERROR: | |
return { | |
...state, | |
foodItemsLoaded: false, | |
foodItemsError: payload | |
} | |
case FOOD_ITEMS_FETCH_COMPLETE: | |
return { | |
...state, | |
foodItemsLoaded: true, | |
foodItems: payload | |
} | |
case FOOD_ITEMS_ADD_PENDING: | |
return { | |
...state, | |
foodItemsAdding: true | |
} | |
case FOOD_ITEMS_ADD_ERROR: | |
return { | |
...state, | |
foodItemsAdding: false | |
} | |
case FOOD_ITEMS_ADD_COMPLETE: | |
return { | |
...state, | |
foodItemsAdding: false, | |
foodItems: [ | |
...state.foodItems, | |
payload | |
] | |
} | |
default: | |
return state; | |
} | |
} | |
// … | |
const App = ({ | |
foodItems, | |
foodItemsLoaded, | |
foodItemsAdding, | |
addFoodItem | |
}) => ( | |
foodItemsLoaded | |
? ( | |
<div> | |
<ul> | |
{ | |
foodItems.map(({ name, quantity }) => ( | |
<li>{name}, quantity: {quantity}</li> | |
)) | |
} | |
</ul> | |
<button | |
onClick={() => addFoodItem({ name: '🍋', quantity: 50 })} | |
disabled={foodItemsAdding} | |
> | |
Add Food Item {foodItemsAdding ? <Spinner /> : ''} | |
</button> | |
</div> | |
) | |
: <Spinner /> | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment