import { get } from 'lodash' import { SubmissionError } from 'redux-form' 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 }, }) // Selectors 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') || [] // Actions 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)) throw new SubmissionError({ _error: errorMessage || 'Something went wrong', }) } }, ) } 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)) throw new SubmissionError({ _error: errorMessage || 'Something went wrong', }) } }, ) } // State 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], } default: return state } }