Newer
Older
import { create, update } from 'pubsweet-client/src/helpers/api'
// #region Constants
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'
// #endregion
// #region Action Creators
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 },
})
// #endregion
// #region 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 selectEditorialRecommendations = state =>
selectRecommendations(state).filter(
r => r.recommendationType === 'editorRecommendation',
)
// #endregion
// #region 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 err
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))
}
},
)
// #endregion
// #region 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
}
}
// #endregion