thebakeryio/react-native-navigation-redux-helpers

View on GitHub
src/reducers/card-stack.js

Summary

Maintainability
A
2 hrs
Test Coverage
import {
  PUSH_ROUTE,
  POP_ROUTE,
  RESET_ROUTE,
  REPLACE_AT,
  REPLACE_AT_INDEX,
  JUMP_TO,
  JUMP_TO_INDEX,
  BACK,
  FORWARD
} from '../constants';

import {
  checkInitialState,
  isActionPotentiallyApplicable,
  getStateUtils
} from './helpers';

const StateUtils = getStateUtils();

export function cardStackReducer(initialState) {
  checkInitialState(initialState);

  // eslint-disable-next-line complexity
  return function cardStackReducerFn(state = initialState, action) {
    if (!isActionPotentiallyApplicable(action, state.key)) {
      return state;
    }

    switch (action.type) {
      case PUSH_ROUTE:
      if (state.routes[state.index].key === (action.payload && action.payload.route.key)) return state;
        return StateUtils.push(state, action.payload.route);
      case POP_ROUTE:
        return StateUtils.pop(state);
      case RESET_ROUTE:
        return StateUtils.reset(state,  action.payload.routes, action.payload.index);
      case REPLACE_AT:
        return StateUtils.replaceAt(state, action.payload.routeKey, action.payload.route);
      case REPLACE_AT_INDEX:
        return StateUtils.replaceAtIndex(state, action.payload.index, action.payload.route);
      case JUMP_TO:
        return StateUtils.jumpTo(state, action.payload.routeKey);
      case JUMP_TO_INDEX:
        return StateUtils.jumpToIndex(state, action.payload.routeIndex);
      case BACK:
        return StateUtils.back(state);
      case FORWARD:
        return StateUtils.forward(state);
      default:
        return state;
    }
  };
}