user_lists.js 6.9 KB

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