import postReducer, { PATCH_POST, hydrate as hydratePost } from "misago/reducers/post" export const APPEND_POSTS = "APPEND_POSTS" export const SELECT_POST = "SELECT_POST" export const DESELECT_POST = "DESELECT_POST" export const DESELECT_POSTS = "DESELECT_POSTS" export const LOAD_POSTS = "LOAD_POSTS" export const UNLOAD_POSTS = "UNLOAD_POSTS" export const UPDATE_POSTS = "UPDATE_POSTS" export function select(post) { return { type: SELECT_POST, post } } export function deselect(post) { return { type: DESELECT_POST, post } } export function deselectAll() { return { type: DESELECT_POSTS } } export function hydrate(json) { return Object.assign({}, json, { results: json.results.map(hydratePost), isLoaded: true, isBusy: false, isSelected: false }) } export function load(newState, hydrated = false) { return { type: LOAD_POSTS, state: hydrated ? newState : hydrate(newState) } } export function append(newState, hydrated = false) { return { type: APPEND_POSTS, state: hydrated ? newState : hydrate(newState) } } export function unload() { return { type: UNLOAD_POSTS } } export function update(newState) { return { type: UPDATE_POSTS, update: newState } } export default function posts(state = {}, action = null) { switch (action.type) { case SELECT_POST: const selectedPosts = state.results.map(post => { if (post.id == action.post.id) { return Object.assign({}, post, { isSelected: true }) } else { return post } }) return Object.assign({}, state, { results: selectedPosts }) case DESELECT_POST: const deseletedPosts = state.results.map(post => { if (post.id == action.post.id) { return Object.assign({}, post, { isSelected: false }) } else { return post } }) return Object.assign({}, state, { results: deseletedPosts }) case DESELECT_POSTS: const deseletedAllPosts = state.results.map(post => { return Object.assign({}, post, { isSelected: false }) }) return Object.assign({}, state, { results: deseletedAllPosts }) case APPEND_POSTS: let results = state.results.slice() const resultsIds = state.results.map(post => { return post.id }) action.state.results.map(post => { if (resultsIds.indexOf(post.id) === -1) { results.push(post) } }) return Object.assign({}, action.state, { results }) case LOAD_POSTS: return action.state case UNLOAD_POSTS: return Object.assign({}, state, { isLoaded: false }) case UPDATE_POSTS: return Object.assign({}, state, action.update) case PATCH_POST: const reducedPosts = state.results.map(post => { return postReducer(post, action) }) return Object.assign({}, state, { results: reducedPosts }) default: return state } }