search.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
  2. import {
  3. COMPOSE_MENTION,
  4. COMPOSE_REPLY,
  5. COMPOSE_DIRECT,
  6. } from '../actions/compose';
  7. import {
  8. SEARCH_CHANGE,
  9. SEARCH_CLEAR,
  10. SEARCH_FETCH_REQUEST,
  11. SEARCH_FETCH_FAIL,
  12. SEARCH_FETCH_SUCCESS,
  13. SEARCH_SHOW,
  14. SEARCH_EXPAND_REQUEST,
  15. SEARCH_EXPAND_SUCCESS,
  16. SEARCH_EXPAND_FAIL,
  17. SEARCH_HISTORY_UPDATE,
  18. } from '../actions/search';
  19. const initialState = ImmutableMap({
  20. value: '',
  21. submitted: false,
  22. hidden: false,
  23. results: ImmutableMap(),
  24. isLoading: false,
  25. searchTerm: '',
  26. type: null,
  27. recent: ImmutableOrderedSet(),
  28. });
  29. export default function search(state = initialState, action) {
  30. switch(action.type) {
  31. case SEARCH_CHANGE:
  32. return state.set('value', action.value);
  33. case SEARCH_CLEAR:
  34. return state.withMutations(map => {
  35. map.set('value', '');
  36. map.set('results', ImmutableMap());
  37. map.set('submitted', false);
  38. map.set('hidden', false);
  39. map.set('searchTerm', '');
  40. map.set('type', null);
  41. });
  42. case SEARCH_SHOW:
  43. return state.set('hidden', false);
  44. case COMPOSE_REPLY:
  45. case COMPOSE_MENTION:
  46. case COMPOSE_DIRECT:
  47. return state.set('hidden', true);
  48. case SEARCH_FETCH_REQUEST:
  49. return state.withMutations(map => {
  50. map.set('isLoading', true);
  51. map.set('submitted', true);
  52. map.set('type', action.searchType);
  53. });
  54. case SEARCH_FETCH_FAIL:
  55. case SEARCH_EXPAND_FAIL:
  56. return state.set('isLoading', false);
  57. case SEARCH_FETCH_SUCCESS:
  58. return state.withMutations(map => {
  59. map.set('results', ImmutableMap({
  60. accounts: ImmutableOrderedSet(action.results.accounts.map(item => item.id)),
  61. statuses: ImmutableOrderedSet(action.results.statuses.map(item => item.id)),
  62. hashtags: ImmutableOrderedSet(fromJS(action.results.hashtags)),
  63. }));
  64. map.set('searchTerm', action.searchTerm);
  65. map.set('type', action.searchType);
  66. map.set('isLoading', false);
  67. });
  68. case SEARCH_EXPAND_REQUEST:
  69. return state.set('type', action.searchType).set('isLoading', true);
  70. case SEARCH_EXPAND_SUCCESS:
  71. const results = action.searchType === 'hashtags' ? ImmutableOrderedSet(fromJS(action.results.hashtags)) : action.results[action.searchType].map(item => item.id);
  72. return state.updateIn(['results', action.searchType], list => list.union(results)).set('isLoading', false);
  73. case SEARCH_HISTORY_UPDATE:
  74. return state.set('recent', ImmutableOrderedSet(fromJS(action.recent)));
  75. default:
  76. return state;
  77. }
  78. }