status_lists.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable';
  2. import {
  3. blockAccountSuccess,
  4. muteAccountSuccess,
  5. } from '../actions/accounts';
  6. import {
  7. BOOKMARKED_STATUSES_FETCH_REQUEST,
  8. BOOKMARKED_STATUSES_FETCH_SUCCESS,
  9. BOOKMARKED_STATUSES_FETCH_FAIL,
  10. BOOKMARKED_STATUSES_EXPAND_REQUEST,
  11. BOOKMARKED_STATUSES_EXPAND_SUCCESS,
  12. BOOKMARKED_STATUSES_EXPAND_FAIL,
  13. } from '../actions/bookmarks';
  14. import {
  15. FAVOURITED_STATUSES_FETCH_REQUEST,
  16. FAVOURITED_STATUSES_FETCH_SUCCESS,
  17. FAVOURITED_STATUSES_FETCH_FAIL,
  18. FAVOURITED_STATUSES_EXPAND_REQUEST,
  19. FAVOURITED_STATUSES_EXPAND_SUCCESS,
  20. FAVOURITED_STATUSES_EXPAND_FAIL,
  21. } from '../actions/favourites';
  22. import {
  23. FAVOURITE_SUCCESS,
  24. UNFAVOURITE_SUCCESS,
  25. BOOKMARK_SUCCESS,
  26. UNBOOKMARK_SUCCESS,
  27. PIN_SUCCESS,
  28. UNPIN_SUCCESS,
  29. } from '../actions/interactions';
  30. import {
  31. PINNED_STATUSES_FETCH_SUCCESS,
  32. } from '../actions/pin_statuses';
  33. import {
  34. TRENDS_STATUSES_FETCH_REQUEST,
  35. TRENDS_STATUSES_FETCH_SUCCESS,
  36. TRENDS_STATUSES_FETCH_FAIL,
  37. TRENDS_STATUSES_EXPAND_REQUEST,
  38. TRENDS_STATUSES_EXPAND_SUCCESS,
  39. TRENDS_STATUSES_EXPAND_FAIL,
  40. } from '../actions/trends';
  41. const initialState = ImmutableMap({
  42. favourites: ImmutableMap({
  43. next: null,
  44. loaded: false,
  45. items: ImmutableOrderedSet(),
  46. }),
  47. bookmarks: ImmutableMap({
  48. next: null,
  49. loaded: false,
  50. items: ImmutableOrderedSet(),
  51. }),
  52. pins: ImmutableMap({
  53. next: null,
  54. loaded: false,
  55. items: ImmutableOrderedSet(),
  56. }),
  57. trending: ImmutableMap({
  58. next: null,
  59. loaded: false,
  60. items: ImmutableOrderedSet(),
  61. }),
  62. });
  63. const normalizeList = (state, listType, statuses, next) => {
  64. return state.update(listType, listMap => listMap.withMutations(map => {
  65. map.set('next', next);
  66. map.set('loaded', true);
  67. map.set('isLoading', false);
  68. map.set('items', ImmutableOrderedSet(statuses.map(item => item.id)));
  69. }));
  70. };
  71. const appendToList = (state, listType, statuses, next) => {
  72. return state.update(listType, listMap => listMap.withMutations(map => {
  73. map.set('next', next);
  74. map.set('isLoading', false);
  75. map.set('items', map.get('items').union(statuses.map(item => item.id)));
  76. }));
  77. };
  78. const prependOneToList = (state, listType, status) => {
  79. return state.updateIn([listType, 'items'], (list) => {
  80. if (list.includes(status.get('id'))) {
  81. return list;
  82. } else {
  83. return ImmutableOrderedSet([status.get('id')]).union(list);
  84. }
  85. });
  86. };
  87. const removeOneFromList = (state, listType, status) => {
  88. return state.updateIn([listType, 'items'], (list) => list.delete(status.get('id')));
  89. };
  90. export default function statusLists(state = initialState, action) {
  91. switch(action.type) {
  92. case FAVOURITED_STATUSES_FETCH_REQUEST:
  93. case FAVOURITED_STATUSES_EXPAND_REQUEST:
  94. return state.setIn(['favourites', 'isLoading'], true);
  95. case FAVOURITED_STATUSES_FETCH_FAIL:
  96. case FAVOURITED_STATUSES_EXPAND_FAIL:
  97. return state.setIn(['favourites', 'isLoading'], false);
  98. case FAVOURITED_STATUSES_FETCH_SUCCESS:
  99. return normalizeList(state, 'favourites', action.statuses, action.next);
  100. case FAVOURITED_STATUSES_EXPAND_SUCCESS:
  101. return appendToList(state, 'favourites', action.statuses, action.next);
  102. case BOOKMARKED_STATUSES_FETCH_REQUEST:
  103. case BOOKMARKED_STATUSES_EXPAND_REQUEST:
  104. return state.setIn(['bookmarks', 'isLoading'], true);
  105. case BOOKMARKED_STATUSES_FETCH_FAIL:
  106. case BOOKMARKED_STATUSES_EXPAND_FAIL:
  107. return state.setIn(['bookmarks', 'isLoading'], false);
  108. case BOOKMARKED_STATUSES_FETCH_SUCCESS:
  109. return normalizeList(state, 'bookmarks', action.statuses, action.next);
  110. case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
  111. return appendToList(state, 'bookmarks', action.statuses, action.next);
  112. case TRENDS_STATUSES_FETCH_REQUEST:
  113. case TRENDS_STATUSES_EXPAND_REQUEST:
  114. return state.setIn(['trending', 'isLoading'], true);
  115. case TRENDS_STATUSES_FETCH_FAIL:
  116. case TRENDS_STATUSES_EXPAND_FAIL:
  117. return state.setIn(['trending', 'isLoading'], false);
  118. case TRENDS_STATUSES_FETCH_SUCCESS:
  119. return normalizeList(state, 'trending', action.statuses, action.next);
  120. case TRENDS_STATUSES_EXPAND_SUCCESS:
  121. return appendToList(state, 'trending', action.statuses, action.next);
  122. case FAVOURITE_SUCCESS:
  123. return prependOneToList(state, 'favourites', action.status);
  124. case UNFAVOURITE_SUCCESS:
  125. return removeOneFromList(state, 'favourites', action.status);
  126. case BOOKMARK_SUCCESS:
  127. return prependOneToList(state, 'bookmarks', action.status);
  128. case UNBOOKMARK_SUCCESS:
  129. return removeOneFromList(state, 'bookmarks', action.status);
  130. case PINNED_STATUSES_FETCH_SUCCESS:
  131. return normalizeList(state, 'pins', action.statuses, action.next);
  132. case PIN_SUCCESS:
  133. return prependOneToList(state, 'pins', action.status);
  134. case UNPIN_SUCCESS:
  135. return removeOneFromList(state, 'pins', action.status);
  136. case blockAccountSuccess.type:
  137. case muteAccountSuccess.type:
  138. return state.updateIn(['trending', 'items'], ImmutableOrderedSet(), list => list.filterNot(statusId => action.payload.statuses.getIn([statusId, 'account']) === action.payload.relationship.id));
  139. default:
  140. return state;
  141. }
  142. }