sectionReducer.js 3.42 KB
/**
 * # guideReducer.js
 *
 * The reducer for all the actions from the various log states
 */
'use strict';
/**
 * ## Imports
 *
 * InitialState
 */
import InitialState from './sectionInitialState';
import Immutable, {Map} from 'immutable';

const {
	SECTION_HEADER_REQUEST,
    SECTION_HEADER_SUCCESS,
    SECTION_HEADER_FAILURE,

    SECTION_NEW_POST_REQUEST,
    SECTION_NEW_POST_SUCCESS,
    SECTION_NEW_POST_FAILURE,

    SECTION_HOT_POST_REQUEST,
    SECTION_HOT_POST_SUCCESS,
    SECTION_HOT_POST_FAILURE,

	SECTION_SET_ACTIVE_TAB,
	SECTION_CLEAN,
	GO_TO_SECTION,
} = require('../../constants/actionTypes').default;

const initialState = new InitialState;

/**
 * ## guideReducer function
 * @param {Object} state - initialState
 * @param {Object} action - type and payload
 */
export default function sectionReducer(state = initialState, action) {
    if (!(state instanceof InitialState)) return initialState.merge(state);

    switch (action.type) {

		case SECTION_HEADER_REQUEST: {
			let nextState =  state.set('isFetching', true)
				.set('error', null);
			return nextState;
		}

		case SECTION_HEADER_SUCCESS: {
			let {notice, header} = action.payload;
			let nextState =  state.set('isFetching', false)
				.set('error', null)
				.setIn(['header', 'uri'], header.uri)
				.setIn(['header', 'title'], header.title)
				.setIn(['header', 'post'], header.post)
				.setIn(['header', 'comment'], header.comment)
				.setIn(['header', 'like'], header.like)
				.setIn(['notice', 'duration'], notice.duration)
				.setIn(['notice', 'open'], notice.open)
				.setIn(['notice', 'list'], Immutable.fromJS(notice.list));
			return nextState;
		}

		case SECTION_HEADER_FAILURE: {
			let nextState =  state.set('isFetching', false)
				.set('error', action.payload);
			return nextState;
		}

		case SECTION_HOT_POST_REQUEST: {
			let nextState =  state.setIn(['hot', 'isFetching'], true)
				.setIn(['hot', 'error'], null)
				.set('ptr', action.payload);
			return nextState;
		}

		case SECTION_HOT_POST_SUCCESS: {
			let {lastedTime, list, endReached} = action.payload;
			let nextState =  state.setIn(['hot', 'isFetching'], false)
				.setIn(['hot', 'error'], null)
				.setIn(['hot', 'lastedTime'], lastedTime)
				.setIn(['hot', 'endReached'], endReached)
				.setIn(['hot', 'list'], Immutable.fromJS(list));
			return nextState;
		}

		case SECTION_HOT_POST_FAILURE: {
			let nextState =  state.setIn(['hot', 'isFetching'], false)
				.setIn(['hot', 'error'], action.payload);
			return nextState;
		}

		case SECTION_NEW_POST_REQUEST: {
			let nextState =  state.setIn(['new', 'isFetching'], true)
				.setIn(['new', 'error'], null)
				.set('ptr', action.payload);
			return nextState;
		}

		case SECTION_NEW_POST_SUCCESS: {
			let {lastedTime, list, endReached} = action.payload;
			let nextState =  state.setIn(['new', 'isFetching'], false)
				.setIn(['new', 'error'], null)
				.setIn(['new', 'lastedTime'], lastedTime)
				.setIn(['new', 'endReached'], endReached)
				.setIn(['new', 'list'], Immutable.fromJS(list));
			return nextState;
		}

		case SECTION_NEW_POST_FAILURE: {
			let nextState =  state.setIn(['new', 'isFetching'], false)
				.setIn(['new', 'error'], action.payload);
			return nextState;
		}

		case SECTION_SET_ACTIVE_TAB:
			return state.set('activeTab', action.payload);

		case GO_TO_SECTION:
			return state.set('id', action.payload.id)
				.set('name', action.payload.name);

		case SECTION_CLEAN:
			return initialState;
    }

    return state;
}