reducer.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Action, TopicsState, Topic } from 'redux/interfaces';
  2. import { ActionType } from 'redux/actionType';
  3. export const initialState: TopicsState = {
  4. byName: {},
  5. allNames: [],
  6. messages: [],
  7. };
  8. const updateTopicList = (state: TopicsState, payload: Topic[]): TopicsState => {
  9. const initialMemo: TopicsState = {
  10. ...state,
  11. allNames: [],
  12. };
  13. return payload.reduce((memo: TopicsState, topic) => {
  14. const { name } = topic;
  15. memo.byName[name] = {
  16. ...memo.byName[name],
  17. ...topic,
  18. };
  19. memo.allNames.push(name);
  20. return memo;
  21. }, initialMemo);
  22. };
  23. const addToTopicList = (state: TopicsState, payload: Topic): TopicsState => {
  24. const newState: TopicsState = {
  25. ...state,
  26. };
  27. newState.allNames.push(payload.name);
  28. newState.byName[payload.name] = payload;
  29. return newState;
  30. };
  31. const reducer = (state = initialState, action: Action): TopicsState => {
  32. switch (action.type) {
  33. case ActionType.GET_TOPICS__SUCCESS:
  34. return updateTopicList(state, action.payload);
  35. case ActionType.GET_TOPIC_DETAILS__SUCCESS:
  36. return {
  37. ...state,
  38. byName: {
  39. ...state.byName,
  40. [action.payload.topicName]: {
  41. ...state.byName[action.payload.topicName],
  42. ...action.payload.details,
  43. },
  44. },
  45. };
  46. case ActionType.GET_TOPIC_MESSAGES__SUCCESS:
  47. return {
  48. ...state,
  49. messages: action.payload,
  50. };
  51. case ActionType.GET_TOPIC_CONFIG__SUCCESS:
  52. return {
  53. ...state,
  54. byName: {
  55. ...state.byName,
  56. [action.payload.topicName]: {
  57. ...state.byName[action.payload.topicName],
  58. config: action.payload.config,
  59. },
  60. },
  61. };
  62. case ActionType.POST_TOPIC__SUCCESS:
  63. return addToTopicList(state, action.payload);
  64. default:
  65. return state;
  66. }
  67. };
  68. export default reducer;