import { Map as ImmutableMap, List as ImmutableList, } from 'immutable' import { me } from '../initial_state' import { ALBUMS_FETCH_REQUEST, ALBUMS_FETCH_SUCCESS, ALBUMS_FETCH_FAIL, ALBUMS_EXPAND_REQUEST, ALBUMS_EXPAND_SUCCESS, ALBUMS_EXPAND_FAIL, } from '../actions/albums' const initialState = ImmutableMap({}) const setListFailed = (state, id) => { return state.setIn([id], ImmutableMap({ next: null, items: ImmutableList(), isLoading: false, })) } const normalizeList = (state, id, albums, next) => { return state.setIn([id], ImmutableMap({ next, items: ImmutableList(albums.map(item => item.id)), isLoading: false, })) } const appendToList = (state, id, albums, next) => { return state.updateIn([id], (map) => { return map .set('next', next) .set('isLoading', false) .update('items', (list) => { return list.concat(albums.map(item => item.id)) }) }) } export default function album_lists(state = initialState, action) { switch(action.type) { case ALBUMS_FETCH_REQUEST: case ALBUMS_EXPAND_REQUEST: return state.setIn([action.accountId, 'isLoading'], true) case ALBUMS_FETCH_SUCCESS: return normalizeList(state, action.accountId, action.albums, action.next) case ALBUMS_EXPAND_SUCCESS: return appendToList(state, action.accountId, action.albums, action.next) case ALBUMS_FETCH_FAIL: case ALBUMS_EXPAND_FAIL: return setListFailed(state, action.accountId) default: return state; } };