Skip to content

Instantly share code, notes, and snippets.

@sfrdmn
Created December 1, 2017 15:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sfrdmn/dcff4318646414d4c9e8f8ad0e4011b7 to your computer and use it in GitHub Desktop.
Save sfrdmn/dcff4318646414d4c9e8f8ad0e4011b7 to your computer and use it in GitHub Desktop.
mcr_post_04
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