julianusti
2/12/2016 - 4:31 PM

switch-case.reducer.js

import * as types from '../constants';

const item = (state, action) => {
    switch (action.type) {
        case types.UPDATE_ITEM_SIZE_REQUEST:
            return {
                ...state,
                isUpdatingSize: true
            };
        case types.UPDATE_ITEM_SIZE_SUCCESS:
            return action.payload;
        case types.UPDATE_ITEM_SIZE_FAILURE:
            return {
                ...state,
                isUpdatingSize: false,
                error: action.payload.error
            };
        case types.DELETE_ITEM_REQUEST:
            return {
                ...state,
                isDeleting: true,
                isDeletingTimerOn: true
            };
        case types.DELETE_ITEM_SUCCESS:
            return {
                ...state,
                isDeleting: false,
                isDeletingTimerOn: false,
                isDeleted: true
            };
        case types.DELETE_ITEM_FAILURE:
            return {
                ...state,
                isDeleting: true,
                isDeletingTimerOn: true,
                error: action.payload.error
            };
        case types.ADD_ITEM_TO_CART_REQUEST:
            return {
                ...state,
                isUpdatingCart: true
            };
        case types.ADD_ITEM_TO_CART_SUCCESS:
            return {
                ...state,
                isAddingToCart: false,
                article: {
                    isOnCart: true
                }
            };
        case types.ADD_ITEM_TO_CART_FAILURE:
            return {
                ...state,
                isAddingToCart: false,
                error: action.payload.error
            };
        default:
            return state;
    }
};

const collectionData = (state, action) => {
    switch (action.type) {
        case types.SHOW_MORE_ITEMS:
            return {
                ...state,
                visibleItems: action.payload.itemCount
            };
        case types.UPDATE_ITEM_SIZE_SUCCESS:
            return {
                ...state,
                isProcessing: false
            };
        default:
            return state;
    }
};

const items = (state, action) => {
    const itemId = action.payload.itemId;

    switch (action.type) {
        case types.UPDATE_ITEM_SIZE_REQUEST:
        case types.UPDATE_ITEM_SIZE_SUCCESS:
        case types.UPDATE_ITEM_SIZE_FAILURE:
        case types.DELETE_ITEM_REQUEST:
        case types.DELETE_ITEM_SUCCESS:
        case types.DELETE_ITEM_FAILURE:
        case types.ADD_ITEM_TO_CART_REQUEST:
        case types.ADD_ITEM_TO_CART_SUCCESS:
        case types.ADD_ITEM_TO_CART_FAILURE:
            return {
                ...state,
                [itemId]: item(state[itemId], action)
            };
        default:
            return state;
    }
};

const itemsByCollection = (state, action) => {
    const collectionId = action.payload.collectionId;

    switch (action.type) {
        case types.SHOW_MORE_ITEMS:
            return {
                ...state,
                [collectionId]: collectionData(state[collectionId], action)
            };
        case types.UPDATE_ITEM_SIZE_REQUEST:
        case types.UPDATE_ITEM_SIZE_SUCCESS:
        case types.UPDATE_ITEM_SIZE_FAILURE:
        case types.REMOVE_ITEM_REQUEST:
        case types.REMOVE_ITEM_SUCCESS:
        case types.REMOVE_ITEM_FAILURE:
        case types.ADD_ITEM_TO_CART_REQUEST:
        case types.ADD_ITEM_TO_CART_SUCCESS:
        case types.ADD_ITEM_TO_CART_FAILURE:
            return {
                ...state,
                [collectionId]: items(state[collectionId].items, action)
            };
        default:
            return state;
    }
};

export default itemsByCollection;