]> cat aescling's git repositories - mastodon.git/blob - app/javascript/flavours/glitch/reducers/accounts.js
c2f016a87cfde941731175fecc2113b746c560ff
[mastodon.git] / app / javascript / flavours / glitch / reducers / accounts.js
1 import {
2 ACCOUNT_FETCH_SUCCESS,
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';
12 import {
13 BLOCKS_FETCH_SUCCESS,
14 BLOCKS_EXPAND_SUCCESS,
15 } from 'flavours/glitch/actions/blocks';
16 import {
17 MUTES_FETCH_SUCCESS,
18 MUTES_EXPAND_SUCCESS,
19 } from 'flavours/glitch/actions/mutes';
20 import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose';
21 import {
22 REBLOG_SUCCESS,
23 UNREBLOG_SUCCESS,
24 FAVOURITE_SUCCESS,
25 UNFAVOURITE_SUCCESS,
26 BOOKMARK_SUCCESS,
27 UNBOOKMARK_SUCCESS,
28 REBLOGS_FETCH_SUCCESS,
29 FAVOURITES_FETCH_SUCCESS,
30 } from 'flavours/glitch/actions/interactions';
31 import {
32 TIMELINE_UPDATE,
33 TIMELINE_EXPAND_SUCCESS,
34 } from 'flavours/glitch/actions/timelines';
35 import {
36 STATUS_FETCH_SUCCESS,
37 CONTEXT_FETCH_SUCCESS,
38 } from 'flavours/glitch/actions/statuses';
39 import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search';
40 import {
41 NOTIFICATIONS_UPDATE,
42 NOTIFICATIONS_EXPAND_SUCCESS,
43 } from 'flavours/glitch/actions/notifications';
44 import {
45 FAVOURITED_STATUSES_FETCH_SUCCESS,
46 FAVOURITED_STATUSES_EXPAND_SUCCESS,
47 } from 'flavours/glitch/actions/favourites';
48 import {
49 BOOKMARKED_STATUSES_FETCH_SUCCESS,
50 BOOKMARKED_STATUSES_EXPAND_SUCCESS,
51 } from 'flavours/glitch/actions/bookmarks';
52 import {
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';
61
62 const makeEmojiMap = record => record.emojis.reduce((obj, emoji) => {
63 obj[`:${emoji.shortcode}:`] = emoji;
64 return obj;
65 }, {});
66
67 const normalizeAccount = (state, account) => {
68 account = { ...account };
69
70 delete account.followers_count;
71 delete account.following_count;
72 delete account.statuses_count;
73
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);
78
79 if (account.fields) {
80 account.fields = account.fields.map(pair => ({
81 ...pair,
82 name_emojified: emojify(escapeTextContentForBrowser(pair.name)),
83 value_emojified: emojify(pair.value, emojiMap),
84 value_plain: unescapeHTML(pair.value),
85 }));
86 }
87
88 if (account.moved) {
89 state = normalizeAccount(state, account.moved);
90 account.moved = account.moved.id;
91 }
92
93 return state.set(account.id, fromJS(account));
94 };
95
96 const normalizeAccounts = (state, accounts) => {
97 accounts.forEach(account => {
98 state = normalizeAccount(state, account);
99 });
100
101 return state;
102 };
103
104 const normalizeAccountFromStatus = (state, status) => {
105 state = normalizeAccount(state, status.account);
106
107 if (status.reblog && status.reblog.account) {
108 state = normalizeAccount(state, status.reblog.account);
109 }
110
111 return state;
112 };
113
114 const normalizeAccountsFromStatuses = (state, statuses) => {
115 statuses.forEach(status => {
116 state = normalizeAccountFromStatus(state, status);
117 });
118
119 return state;
120 };
121
122 const initialState = ImmutableMap();
123
124 export default function accounts(state = initialState, action) {
125 switch(action.type) {
126 case STORE_HYDRATE:
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);
159 case REBLOG_SUCCESS:
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);
169 default:
170 return state;
171 }
172 };
This page took 0.102974 seconds and 4 git commands to generate.