status_lists.js 5.0 KB

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