Skip to content
Snippets Groups Projects
recommendations.js 3.6 KiB
Newer Older
import { get } from 'lodash'
import { create, update } from 'pubsweet-client/src/helpers/api'
const REQUEST = 'recommendations/REQUEST'
const ERROR = 'recommendations/ERROR'

const GET_FRAGMENT_SUCCESS = 'GET_FRAGMENT_SUCCESS'
const GET_RECOMMENDATIONS_SUCCESS = 'recommendations/GET_SUCCESS'
const CREATE_RECOMMENDATION_SUCCESS = 'recommendations/CREATE_SUCCESS'
const UPDATE_RECOMMENDATION_SUCCESS = 'recommendations/UPDATE_SUCCESS'
export const recommendationsRequest = () => ({
  type: REQUEST,
})

export const recommendationsError = error => ({
  type: ERROR,
  error,
})

export const getRecommendationsSuccess = recommendations => ({
  type: GET_RECOMMENDATIONS_SUCCESS,
  payload: { recommendations },
})

export const createRecommendationSuccess = recommendation => ({
  type: CREATE_RECOMMENDATION_SUCCESS,
  payload: { recommendation },
})

export const updateRecommendationSuccess = recommendation => ({
  type: UPDATE_RECOMMENDATION_SUCCESS,
  payload: { recommendation },
})
export const selectFetching = state =>
  get(state, 'recommendations.fetching') || false
export const selectError = state => get(state, 'recommendations.error')
export const selectRecommendations = state =>
  get(state, 'recommendations.recommendations') || []
export const selectEditorialRecommendations = state =>
  selectRecommendations(state).filter(
    r => r.recommendationType === 'editorRecommendation',
  )
// #endregion
export const createRecommendation = (
  collId,
  fragId,
  recommendation,
) => dispatch => {
  dispatch(recommendationsRequest())
  return create(
    `/collections/${collId}/fragments/${fragId}/recommendations`,
    recommendation,
  ).then(
    r => {
      dispatch(getRecommendationsSuccess([r]))
      return r
    },
    err => {
      const error = get(err, 'response')
      if (error) {
        const errorMessage = get(JSON.parse(error), 'error')
        dispatch(recommendationsError(errorMessage))
      }
export const updateRecommendation = (
  collId,
  fragId,
  recommendation,
) => dispatch => {
  dispatch(recommendationsRequest())
  return update(
    `/collections/${collId}/fragments/${fragId}/recommendations/${
      recommendation.id
    }`,
    recommendation,
  ).then(
    r => {
      dispatch(getRecommendationsSuccess([r]))
      return r
    },
    err => {
      const error = get(err, 'response')
      if (error) {
        const errorMessage = get(JSON.parse(error), 'error')
        dispatch(recommendationsError(errorMessage))
      }
    },
  )
const initialState = {
  fetching: false,
  error: null,
  recommendations: [],
}

export default (state = initialState, action = {}) => {
  switch (action.type) {
    case REQUEST:
      return {
        ...state,
        fetching: true,
      }
    case ERROR:
      return {
        ...state,
        fetching: false,
        error: action.error,
      }
    case GET_FRAGMENT_SUCCESS:
      return {
        ...state,
        fetching: false,
        error: null,
        recommendations: get(action, 'fragment.recommendations'),
      }
    case GET_RECOMMENDATIONS_SUCCESS:
      return {
        ...state,
        fetching: false,
        error: null,
        recommendations: action.payload.recommendations,
      }
    case UPDATE_RECOMMENDATION_SUCCESS:
    case CREATE_RECOMMENDATION_SUCCESS:
      return {
        ...state,
        fetching: false,
        error: null,
        recommendations: [action.payload.recommendation],