solicitudes.js 2.64 KB
import {
  contains,
  filter,
  merge,
  mergeDeepRight,
  mergeAll,
} from 'ramda'

import {
  SOLICITUDES_REQUESTED,
  SOLICITUDES_RECEIVED,
  SOLICITUDES_FAILED,
  VER_DETALLE_SOLICITUD,
  FLUJOS_RECEIVED, FLUJOS_REQUESTED, FLUJOS_FAILED,
  SOLICITUD_POST_SUCCESS,
  SOLICITUD_POST_FAILED,
  SOLICITUD_POSTED,
  CAMBIAR_PAGINA_SOLICITUD,
  CAMBIAR_BUSQUEDA_SOLICITUD
} from '../actions/solicitudes'

import { ESTADOS_SOLICITUDES } from '../../constants'

const solicitudes = {
  data: {},
  own: [],
  current: null,
  loading: false,
  error: null,
  pendientes: {
    title: 'PENDIENTES', data: []
  },
  finalizadas: {
    title: 'FINALIZADAS', data: []
  },
  flujos: {
    loading: true,
    datos: null
  },
  post: { loading: false, error: null, result: null },
  busqueda: { page: 1, by_titulo: '', by_usuario: '' },
  pages: { totalPages: 0, totalCount: 0 }
}

const esPendiente = (solicitud) =>
  contains(
    solicitud.estado.nombre,
    ESTADOS_SOLICITUDES.pendientes)

const esFinal = (solicitud) => contains(
  solicitud.estado.nombre,
  ESTADOS_SOLICITUDES.finalizados)

const receive = (data) => ({
    data,
    pendientes: {
      title: 'PENDIENTES',
      data: filter(esPendiente, data)
    },
    finalizadas: {
      title: 'FINALIZADAS',
      data: filter(esFinal, data)
    }
  })

export default (state, action) => {
  switch (action.type) {
    case SOLICITUDES_REQUESTED:
      return merge(state, { loading: true })

    case VER_DETALLE_SOLICITUD:
      return merge(state, { current: action.solicitud })

    case SOLICITUDES_RECEIVED:
      return mergeAll([
        state,
        { pages: action.pages },
        { loading: false },
        receive(action.solicitudes)])

    case SOLICITUDES_FAILED:
      return mergeAll([
        state,
        { loading: false },
        { error: action.error }])

    case FLUJOS_REQUESTED:
      return merge(state, { flujos: { loading: true } })

    case FLUJOS_RECEIVED:
      return merge(state, { flujos: { loading: false, datos: action.flujos } })

    case FLUJOS_FAILED:
      return merge(state, { flujos: { loading: false, datos: [], error: action.error } })

    case SOLICITUD_POST_SUCCESS:
      return merge(state, { post: { loading: false, error: null, result: action.result } })

    case SOLICITUD_POSTED:
      return merge(state, { post: { loading: true, error: null, result: null } })

    case SOLICITUD_POST_FAILED:
      return merge(state, { post: { loading: false, error: action.error, result: null } })

    case CAMBIAR_BUSQUEDA_SOLICITUD:
    case CAMBIAR_PAGINA_SOLICITUD:
      return mergeDeepRight(state, { busqueda: action.busqueda })
    default:
      return state || solicitudes
  }
}