user_lists.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
  2. import {
  3. DIRECTORY_FETCH_REQUEST,
  4. DIRECTORY_FETCH_SUCCESS,
  5. DIRECTORY_FETCH_FAIL,
  6. DIRECTORY_EXPAND_REQUEST,
  7. DIRECTORY_EXPAND_SUCCESS,
  8. DIRECTORY_EXPAND_FAIL,
  9. } from 'mastodon/actions/directory';
  10. import {
  11. FEATURED_TAGS_FETCH_REQUEST,
  12. FEATURED_TAGS_FETCH_SUCCESS,
  13. FEATURED_TAGS_FETCH_FAIL,
  14. } from 'mastodon/actions/featured_tags';
  15. import {
  16. FOLLOWERS_FETCH_REQUEST,
  17. FOLLOWERS_FETCH_SUCCESS,
  18. FOLLOWERS_FETCH_FAIL,
  19. FOLLOWERS_EXPAND_REQUEST,
  20. FOLLOWERS_EXPAND_SUCCESS,
  21. FOLLOWERS_EXPAND_FAIL,
  22. FOLLOWING_FETCH_REQUEST,
  23. FOLLOWING_FETCH_SUCCESS,
  24. FOLLOWING_FETCH_FAIL,
  25. FOLLOWING_EXPAND_REQUEST,
  26. FOLLOWING_EXPAND_SUCCESS,
  27. FOLLOWING_EXPAND_FAIL,
  28. FOLLOW_REQUESTS_FETCH_REQUEST,
  29. FOLLOW_REQUESTS_FETCH_SUCCESS,
  30. FOLLOW_REQUESTS_FETCH_FAIL,
  31. FOLLOW_REQUESTS_EXPAND_REQUEST,
  32. FOLLOW_REQUESTS_EXPAND_SUCCESS,
  33. FOLLOW_REQUESTS_EXPAND_FAIL,
  34. authorizeFollowRequestSuccess,
  35. rejectFollowRequestSuccess,
  36. } from '../actions/accounts';
  37. import {
  38. BLOCKS_FETCH_REQUEST,
  39. BLOCKS_FETCH_SUCCESS,
  40. BLOCKS_FETCH_FAIL,
  41. BLOCKS_EXPAND_REQUEST,
  42. BLOCKS_EXPAND_SUCCESS,
  43. BLOCKS_EXPAND_FAIL,
  44. } from '../actions/blocks';
  45. import {
  46. REBLOGS_FETCH_REQUEST,
  47. REBLOGS_FETCH_SUCCESS,
  48. REBLOGS_FETCH_FAIL,
  49. REBLOGS_EXPAND_REQUEST,
  50. REBLOGS_EXPAND_SUCCESS,
  51. REBLOGS_EXPAND_FAIL,
  52. FAVOURITES_FETCH_REQUEST,
  53. FAVOURITES_FETCH_SUCCESS,
  54. FAVOURITES_FETCH_FAIL,
  55. FAVOURITES_EXPAND_REQUEST,
  56. FAVOURITES_EXPAND_SUCCESS,
  57. FAVOURITES_EXPAND_FAIL,
  58. } from '../actions/interactions';
  59. import {
  60. MUTES_FETCH_REQUEST,
  61. MUTES_FETCH_SUCCESS,
  62. MUTES_FETCH_FAIL,
  63. MUTES_EXPAND_REQUEST,
  64. MUTES_EXPAND_SUCCESS,
  65. MUTES_EXPAND_FAIL,
  66. } from '../actions/mutes';
  67. import { notificationsUpdate } from '../actions/notifications';
  68. const initialListState = ImmutableMap({
  69. next: null,
  70. isLoading: false,
  71. items: ImmutableList(),
  72. });
  73. const initialState = ImmutableMap({
  74. followers: initialListState,
  75. following: initialListState,
  76. reblogged_by: initialListState,
  77. favourited_by: initialListState,
  78. follow_requests: initialListState,
  79. blocks: initialListState,
  80. mutes: initialListState,
  81. featured_tags: initialListState,
  82. });
  83. const normalizeList = (state, path, accounts, next) => {
  84. return state.setIn(path, ImmutableMap({
  85. next,
  86. items: ImmutableList(accounts.map(item => item.id)),
  87. isLoading: false,
  88. }));
  89. };
  90. const appendToList = (state, path, accounts, next) => {
  91. return state.updateIn(path, map => {
  92. return map.set('next', next).set('isLoading', false).update('items', list => list.concat(accounts.map(item => item.id)));
  93. });
  94. };
  95. const normalizeFollowRequest = (state, notification) => {
  96. return state.updateIn(['follow_requests', 'items'], list => {
  97. return list.filterNot(item => item === notification.account.id).unshift(notification.account.id);
  98. });
  99. };
  100. const normalizeFeaturedTag = (featuredTags, accountId) => {
  101. const normalizeFeaturedTag = { ...featuredTags, accountId: accountId };
  102. return fromJS(normalizeFeaturedTag);
  103. };
  104. const normalizeFeaturedTags = (state, path, featuredTags, accountId) => {
  105. return state.setIn(path, ImmutableMap({
  106. items: ImmutableList(featuredTags.map(featuredTag => normalizeFeaturedTag(featuredTag, accountId)).sort((a, b) => b.get('statuses_count') - a.get('statuses_count'))),
  107. isLoading: false,
  108. }));
  109. };
  110. export default function userLists(state = initialState, action) {
  111. switch(action.type) {
  112. case FOLLOWERS_FETCH_SUCCESS:
  113. return normalizeList(state, ['followers', action.id], action.accounts, action.next);
  114. case FOLLOWERS_EXPAND_SUCCESS:
  115. return appendToList(state, ['followers', action.id], action.accounts, action.next);
  116. case FOLLOWERS_FETCH_REQUEST:
  117. case FOLLOWERS_EXPAND_REQUEST:
  118. return state.setIn(['followers', action.id, 'isLoading'], true);
  119. case FOLLOWERS_FETCH_FAIL:
  120. case FOLLOWERS_EXPAND_FAIL:
  121. return state.setIn(['followers', action.id, 'isLoading'], false);
  122. case FOLLOWING_FETCH_SUCCESS:
  123. return normalizeList(state, ['following', action.id], action.accounts, action.next);
  124. case FOLLOWING_EXPAND_SUCCESS:
  125. return appendToList(state, ['following', action.id], action.accounts, action.next);
  126. case FOLLOWING_FETCH_REQUEST:
  127. case FOLLOWING_EXPAND_REQUEST:
  128. return state.setIn(['following', action.id, 'isLoading'], true);
  129. case FOLLOWING_FETCH_FAIL:
  130. case FOLLOWING_EXPAND_FAIL:
  131. return state.setIn(['following', action.id, 'isLoading'], false);
  132. case REBLOGS_FETCH_SUCCESS:
  133. return normalizeList(state, ['reblogged_by', action.id], action.accounts, action.next);
  134. case REBLOGS_EXPAND_SUCCESS:
  135. return appendToList(state, ['reblogged_by', action.id], action.accounts, action.next);
  136. case REBLOGS_FETCH_REQUEST:
  137. case REBLOGS_EXPAND_REQUEST:
  138. return state.setIn(['reblogged_by', action.id, 'isLoading'], true);
  139. case REBLOGS_FETCH_FAIL:
  140. case REBLOGS_EXPAND_FAIL:
  141. return state.setIn(['reblogged_by', action.id, 'isLoading'], false);
  142. case FAVOURITES_FETCH_SUCCESS:
  143. return normalizeList(state, ['favourited_by', action.id], action.accounts, action.next);
  144. case FAVOURITES_EXPAND_SUCCESS:
  145. return appendToList(state, ['favourited_by', action.id], action.accounts, action.next);
  146. case FAVOURITES_FETCH_REQUEST:
  147. case FAVOURITES_EXPAND_REQUEST:
  148. return state.setIn(['favourited_by', action.id, 'isLoading'], true);
  149. case FAVOURITES_FETCH_FAIL:
  150. case FAVOURITES_EXPAND_FAIL:
  151. return state.setIn(['favourited_by', action.id, 'isLoading'], false);
  152. case notificationsUpdate.type:
  153. return action.payload.notification.type === 'follow_request' ? normalizeFollowRequest(state, action.payload.notification) : state;
  154. case FOLLOW_REQUESTS_FETCH_SUCCESS:
  155. return normalizeList(state, ['follow_requests'], action.accounts, action.next);
  156. case FOLLOW_REQUESTS_EXPAND_SUCCESS:
  157. return appendToList(state, ['follow_requests'], action.accounts, action.next);
  158. case FOLLOW_REQUESTS_FETCH_REQUEST:
  159. case FOLLOW_REQUESTS_EXPAND_REQUEST:
  160. return state.setIn(['follow_requests', 'isLoading'], true);
  161. case FOLLOW_REQUESTS_FETCH_FAIL:
  162. case FOLLOW_REQUESTS_EXPAND_FAIL:
  163. return state.setIn(['follow_requests', 'isLoading'], false);
  164. case authorizeFollowRequestSuccess.type:
  165. case rejectFollowRequestSuccess.type:
  166. return state.updateIn(['follow_requests', 'items'], list => list.filterNot(item => item === action.payload.id));
  167. case BLOCKS_FETCH_SUCCESS:
  168. return normalizeList(state, ['blocks'], action.accounts, action.next);
  169. case BLOCKS_EXPAND_SUCCESS:
  170. return appendToList(state, ['blocks'], action.accounts, action.next);
  171. case BLOCKS_FETCH_REQUEST:
  172. case BLOCKS_EXPAND_REQUEST:
  173. return state.setIn(['blocks', 'isLoading'], true);
  174. case BLOCKS_FETCH_FAIL:
  175. case BLOCKS_EXPAND_FAIL:
  176. return state.setIn(['blocks', 'isLoading'], false);
  177. case MUTES_FETCH_SUCCESS:
  178. return normalizeList(state, ['mutes'], action.accounts, action.next);
  179. case MUTES_EXPAND_SUCCESS:
  180. return appendToList(state, ['mutes'], action.accounts, action.next);
  181. case MUTES_FETCH_REQUEST:
  182. case MUTES_EXPAND_REQUEST:
  183. return state.setIn(['mutes', 'isLoading'], true);
  184. case MUTES_FETCH_FAIL:
  185. case MUTES_EXPAND_FAIL:
  186. return state.setIn(['mutes', 'isLoading'], false);
  187. case DIRECTORY_FETCH_SUCCESS:
  188. return normalizeList(state, ['directory'], action.accounts, action.next);
  189. case DIRECTORY_EXPAND_SUCCESS:
  190. return appendToList(state, ['directory'], action.accounts, action.next);
  191. case DIRECTORY_FETCH_REQUEST:
  192. case DIRECTORY_EXPAND_REQUEST:
  193. return state.setIn(['directory', 'isLoading'], true);
  194. case DIRECTORY_FETCH_FAIL:
  195. case DIRECTORY_EXPAND_FAIL:
  196. return state.setIn(['directory', 'isLoading'], false);
  197. case FEATURED_TAGS_FETCH_SUCCESS:
  198. return normalizeFeaturedTags(state, ['featured_tags', action.id], action.tags, action.id);
  199. case FEATURED_TAGS_FETCH_REQUEST:
  200. return state.setIn(['featured_tags', action.id, 'isLoading'], true);
  201. case FEATURED_TAGS_FETCH_FAIL:
  202. return state.setIn(['featured_tags', action.id, 'isLoading'], false);
  203. default:
  204. return state;
  205. }
  206. }