aboutsummaryrefslogtreecommitdiff
path: root/src/reducers
diff options
context:
space:
mode:
Diffstat (limited to 'src/reducers')
-rw-r--r--src/reducers/counter.js30
-rw-r--r--src/reducers/shop.js199
2 files changed, 0 insertions, 229 deletions
diff --git a/src/reducers/counter.js b/src/reducers/counter.js
deleted file mode 100644
index 523a0f7..0000000
--- a/src/reducers/counter.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
-@license
-Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-import { INCREMENT, DECREMENT } from '../actions/counter.js';
-
-const counter = (state = {clicks: 0, value: 0}, action) => {
- switch (action.type) {
- case INCREMENT:
- return {
- 'clicks': state.clicks + 1,
- 'value': state.value + 1
- };
- case DECREMENT:
- return {
- 'clicks': state.clicks + 1,
- 'value': state.value - 1
- };
- default:
- return state;
- }
-};
-
-export default counter;
diff --git a/src/reducers/shop.js b/src/reducers/shop.js
deleted file mode 100644
index 1005ca7..0000000
--- a/src/reducers/shop.js
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
-@license
-Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-import {
- GET_PRODUCTS,
- ADD_TO_CART,
- REMOVE_FROM_CART,
- CHECKOUT_SUCCESS,
- CHECKOUT_FAILURE
-} from '../actions/shop.js';
-import { createSelector } from 'reselect';
-
-const INITIAL_CART = {
- addedIds: [],
- quantityById: {}
-};
-
-const UPDATED_CART = {
- addedIds: ['1'],
- quantityById: {'1': 1}
-};
-
-const shop = (state = {products: {}, cart: INITIAL_CART}, action) => {
- switch (action.type) {
- case GET_PRODUCTS:
- return {
- ...state,
- products: action.products
- };
- case ADD_TO_CART:
- case REMOVE_FROM_CART:
- case CHECKOUT_SUCCESS:
- return {
- ...state,
- products: products(state.products, action),
- cart: cart(state.cart, action),
- error: ''
- };
- case CHECKOUT_FAILURE:
- return {
- ...state,
- error: 'Checkout failed. Please try again'
- };
- default:
- return state;
- }
-};
-
-// Slice reducer: it only reduces the bit of the state it's concerned about.
-const products = (state, action) => {
- switch (action.type) {
- case ADD_TO_CART:
- case REMOVE_FROM_CART:
- const productId = action.productId;
- return {
- ...state,
- [productId]: product(state[productId], action)
- };
- default:
- return state;
- }
-};
-
-const product = (state, action) => {
- switch (action.type) {
- case ADD_TO_CART:
- return {
- ...state,
- inventory: state.inventory - 1
- };
- case REMOVE_FROM_CART:
- return {
- ...state,
- inventory: state.inventory + 1
- };
- default:
- return state;
- }
-};
-
-const cart = (state = INITIAL_CART, action) => {
- switch (action.type) {
- case ADD_TO_CART:
- case REMOVE_FROM_CART:
- return {
- addedIds: addedIds(state.addedIds, state.quantityById, action),
- quantityById: quantityById(state.quantityById, action)
- };
- case CHECKOUT_SUCCESS:
- return INITIAL_CART;
- default:
- return state;
- }
-};
-
-const addedIds = (state = INITIAL_CART.addedIds, quantityById, action) => {
- const productId = action.productId;
- switch (action.type) {
- case ADD_TO_CART:
- if (state.indexOf(productId) !== -1) {
- return state;
- }
- return [
- ...state,
- action.productId
- ];
- case REMOVE_FROM_CART:
- // This is called before the state is updated, so if you have 1 item in the
- // cart during the remove action, you'll have 0.
- if (quantityById[productId] <= 1) {
- // This removes all items in this array equal to productId.
- return state.filter(e => e !== productId);
- }
- return state;
- default:
- return state;
- }
-};
-
-const quantityById = (state = INITIAL_CART.quantityById, action) => {
- const productId = action.productId;
- switch (action.type) {
- case ADD_TO_CART:
- return {
- ...state,
- [productId]: (state[productId] || 0) + 1
- };
- case REMOVE_FROM_CART:
- return {
- ...state,
- [productId]: (state[productId] || 0) - 1
- };
- default:
- return state;
- }
-};
-
-export default shop;
-
-// Per Redux best practices, the shop data in our store is structured
-// for efficiency (small size and fast updates).
-//
-// The _selectors_ below transform store data into specific forms that
-// are tailored for presentation. Putting this logic here keeps the
-// layers of our app loosely coupled and easier to maintain, since
-// views don't need to know about the store's internal data structures.
-//
-// We use a tiny library called `reselect` to create efficient
-// selectors. More info: https://github.com/reduxjs/reselect.
-
-const cartSelector = state => state.shop.cart;
-const productsSelector = state => state.shop.products;
-
-// Return a flattened array representation of the items in the cart
-export const cartItemsSelector = createSelector(
- cartSelector,
- productsSelector,
- (cart, products) => {
- const items = [];
- for (let id of cart.addedIds) {
- const item = products[id];
- items.push({id: item.id, title: item.title, amount: cart.quantityById[id], price: item.price});
- }
- return items;
- }
-);
-
-// Return the total cost of the items in the cart
-export const cartTotalSelector = createSelector(
- cartSelector,
- productsSelector,
- (cart, products) => {
- let total = 0;
- for (let id of cart.addedIds) {
- const item = products[id];
- total += item.price * cart.quantityById[id];
- }
- return parseFloat(Math.round(total * 100) / 100).toFixed(2);
- }
-);
-
-// Return the number of items in the cart
-export const cartQuantitySelector = createSelector(
- cartSelector,
- cart => {
- let num = 0;
- for (let id of cart.addedIds) {
- num += cart.quantityById[id];
- }
- return num;
- }
-);