acb434b0c9
Unlike boosts and like, there is no confirmation dialog as misclicking can be recovered without another user seeing it.
116 lines
3.9 KiB
JavaScript
116 lines
3.9 KiB
JavaScript
import {
|
|
FAVOURITED_STATUSES_FETCH_REQUEST,
|
|
FAVOURITED_STATUSES_FETCH_SUCCESS,
|
|
FAVOURITED_STATUSES_FETCH_FAIL,
|
|
FAVOURITED_STATUSES_EXPAND_REQUEST,
|
|
FAVOURITED_STATUSES_EXPAND_SUCCESS,
|
|
FAVOURITED_STATUSES_EXPAND_FAIL,
|
|
} from 'flavours/glitch/actions/favourites';
|
|
import {
|
|
BOOKMARKED_STATUSES_FETCH_REQUEST,
|
|
BOOKMARKED_STATUSES_FETCH_SUCCESS,
|
|
BOOKMARKED_STATUSES_FETCH_FAIL,
|
|
BOOKMARKED_STATUSES_EXPAND_REQUEST,
|
|
BOOKMARKED_STATUSES_EXPAND_SUCCESS,
|
|
BOOKMARKED_STATUSES_EXPAND_FAIL,
|
|
} from 'flavours/glitch/actions/bookmarks';
|
|
import {
|
|
PINNED_STATUSES_FETCH_SUCCESS,
|
|
} from 'flavours/glitch/actions/pin_statuses';
|
|
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
|
|
import {
|
|
FAVOURITE_SUCCESS,
|
|
UNFAVOURITE_SUCCESS,
|
|
BOOKMARK_SUCCESS,
|
|
UNBOOKMARK_SUCCESS,
|
|
PIN_SUCCESS,
|
|
UNPIN_SUCCESS,
|
|
} from 'flavours/glitch/actions/interactions';
|
|
|
|
const initialState = ImmutableMap({
|
|
favourites: ImmutableMap({
|
|
next: null,
|
|
loaded: false,
|
|
items: ImmutableList(),
|
|
}),
|
|
bookmarks: ImmutableMap({
|
|
next: null,
|
|
loaded: false,
|
|
items: ImmutableList(),
|
|
}),
|
|
pins: ImmutableMap({
|
|
next: null,
|
|
loaded: false,
|
|
items: ImmutableList(),
|
|
}),
|
|
});
|
|
|
|
const normalizeList = (state, listType, statuses, next) => {
|
|
return state.update(listType, listMap => listMap.withMutations(map => {
|
|
map.set('next', next);
|
|
map.set('loaded', true);
|
|
map.set('isLoading', false);
|
|
map.set('items', ImmutableList(statuses.map(item => item.id)));
|
|
}));
|
|
};
|
|
|
|
const appendToList = (state, listType, statuses, next) => {
|
|
return state.update(listType, listMap => listMap.withMutations(map => {
|
|
map.set('next', next);
|
|
map.set('isLoading', false);
|
|
map.set('items', map.get('items').concat(statuses.map(item => item.id)));
|
|
}));
|
|
};
|
|
|
|
const prependOneToList = (state, listType, status) => {
|
|
return state.update(listType, listMap => listMap.withMutations(map => {
|
|
map.set('items', map.get('items').unshift(status.get('id')));
|
|
}));
|
|
};
|
|
|
|
const removeOneFromList = (state, listType, status) => {
|
|
return state.update(listType, listMap => listMap.withMutations(map => {
|
|
map.set('items', map.get('items').filter(item => item !== status.get('id')));
|
|
}));
|
|
};
|
|
|
|
export default function statusLists(state = initialState, action) {
|
|
switch(action.type) {
|
|
case FAVOURITED_STATUSES_FETCH_REQUEST:
|
|
case FAVOURITED_STATUSES_EXPAND_REQUEST:
|
|
return state.setIn(['favourites', 'isLoading'], true);
|
|
case FAVOURITED_STATUSES_FETCH_FAIL:
|
|
case FAVOURITED_STATUSES_EXPAND_FAIL:
|
|
return state.setIn(['favourites', 'isLoading'], false);
|
|
case FAVOURITED_STATUSES_FETCH_SUCCESS:
|
|
return normalizeList(state, 'favourites', action.statuses, action.next);
|
|
case FAVOURITED_STATUSES_EXPAND_SUCCESS:
|
|
return appendToList(state, 'favourites', action.statuses, action.next);
|
|
case BOOKMARKED_STATUSES_FETCH_REQUEST:
|
|
case BOOKMARKED_STATUSES_EXPAND_REQUEST:
|
|
return state.setIn(['bookmarks', 'isLoading'], true);
|
|
case BOOKMARKED_STATUSES_FETCH_FAIL:
|
|
case BOOKMARKED_STATUSES_EXPAND_FAIL:
|
|
return state.setIn(['bookmarks', 'isLoading'], false);
|
|
case BOOKMARKED_STATUSES_FETCH_SUCCESS:
|
|
return normalizeList(state, 'bookmarks', action.statuses, action.next);
|
|
case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
|
|
return appendToList(state, 'bookmarks', action.statuses, action.next);
|
|
case FAVOURITE_SUCCESS:
|
|
return prependOneToList(state, 'favourites', action.status);
|
|
case UNFAVOURITE_SUCCESS:
|
|
return removeOneFromList(state, 'favourites', action.status);
|
|
case BOOKMARK_SUCCESS:
|
|
return prependOneToList(state, 'bookmarks', action.status);
|
|
case UNBOOKMARK_SUCCESS:
|
|
return removeOneFromList(state, 'bookmarks', action.status);
|
|
case PINNED_STATUSES_FETCH_SUCCESS:
|
|
return normalizeList(state, 'pins', action.statuses, action.next);
|
|
case PIN_SUCCESS:
|
|
return prependOneToList(state, 'pins', action.status);
|
|
case UNPIN_SUCCESS:
|
|
return removeOneFromList(state, 'pins', action.status);
|
|
default:
|
|
return state;
|
|
}
|
|
};
|