Source: registermap/state.js

/** @module registermap */

/**
 * state.js
 *
 * Collection of everything which has to do with state changes.
 * - actionTypes
 * - actions
 **/

import { NAME } from './constants'
import { registermapList, settingList } from './initialData'
// import { call, put, takeEvery } from 'redux-saga/effects'

/** actionTypes define what actions are handeled by the reducer. */
export const actionTypes = {
  CREATE_SETTING: `${NAME}/CREATE_SETTING`,
  UPDATE_SETTING: `${NAME}/UPDATE_SETTING`,
  DELETE_SETTING: `${NAME}/DELETE_SETTING`,
  CREATE_REGISTERMAP: `${NAME}/CREATE_REGISTERMAP`,
  UPDATE_REGISTERMAP: `${NAME}/UPDATE_REGISTERMAP`,
  DELETE_REGISTERMAP: `${NAME}/DELETE_REGISTERMAP`,
  LOAD_SAMPLES: `${NAME}/LOAD_SAMPLES`
}

/** actions is an object with references to all action creators */
function createSetting (setting) {
  return {
    type: actionTypes.CREATE_SETTING,
    setting
  }
}

function updateSetting (settingId, setting) {
  return {
    type: actionTypes.UPDATE_SETTING,
    settingId,
    setting
  }
}

function removeSetting (settingId) {
  return {
    type: actionTypes.DELETE_SETTING,
    settingId
  }
}
function createRegistermap (registermap) {
  return {
    type: actionTypes.CREATE_REGISTERMAP,
    registermap
  }
}

function updateRegistermap (registermapId, registermap) {
  return {
    type: actionTypes.UPDATE_REGISTERMAP,
    registermapId,
    registermap
  }
}

function removeRegistermap (registermapId) {
  return {
    type: actionTypes.DELETE_REGISTERMAP,
    registermapId
  }
}

function loadSamples () {
  return {
    type: actionTypes.LOAD_SAMPLES
  }
}
export const actions = { createSetting, updateSetting, removeSetting, createRegistermap, updateRegistermap, removeRegistermap, loadSamples }

/** state definition */
export const state = {
  registermap: [],
  settings: []
}

/** reducer is called by the redux dispatcher and handles all component actions */
function registermapSettings (state = {}, action) {
  console.log(`Entering registermap setting reducer.`, state, action)
  switch (action.type) {
    case actionTypes.CREATE_SETTING:
      console.log(`Creating setting.`, state, action)
      return {
        ...state,
        [action.project.projectId]: action.project
      }
    case actionTypes.UPDATE_SETTING:
      console.log(`Update setting.`, state, action)
      return {
        ...state,
        [action.projectId]: action.project
      }
    case actionTypes.DELETE_SETTING:
      console.log(`Delete setting.`, state, action)
      return {
        ...state,
        [action.projectId]: null
      }
    default:
      return state
  }
}

function registermapAction (state = {}, action) {
  console.log(`Entering registermap reducer.`, state, action)
  switch (action.type) {
    case actionTypes.CREATE_REGISTERMAP:
      console.log(`Creating registermap.`, state, action)
      return {
        ...state,
        [action.project.projectId]: action.project
      }
    case actionTypes.UPDATE_REGISTERMAP:
      console.log(`Update registermap.`, state, action)
      const idx = state.findIndex(elem => { return (elem.id === action.registermapId) })
      console.log(`Update registermap.`, idx)
      const next = [
        ...state.slice(0, idx),
        action.registermap,
        ...state.slice(idx + 1)
      ]
      console.log(`Update registermap.`, next)
      return next
    case actionTypes.DELETE_REGISTERMAP:
      console.log(`Delete registermap.`, state, action)
      return {
        ...state,
        [action.projectId]: null
      }
    default:
      return state
  }
}

export function reducer (state = {}, action) {
  console.log(`Entering registermap root reducer.`, state, action)
  if (typeof action.settingId !== 'undefined') {
    return {
      ...state,
      registermap: registermapSettings(state.registermap, action)
    }
  }
  if (typeof action.registermapId !== 'undefined') {
    return {
      ...state,
      registermap: registermapAction(state.registermap, action)
    }
  }
  switch (action.type) {
    case actionTypes.LOAD_SAMPLES:
      console.log(`Loading samples.`, state, action, registermapList, settingList)
      console.log({...state, registermap: registermapList, settings: settingList})
      return {
        ...state,
        registermap: registermapList,
        settings: settingList
      }
    default:
      return state
  }
}

/** sagas are asynchronous workers (JS generators) to handle the state.
// Worker
export function * incrementAsync () {
  try {
    const data = yield call(Api.isIncrementOk)
    yield put({ type: 'INCREMENT_SUCCESS', data })
  } catch (error) {
    yield put({ type: 'INCREMENT_FAIL', error})
  }
}

// Watcher (intercepts INCREMENT_REQUEST, dispatches INCREMENT_SUCCESS or INCREMENT_FAIL in return.)
export function * watchIncrementAsync () {
  yield takeEvery('INCREMENT_REQUEST', incrementAsync)
}

// export all sagas in parallel
function * sagas () {
  yield takeEvery('INCREMENT_REQUEST')
  yield takeEvery('DECREMENT_REQUEST')
} */
export const sagas = null