Newer
Older
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') || []
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 => {
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
}
}