BeOrNot2Be/CocktailBuilder

View on GitHub
reducers/UserReducer.js

Summary

Maintainability
B
6 hrs
Test Coverage
/** @format */

import { loop, Cmd } from "redux-loop";
import {
  ADD_TOKEN,
  GOOGLE_SIGN_IN,
  GOOGLE_FULL_SIGN_IN,
  LOG_OUT,
  TOGGLE_THEME,
  CACHE_SIGN_IN
} from "../actions/User";
import {
  FETCH_FAV_COCKTAIL_ID,
  GET_COCKTAILS_BY_INGREDIENTS
} from "../actions/Cocktails";
import { GET_INVENTORY_INGS } from "../actions/Ingredients";
import NativeApi from "../api/native";
import MainSourceFetch from "../api/web";
import GoogleAnalytics from "../api/googleAnalytics";

const INITIAL_STATE = {
  logged: false,
  theme: 1
};

function usersFavsFetchSuccessfulAction(ids) {
  return {
    type: FETCH_FAV_COCKTAIL_ID,
    data: ids
  };
}

function usersInventoryIngsFetchSuccessfulAction(ids) {
  return {
    type: GET_INVENTORY_INGS,
    data: ids
  };
}

const userReducer = (state = INITIAL_STATE, action) => {
  let user;
  switch (action.type) {
    case ADD_TOKEN:
      user = { ...state, token: action.data, logged: true };
      NativeApi.SaveUser(user);
      GoogleAnalytics.loggedIn();
      return loop(
        user,
        Cmd.list([
          Cmd.run(MainSourceFetch.getFavsIDFetchReturn, {
            successActionCreator: usersFavsFetchSuccessfulAction,
            args: [user.token]
          }),
          Cmd.run(MainSourceFetch.getInventoryIngsFetchReturn, {
            successActionCreator: usersInventoryIngsFetchSuccessfulAction,
            args: [user.token]
          })
        ])
      );

    // test version
    case GOOGLE_SIGN_IN:
      return { ...state, googleUser: action.data };

    case GOOGLE_FULL_SIGN_IN:
      user = { ...state, ...action.data };
      NativeApi.SaveUser(user);
      return user;

    case CACHE_SIGN_IN:
      user = { ...state, ...action.data };
      GoogleAnalytics.loggedIn();
      if (user.logged) {
        return loop(
          user,
          Cmd.list([
            Cmd.run(MainSourceFetch.getFavsIDFetchReturn, {
              successActionCreator: usersFavsFetchSuccessfulAction,
              args: [user.token]
            }),
            Cmd.run(MainSourceFetch.getInventoryIngsFetchReturn, {
              successActionCreator: usersInventoryIngsFetchSuccessfulAction,
              args: [user.token]
            })
          ])
        );
      }
      return user;

    case GET_COCKTAILS_BY_INGREDIENTS:
      if (state.logged) {
        return loop(
          state,
          Cmd.run(MainSourceFetch.saveInventoryIngs, {
            args: [action.args.ingsStr, state.token, Cmd.dispatch]
          })
        );
      }
      return state;

    case LOG_OUT:
      return INITIAL_STATE;

    case TOGGLE_THEME:
      user = { ...state, theme: state.theme == 1 ? 0 : 1 };
      if (user.logged) {
        NativeApi.SaveUser(user);
      }
      return user;

    default:
      return state;
  }
};

export default userReducer;