search.js 1.9 KB

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