import { get } from 'lodash' import { get as apiGet, create, remove, update, } from 'pubsweet-client/src/helpers/api' const REQUEST = 'recommendations/REQUEST' const ERROR = 'recommendations/ERROR' const GET_RECOMMENDATIONS_SUCCESS = 'recommendations/GET_SUCCESS' const GET_RECOMMENDATION_SUCCESS = 'recommendations/GET_ITEM_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 getRecommendationSuccess = recommendation => ({ type: GET_RECOMMENDATION_SUCCESS, payload: { recommendation }, }) 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') || [] const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) // Actions export const getFragmentRecommendations = ( collectionId, fragmentId, ) => dispatch => { dispatch(recommendationsRequest()) const review = { id: 'revuewiuuuid', userId: 'uuuuuuid', recommendation: 'publish', recommendationType: 'review', comments: [ { content: 'Here is public text', public: true, files: [], }, { content: 'Here is PRIVATE text', public: false, files: [], }, ], } return sleep(1000).then(() => { dispatch(getRecommendationsSuccess([review])) return [review] }) // return apiGet( // `/collections/${collectionId}/fragments/${fragmentId}/recommendations`, // ).then( // r => dispatch(getRecommendationsSuccess(r)), // err => dispatch(recommendationsError(err)), // ) } export const updateRecommendation = recommendation => dispatch => { dispatch(recommendationsRequest()) return sleep(1000).then(() => { dispatch(updateRecommendationSuccess(recommendation)) return recommendation }) } export const createRecommendation = recommendation => dispatch => { dispatch(recommendationsRequest()) return sleep(1000).then(() => { dispatch(updateRecommendationSuccess(recommendation)) return recommendation }) } // State const initialState = { fetching: false, error: null, recommendations: [], recommendation: {}, } export default (state = initialState, action = {}) => { switch (action.type) { case REQUEST: return { ...state, fetching: true, recommendations: [], recommendation: {}, } case ERROR: return { ...state, fetching: false, error: action.error, } case GET_RECOMMENDATIONS_SUCCESS: return { ...state, fetching: false, error: null, recommendations: action.payload.recommendations, } case GET_RECOMMENDATION_SUCCESS: return { ...state, fetching: false, error: null, recommendation: action.payload.recommendation, } case UPDATE_RECOMMENDATION_SUCCESS: case CREATE_RECOMMENDATION_SUCCESS: return { ...state, fetching: false, error: null, recommendations: [action.payload.recommendation], recommendation: action.payload.recommendation, } default: return state } }