3 FOLLOWERS_FETCH_SUCCESS
,
4 FOLLOWERS_EXPAND_SUCCESS
,
5 FOLLOWING_FETCH_SUCCESS
,
6 FOLLOWING_EXPAND_SUCCESS
,
7 FOLLOW_REQUESTS_FETCH_SUCCESS
,
8 FOLLOW_REQUESTS_EXPAND_SUCCESS
,
9 PINNED_ACCOUNTS_FETCH_SUCCESS
,
10 PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_READY
,
11 } from 'flavours/glitch/actions/accounts';
14 BLOCKS_EXPAND_SUCCESS
,
15 } from 'flavours/glitch/actions/blocks';
19 } from 'flavours/glitch/actions/mutes';
20 import { COMPOSE_SUGGESTIONS_READY
} from 'flavours/glitch/actions/compose';
28 REBLOGS_FETCH_SUCCESS
,
29 FAVOURITES_FETCH_SUCCESS
,
30 } from 'flavours/glitch/actions/interactions';
33 TIMELINE_EXPAND_SUCCESS
,
34 } from 'flavours/glitch/actions/timelines';
37 CONTEXT_FETCH_SUCCESS
,
38 } from 'flavours/glitch/actions/statuses';
39 import { SEARCH_FETCH_SUCCESS
} from 'flavours/glitch/actions/search';
42 NOTIFICATIONS_EXPAND_SUCCESS
,
43 } from 'flavours/glitch/actions/notifications';
45 FAVOURITED_STATUSES_FETCH_SUCCESS
,
46 FAVOURITED_STATUSES_EXPAND_SUCCESS
,
47 } from 'flavours/glitch/actions/favourites';
49 BOOKMARKED_STATUSES_FETCH_SUCCESS
,
50 BOOKMARKED_STATUSES_EXPAND_SUCCESS
,
51 } from 'flavours/glitch/actions/bookmarks';
53 LIST_ACCOUNTS_FETCH_SUCCESS
,
54 LIST_EDITOR_SUGGESTIONS_READY
,
55 } from 'flavours/glitch/actions/lists';
56 import { STORE_HYDRATE
} from 'flavours/glitch/actions/store';
57 import emojify
from 'flavours/glitch/util/emoji';
58 import { Map as ImmutableMap
, fromJS
} from 'immutable';
59 import escapeTextContentForBrowser
from 'escape-html';
60 import { unescapeHTML
} from 'flavours/glitch/util/html';
62 const makeEmojiMap
= record
=> record
.emojis
.reduce((obj
, emoji
) => {
63 obj
[`:${emoji.shortcode}:`] = emoji
;
67 const normalizeAccount
= (state
, account
) => {
68 account
= { ...account
};
70 delete account
.followers_count
;
71 delete account
.following_count
;
72 delete account
.statuses_count
;
74 const emojiMap
= makeEmojiMap(account
);
75 const displayName
= account
.display_name
.length
=== 0 ? account
.username : account
.display_name
;
76 account
.display_name_html
= emojify(escapeTextContentForBrowser(displayName
), emojiMap
);
77 account
.note_emojified
= emojify(account
.note
, emojiMap
);
80 account
.fields
= account
.fields
.map(pair
=> ({
82 name_emojified: emojify(escapeTextContentForBrowser(pair
.name
)),
83 value_emojified: emojify(pair
.value
, emojiMap
),
84 value_plain: unescapeHTML(pair
.value
),
89 state
= normalizeAccount(state
, account
.moved
);
90 account
.moved
= account
.moved
.id
;
93 return state
.set(account
.id
, fromJS(account
));
96 const normalizeAccounts
= (state
, accounts
) => {
97 accounts
.forEach(account
=> {
98 state
= normalizeAccount(state
, account
);
104 const normalizeAccountFromStatus
= (state
, status
) => {
105 state
= normalizeAccount(state
, status
.account
);
107 if (status
.reblog
&& status
.reblog
.account
) {
108 state
= normalizeAccount(state
, status
.reblog
.account
);
114 const normalizeAccountsFromStatuses
= (state
, statuses
) => {
115 statuses
.forEach(status
=> {
116 state
= normalizeAccountFromStatus(state
, status
);
122 const initialState
= ImmutableMap();
124 export default function accounts(state
= initialState
, action
) {
125 switch(action
.type
) {
127 return normalizeAccounts(state
, Object
.values(action
.state
.get('accounts').toJS()));
128 case ACCOUNT_FETCH_SUCCESS:
129 case NOTIFICATIONS_UPDATE:
130 return normalizeAccount(state
, action
.account
);
131 case FOLLOWERS_FETCH_SUCCESS:
132 case FOLLOWERS_EXPAND_SUCCESS:
133 case FOLLOWING_FETCH_SUCCESS:
134 case FOLLOWING_EXPAND_SUCCESS:
135 case REBLOGS_FETCH_SUCCESS:
136 case FAVOURITES_FETCH_SUCCESS:
137 case COMPOSE_SUGGESTIONS_READY:
138 case FOLLOW_REQUESTS_FETCH_SUCCESS:
139 case FOLLOW_REQUESTS_EXPAND_SUCCESS:
140 case BLOCKS_FETCH_SUCCESS:
141 case BLOCKS_EXPAND_SUCCESS:
142 case MUTES_FETCH_SUCCESS:
143 case MUTES_EXPAND_SUCCESS:
144 case LIST_ACCOUNTS_FETCH_SUCCESS:
145 case LIST_EDITOR_SUGGESTIONS_READY:
146 case PINNED_ACCOUNTS_FETCH_SUCCESS:
147 case PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_READY:
148 return action
.accounts
? normalizeAccounts(state
, action
.accounts
) : state
;
149 case NOTIFICATIONS_EXPAND_SUCCESS:
150 case SEARCH_FETCH_SUCCESS:
151 return normalizeAccountsFromStatuses(normalizeAccounts(state
, action
.accounts
), action
.statuses
);
152 case TIMELINE_EXPAND_SUCCESS:
153 case CONTEXT_FETCH_SUCCESS:
154 case FAVOURITED_STATUSES_FETCH_SUCCESS:
155 case FAVOURITED_STATUSES_EXPAND_SUCCESS:
156 case BOOKMARKED_STATUSES_FETCH_SUCCESS:
157 case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
158 return normalizeAccountsFromStatuses(state
, action
.statuses
);
160 case FAVOURITE_SUCCESS:
161 case UNREBLOG_SUCCESS:
162 case UNFAVOURITE_SUCCESS:
163 case BOOKMARK_SUCCESS:
164 case UNBOOKMARK_SUCCESS:
165 return normalizeAccountFromStatus(state
, action
.response
);
166 case TIMELINE_UPDATE:
167 case STATUS_FETCH_SUCCESS:
168 return normalizeAccountFromStatus(state
, action
.status
);