From e8ff4c8e56650bf061c63a7da3d84b742e618b6a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 30 Oct 2016 15:06:43 +0100 Subject: Refactoring redux state into different reducers --- .../javascripts/components/reducers/accounts.jsx | 80 ++++++++ .../javascripts/components/reducers/compose.jsx | 6 +- .../javascripts/components/reducers/follow.jsx | 2 +- .../javascripts/components/reducers/index.jsx | 8 +- .../javascripts/components/reducers/meta.jsx | 7 +- .../components/reducers/notifications.jsx | 4 +- .../components/reducers/relationships.jsx | 34 ++++ .../javascripts/components/reducers/statuses.jsx | 68 +++++++ .../components/reducers/suggestions.jsx | 13 -- .../javascripts/components/reducers/timelines.jsx | 208 ++++++--------------- .../javascripts/components/reducers/user_lists.jsx | 10 +- 11 files changed, 259 insertions(+), 181 deletions(-) create mode 100644 app/assets/javascripts/components/reducers/accounts.jsx create mode 100644 app/assets/javascripts/components/reducers/relationships.jsx create mode 100644 app/assets/javascripts/components/reducers/statuses.jsx delete mode 100644 app/assets/javascripts/components/reducers/suggestions.jsx (limited to 'app/assets/javascripts/components/reducers') diff --git a/app/assets/javascripts/components/reducers/accounts.jsx b/app/assets/javascripts/components/reducers/accounts.jsx new file mode 100644 index 000000000..95f8059d1 --- /dev/null +++ b/app/assets/javascripts/components/reducers/accounts.jsx @@ -0,0 +1,80 @@ +import { + ACCOUNT_SET_SELF, + ACCOUNT_FETCH_SUCCESS, + FOLLOWERS_FETCH_SUCCESS, + FOLLOWING_FETCH_SUCCESS, + ACCOUNT_TIMELINE_FETCH_SUCCESS, + ACCOUNT_TIMELINE_EXPAND_SUCCESS +} from '../actions/accounts'; +import { FOLLOW_SUBMIT_SUCCESS } from '../actions/follow'; +import { SUGGESTIONS_FETCH_SUCCESS } from '../actions/suggestions'; +import { + REBLOG_SUCCESS, + UNREBLOG_SUCCESS, + FAVOURITE_SUCCESS, + UNFAVOURITE_SUCCESS +} from '../actions/interactions'; +import { + TIMELINE_REFRESH_SUCCESS, + TIMELINE_UPDATE, + TIMELINE_EXPAND_SUCCESS +} from '../actions/timelines'; +import { STATUS_FETCH_SUCCESS } from '../actions/statuses'; +import Immutable from 'immutable'; + +const normalizeAccount = (state, account) => state.set(account.get('id'), account); + +const normalizeAccounts = (state, accounts) => { + accounts.forEach(account => { + state = normalizeAccount(state, account); + }); + + return state; +}; + +const normalizeAccountFromStatus = (state, status) => { + state = normalizeAccount(state, status.get('account')); + + if (status.getIn(['reblog', 'account'])) { + state = normalizeAccount(state, status.getIn(['reblog', 'account'])); + } + + return state; +}; + +const normalizeAccountsFromStatuses = (state, statuses) => { + statuses.forEach(status => { + state = normalizeAccountFromStatus(state, status); + }); + + return state; +}; + +const initialState = Immutable.Map(); + +export default function accounts(state = initialState, action) { + switch(action.type) { + case ACCOUNT_SET_SELF: + case ACCOUNT_FETCH_SUCCESS: + case FOLLOW_SUBMIT_SUCCESS: + return normalizeAccount(state, Immutable.fromJS(action.account)); + case SUGGESTIONS_FETCH_SUCCESS: + case FOLLOWERS_FETCH_SUCCESS: + case FOLLOWING_FETCH_SUCCESS: + return normalizeAccounts(state, Immutable.fromJS(action.accounts)); + case TIMELINE_REFRESH_SUCCESS: + case TIMELINE_EXPAND_SUCCESS: + case ACCOUNT_TIMELINE_FETCH_SUCCESS: + case ACCOUNT_TIMELINE_EXPAND_SUCCESS: + return normalizeAccountsFromStatuses(state, Immutable.fromJS(action.statuses)); + case TIMELINE_UPDATE: + case REBLOG_SUCCESS: + case FAVOURITE_SUCCESS: + case UNREBLOG_SUCCESS: + case UNFAVOURITE_SUCCESS: + case STATUS_FETCH_SUCCESS: + return normalizeAccountFromStatus(state, Immutable.fromJS(action.status)); + default: + return state; + } +}; diff --git a/app/assets/javascripts/components/reducers/compose.jsx b/app/assets/javascripts/components/reducers/compose.jsx index f2fd3ad80..1c676326f 100644 --- a/app/assets/javascripts/components/reducers/compose.jsx +++ b/app/assets/javascripts/components/reducers/compose.jsx @@ -11,10 +11,10 @@ import { COMPOSE_UPLOAD_FAIL, COMPOSE_UPLOAD_UNDO, COMPOSE_UPLOAD_PROGRESS -} from '../actions/compose'; -import { TIMELINE_DELETE } from '../actions/timelines'; +} from '../actions/compose'; +import { TIMELINE_DELETE } from '../actions/timelines'; import { ACCOUNT_SET_SELF } from '../actions/accounts'; -import Immutable from 'immutable'; +import Immutable from 'immutable'; const initialState = Immutable.Map({ text: '', diff --git a/app/assets/javascripts/components/reducers/follow.jsx b/app/assets/javascripts/components/reducers/follow.jsx index e1dc293c6..ed6e8e0ef 100644 --- a/app/assets/javascripts/components/reducers/follow.jsx +++ b/app/assets/javascripts/components/reducers/follow.jsx @@ -3,7 +3,7 @@ import { FOLLOW_SUBMIT_REQUEST, FOLLOW_SUBMIT_SUCCESS, FOLLOW_SUBMIT_FAIL -} from '../actions/follow'; +} from '../actions/follow'; import Immutable from 'immutable'; const initialState = Immutable.Map({ diff --git a/app/assets/javascripts/components/reducers/index.jsx b/app/assets/javascripts/components/reducers/index.jsx index 62d6839d7..ccc9e8e8e 100644 --- a/app/assets/javascripts/components/reducers/index.jsx +++ b/app/assets/javascripts/components/reducers/index.jsx @@ -7,7 +7,9 @@ import notifications from './notifications'; import { loadingBarReducer } from 'react-redux-loading-bar'; import modal from './modal'; import user_lists from './user_lists'; -import suggestions from './suggestions'; +import accounts from './accounts'; +import statuses from './statuses'; +import relationships from './relationships'; export default combineReducers({ timelines, @@ -18,5 +20,7 @@ export default combineReducers({ loadingBar: loadingBarReducer, modal, user_lists, - suggestions + accounts, + statuses, + relationships }); diff --git a/app/assets/javascripts/components/reducers/meta.jsx b/app/assets/javascripts/components/reducers/meta.jsx index 71a14dbd3..c7222c60b 100644 --- a/app/assets/javascripts/components/reducers/meta.jsx +++ b/app/assets/javascripts/components/reducers/meta.jsx @@ -1,5 +1,6 @@ -import { ACCESS_TOKEN_SET } from '../actions/meta'; -import Immutable from 'immutable'; +import { ACCESS_TOKEN_SET } from '../actions/meta'; +import { ACCOUNT_SET_SELF } from '../actions/accounts'; +import Immutable from 'immutable'; const initialState = Immutable.Map(); @@ -7,6 +8,8 @@ export default function meta(state = initialState, action) { switch(action.type) { case ACCESS_TOKEN_SET: return state.set('access_token', action.token); + case ACCOUNT_SET_SELF: + return state.set('me', action.account.id); default: return state; } diff --git a/app/assets/javascripts/components/reducers/notifications.jsx b/app/assets/javascripts/components/reducers/notifications.jsx index 886587bdb..efe8d9739 100644 --- a/app/assets/javascripts/components/reducers/notifications.jsx +++ b/app/assets/javascripts/components/reducers/notifications.jsx @@ -2,8 +2,8 @@ import { NOTIFICATION_SHOW, NOTIFICATION_DISMISS, NOTIFICATION_CLEAR -} from '../actions/notifications'; -import Immutable from 'immutable'; +} from '../actions/notifications'; +import Immutable from 'immutable'; const initialState = Immutable.List([]); diff --git a/app/assets/javascripts/components/reducers/relationships.jsx b/app/assets/javascripts/components/reducers/relationships.jsx new file mode 100644 index 000000000..165b1f3ff --- /dev/null +++ b/app/assets/javascripts/components/reducers/relationships.jsx @@ -0,0 +1,34 @@ +import { + ACCOUNT_FOLLOW_SUCCESS, + ACCOUNT_UNFOLLOW_SUCCESS, + ACCOUNT_BLOCK_SUCCESS, + ACCOUNT_UNBLOCK_SUCCESS, + RELATIONSHIPS_FETCH_SUCCESS +} from '../actions/accounts'; +import Immutable from 'immutable'; + +const normalizeRelationship = (state, relationship) => state.set(relationship.get('id'), relationship); + +const normalizeRelationships = (state, relationships) => { + relationships.forEach(relationship => { + state = normalizeRelationship(state, relationship); + }); + + return state; +}; + +const initialState = Immutable.Map(); + +export default function relationships(state = initialState, action) { + switch(action.type) { + case ACCOUNT_FOLLOW_SUCCESS: + case ACCOUNT_UNFOLLOW_SUCCESS: + case ACCOUNT_BLOCK_SUCCESS: + case ACCOUNT_UNBLOCK_SUCCESS: + return normalizeRelationship(state, Immutable.fromJS(action.relationship)); + case RELATIONSHIPS_FETCH_SUCCESS: + return normalizeRelationships(state, Immutable.fromJS(action.relationships)); + default: + return state; + } +}; diff --git a/app/assets/javascripts/components/reducers/statuses.jsx b/app/assets/javascripts/components/reducers/statuses.jsx new file mode 100644 index 000000000..4a970038f --- /dev/null +++ b/app/assets/javascripts/components/reducers/statuses.jsx @@ -0,0 +1,68 @@ +import { + REBLOG_SUCCESS, + UNREBLOG_SUCCESS, + FAVOURITE_SUCCESS, + UNFAVOURITE_SUCCESS +} from '../actions/interactions'; +import { + STATUS_FETCH_SUCCESS, + CONTEXT_FETCH_SUCCESS +} from '../actions/statuses'; +import { + TIMELINE_REFRESH_SUCCESS, + TIMELINE_UPDATE, + TIMELINE_DELETE, + TIMELINE_EXPAND_SUCCESS +} from '../actions/timelines'; +import { + ACCOUNT_TIMELINE_FETCH_SUCCESS, + ACCOUNT_TIMELINE_EXPAND_SUCCESS +} from '../actions/accounts'; +import Immutable from 'immutable'; + +const normalizeStatus = (state, status) => { + status = status.set('account', status.getIn(['account', 'id'])); + + if (status.getIn(['reblog', 'id'])) { + state = normalizeStatus(state, status.get('reblog')); + status = status.set('reblog', status.getIn(['reblog', 'id'])); + } + + return state.set(status.get('id'), status); +}; + +const normalizeStatuses = (state, statuses) => { + statuses.forEach(status => { + state = normalizeStatus(state, status); + }); + + return state; +}; + +const deleteStatus = (state, id, references) => { + references.forEach(ref => { + state = deleteStatus(state, ref[0], []); + }); + + return state.delete(id); +}; + +const initialState = Immutable.Map(); + +export default function statuses(state = initialState, action) { + switch(action.type) { + case TIMELINE_UPDATE: + case STATUS_FETCH_SUCCESS: + return normalizeStatus(state, Immutable.fromJS(action.status)); + case TIMELINE_REFRESH_SUCCESS: + case TIMELINE_EXPAND_SUCCESS: + case ACCOUNT_TIMELINE_FETCH_SUCCESS: + case ACCOUNT_TIMELINE_EXPAND_SUCCESS: + case CONTEXT_FETCH_SUCCESS: + return normalizeStatuses(state, Immutable.fromJS(action.statuses)); + case TIMELINE_DELETE: + return deleteStatus(state, action.id, action.references); + default: + return state; + } +}; diff --git a/app/assets/javascripts/components/reducers/suggestions.jsx b/app/assets/javascripts/components/reducers/suggestions.jsx deleted file mode 100644 index 9d2b7d96a..000000000 --- a/app/assets/javascripts/components/reducers/suggestions.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { SUGGESTIONS_FETCH_SUCCESS } from '../actions/suggestions'; -import Immutable from 'immutable'; - -const initialState = Immutable.List(); - -export default function suggestions(state = initialState, action) { - switch(action.type) { - case SUGGESTIONS_FETCH_SUCCESS: - return Immutable.List(action.accounts.map(item => item.id)); - default: - return state; - } -} diff --git a/app/assets/javascripts/components/reducers/timelines.jsx b/app/assets/javascripts/components/reducers/timelines.jsx index 4bf97c18d..db13cad31 100644 --- a/app/assets/javascripts/components/reducers/timelines.jsx +++ b/app/assets/javascripts/components/reducers/timelines.jsx @@ -3,85 +3,52 @@ import { TIMELINE_UPDATE, TIMELINE_DELETE, TIMELINE_EXPAND_SUCCESS -} from '../actions/timelines'; +} from '../actions/timelines'; import { REBLOG_SUCCESS, UNREBLOG_SUCCESS, FAVOURITE_SUCCESS, UNFAVOURITE_SUCCESS -} from '../actions/interactions'; +} from '../actions/interactions'; import { - ACCOUNT_SET_SELF, ACCOUNT_FETCH_SUCCESS, - ACCOUNT_FOLLOW_SUCCESS, - ACCOUNT_UNFOLLOW_SUCCESS, - ACCOUNT_BLOCK_SUCCESS, - ACCOUNT_UNBLOCK_SUCCESS, ACCOUNT_TIMELINE_FETCH_SUCCESS, - ACCOUNT_TIMELINE_EXPAND_SUCCESS, - FOLLOWERS_FETCH_SUCCESS, - FOLLOWING_FETCH_SUCCESS, - RELATIONSHIPS_FETCH_SUCCESS -} from '../actions/accounts'; + ACCOUNT_TIMELINE_EXPAND_SUCCESS +} from '../actions/accounts'; import { STATUS_FETCH_SUCCESS, - STATUS_DELETE_SUCCESS -} from '../actions/statuses'; -import { FOLLOW_SUBMIT_SUCCESS } from '../actions/follow'; -import { SUGGESTIONS_FETCH_SUCCESS } from '../actions/suggestions'; -import Immutable from 'immutable'; + CONTEXT_FETCH_SUCCESS +} from '../actions/statuses'; +import Immutable from 'immutable'; const initialState = Immutable.Map({ - home: Immutable.List([]), - mentions: Immutable.List([]), - public: Immutable.List([]), - statuses: Immutable.Map(), - accounts: Immutable.Map(), + home: Immutable.List(), + mentions: Immutable.List(), + public: Immutable.List(), accounts_timelines: Immutable.Map(), - me: null, ancestors: Immutable.Map(), - descendants: Immutable.Map(), - relationships: Immutable.Map(), - suggestions: Immutable.List([]) + descendants: Immutable.Map() }); -function normalizeStatus(state, status) { - // Separate account - let account = status.get('account'); - status = status.set('account', account.get('id')); +const normalizeStatus = (state, status) => { + const replyToId = status.get('in_reply_to_id'); + const id = status.get('id'); - // Separate reblog, repeat for reblog - let reblog = status.get('reblog', null); - - if (reblog !== null) { - status = status.set('reblog', reblog.get('id')); - state = normalizeStatus(state, reblog); - } - - // Replies - if (status.get('in_reply_to_id')) { - state = state.updateIn(['descendants', status.get('in_reply_to_id')], set => { - if (!Immutable.OrderedSet.isOrderedSet(set)) { - return Immutable.OrderedSet([status.get('id')]); - } else { - return set.add(status.get('id')); - } - }); - } + if (replyToId) { + if (!state.getIn(['descendants', replyToId], Immutable.List()).includes(id)) { + state = state.updateIn(['descendants', replyToId], Immutable.List(), set => set.push(id)); + } - return state.withMutations(map => { - if (status.get('in_reply_to_id')) { - map.updateIn(['descendants', status.get('in_reply_to_id')], Immutable.OrderedSet(), set => set.add(status.get('id'))); - map.updateIn(['ancestors', status.get('id')], Immutable.OrderedSet(), set => set.add(status.get('in_reply_to_id'))); + if (!state.getIn(['ancestors', id], Immutable.List()).includes(replyToId)) { + state = state.updateIn(['ancestors', id], Immutable.List(), set => set.push(replyToId)); } + } - map.setIn(['accounts', account.get('id')], account); - map.setIn(['statuses', status.get('id')], status); - }); + return state; }; -function normalizeTimeline(state, timeline, statuses, replace = false) { - let ids = Immutable.List([]); +const normalizeTimeline = (state, timeline, statuses, replace = false) => { + let ids = Immutable.List(); statuses.forEach((status, i) => { state = normalizeStatus(state, status); @@ -91,8 +58,8 @@ function normalizeTimeline(state, timeline, statuses, replace = false) { return state.update(timeline, list => (replace ? ids : list.unshift(...ids))); }; -function appendNormalizedTimeline(state, timeline, statuses) { - let moreIds = Immutable.List([]); +const appendNormalizedTimeline = (state, timeline, statuses) => { + let moreIds = Immutable.List(); statuses.forEach((status, i) => { state = normalizeStatus(state, status); @@ -102,8 +69,8 @@ function appendNormalizedTimeline(state, timeline, statuses) { return state.update(timeline, list => list.push(...moreIds)); }; -function normalizeAccountTimeline(state, accountId, statuses, replace = false) { - let ids = Immutable.List([]); +const normalizeAccountTimeline = (state, accountId, statuses, replace = false) => { + let ids = Immutable.List(); statuses.forEach((status, i) => { state = normalizeStatus(state, status); @@ -113,7 +80,7 @@ function normalizeAccountTimeline(state, accountId, statuses, replace = false) { return state.updateIn(['accounts_timelines', accountId], Immutable.List([]), list => (replace ? ids : list.unshift(...ids))); }; -function appendNormalizedAccountTimeline(state, accountId, statuses) { +const appendNormalizedAccountTimeline = (state, accountId, statuses) => { let moreIds = Immutable.List([]); statuses.forEach((status, i) => { @@ -124,107 +91,60 @@ function appendNormalizedAccountTimeline(state, accountId, statuses) { return state.updateIn(['accounts_timelines', accountId], Immutable.List([]), list => list.push(...moreIds)); }; -function updateTimeline(state, timeline, status) { +const updateTimeline = (state, timeline, status, references) => { state = normalizeStatus(state, status); state = state.update(timeline, list => { const reblogOfId = status.getIn(['reblog', 'id'], null); if (reblogOfId !== null) { - const otherReblogs = state.get('statuses').filter(item => item.get('reblog') === reblogOfId).map((_, itemId) => itemId); - list = list.filterNot(itemId => (itemId === reblogOfId || otherReblogs.includes(itemId))); + list = list.filterNot(itemId => references.includes(itemId)); } return list.unshift(status.get('id')); }); - //state = state.updateIn(['accounts_timelines', status.getIn(['account', 'id'])], Immutable.List([]), list => (list.includes(status.get('id')) ? list : list.unshift(status.get('id')))); - return state; }; -function deleteStatus(state, id) { - const status = state.getIn(['statuses', id]); - - if (!status) { - return state; - } - +const deleteStatus = (state, id, accountId, references) => { // Remove references from timelines - ['home', 'mentions'].forEach(function (timeline) { + ['home', 'mentions', 'public'].forEach(function (timeline) { state = state.update(timeline, list => list.filterNot(item => item === id)); }); // Remove references from account timelines - state = state.updateIn(['accounts_timelines', status.get('account')], Immutable.List([]), list => list.filterNot(item => item === id)); + state = state.updateIn(['accounts_timelines', accountId], Immutable.List([]), list => list.filterNot(item => item === id)); - // Remove reblogs of deleted status - const references = state.get('statuses').filter(item => item.get('reblog') === id); - - references.forEach(referencingId => { - state = deleteStatus(state, referencingId); + // Remove references from context + state.getIn(['descendants', id], Immutable.List()).forEach(descendantId => { + state = state.updateIn(['ancestors', descendantId], Immutable.List(), list => list.filterNot(itemId => itemId === id)); }); - // Remove normalized status - return state.deleteIn(['statuses', id]); -}; - -function normalizeAccount(state, account, relationship) { - if (relationship) { - state = normalizeRelationship(state, relationship); - } - - return state.setIn(['accounts', account.get('id')], account); -}; - -function normalizeRelationship(state, relationship) { - if (state.get('suggestions').includes(relationship.get('id')) && (relationship.get('following') || relationship.get('blocking'))) { - state = state.update('suggestions', list => list.filterNot(id => id === relationship.get('id'))); - } + state.getIn(['ancestors', id], Immutable.List()).forEach(ancestorId => { + state = state.updateIn(['descendants', ancestorId], Immutable.List(), list => list.filterNot(itemId => itemId === id)); + }); - return state.setIn(['relationships', relationship.get('id')], relationship); -}; + state = state.deleteIn(['descendants', id]).deleteIn(['ancestors', id]); -function normalizeRelationships(state, relationships) { - relationships.forEach(relationship => { - state = normalizeRelationship(state, relationship); + // Remove reblogs of deleted status + references.forEach(ref => { + state = deleteStatus(state, ref[0], ref[1], []); }); return state; }; -function setSelf(state, account) { - state = normalizeAccount(state, account); - return state.set('me', account.get('id')); -}; - -function normalizeContext(state, status, ancestors, descendants) { - state = normalizeStatus(state, status); - - let ancestorsIds = ancestors.map(ancestor => { - state = normalizeStatus(state, ancestor); - return ancestor.get('id'); - }).toOrderedSet(); - - let descendantsIds = descendants.map(descendant => { - state = normalizeStatus(state, descendant); - return descendant.get('id'); - }).toOrderedSet(); +const normalizeContext = (state, id, ancestors, descendants) => { + const ancestorsIds = ancestors.map(ancestor => ancestor.get('id')); + const descendantsIds = descendants.map(descendant => descendant.get('id')); return state.withMutations(map => { - map.setIn(['ancestors', status.get('id')], ancestorsIds); - map.setIn(['descendants', status.get('id')], descendantsIds); + map.setIn(['ancestors', id], ancestorsIds); + map.setIn(['descendants', id], descendantsIds); }); }; -function normalizeAccounts(state, accounts) { - accounts.forEach(account => { - state = state.setIn(['accounts', account.get('id')], account); - }); - - return state; -}; - export default function timelines(state = initialState, action) { switch(action.type) { case TIMELINE_REFRESH_SUCCESS: @@ -232,37 +152,15 @@ export default function timelines(state = initialState, action) { case TIMELINE_EXPAND_SUCCESS: return appendNormalizedTimeline(state, action.timeline, Immutable.fromJS(action.statuses)); case TIMELINE_UPDATE: - return updateTimeline(state, action.timeline, Immutable.fromJS(action.status)); + return updateTimeline(state, action.timeline, Immutable.fromJS(action.status), action.references); case TIMELINE_DELETE: - case STATUS_DELETE_SUCCESS: - return deleteStatus(state, action.id); - case REBLOG_SUCCESS: - case FAVOURITE_SUCCESS: - case UNREBLOG_SUCCESS: - case UNFAVOURITE_SUCCESS: - return normalizeStatus(state, Immutable.fromJS(action.response)); - case ACCOUNT_SET_SELF: - return setSelf(state, Immutable.fromJS(action.account)); - case ACCOUNT_FETCH_SUCCESS: - case FOLLOW_SUBMIT_SUCCESS: - return normalizeAccount(state, Immutable.fromJS(action.account), Immutable.fromJS(action.relationship)); - case ACCOUNT_FOLLOW_SUCCESS: - case ACCOUNT_UNFOLLOW_SUCCESS: - case ACCOUNT_UNBLOCK_SUCCESS: - case ACCOUNT_BLOCK_SUCCESS: - return normalizeRelationship(state, Immutable.fromJS(action.relationship)); - case STATUS_FETCH_SUCCESS: - return normalizeContext(state, Immutable.fromJS(action.status), Immutable.fromJS(action.context.ancestors), Immutable.fromJS(action.context.descendants)); + return deleteStatus(state, action.id, action.accountId, action.references); + case CONTEXT_FETCH_SUCCESS: + return normalizeContext(state, action.id, Immutable.fromJS(action.ancestors), Immutable.fromJS(action.descendants)); case ACCOUNT_TIMELINE_FETCH_SUCCESS: return normalizeAccountTimeline(state, action.id, Immutable.fromJS(action.statuses), action.replace); case ACCOUNT_TIMELINE_EXPAND_SUCCESS: return appendNormalizedAccountTimeline(state, action.id, Immutable.fromJS(action.statuses)); - case SUGGESTIONS_FETCH_SUCCESS: - case FOLLOWERS_FETCH_SUCCESS: - case FOLLOWING_FETCH_SUCCESS: - return normalizeAccounts(state, Immutable.fromJS(action.accounts)); - case RELATIONSHIPS_FETCH_SUCCESS: - return normalizeRelationships(state, Immutable.fromJS(action.relationships)); default: return state; } diff --git a/app/assets/javascripts/components/reducers/user_lists.jsx b/app/assets/javascripts/components/reducers/user_lists.jsx index ee4b84296..d3b073e95 100644 --- a/app/assets/javascripts/components/reducers/user_lists.jsx +++ b/app/assets/javascripts/components/reducers/user_lists.jsx @@ -1,12 +1,14 @@ import { FOLLOWERS_FETCH_SUCCESS, FOLLOWING_FETCH_SUCCESS -} from '../actions/accounts'; -import Immutable from 'immutable'; +} from '../actions/accounts'; +import { SUGGESTIONS_FETCH_SUCCESS } from '../actions/suggestions'; +import Immutable from 'immutable'; const initialState = Immutable.Map({ followers: Immutable.Map(), - following: Immutable.Map() + following: Immutable.Map(), + suggestions: Immutable.List() }); export default function userLists(state = initialState, action) { @@ -15,6 +17,8 @@ export default function userLists(state = initialState, action) { return state.setIn(['followers', action.id], Immutable.List(action.accounts.map(item => item.id))); case FOLLOWING_FETCH_SUCCESS: return state.setIn(['following', action.id], Immutable.List(action.accounts.map(item => item.id))); + case SUGGESTIONS_FETCH_SUCCESS: + return state.set('suggestions', Immutable.List(action.accounts.map(item => item.id))); default: return state; } -- cgit