reducer.ts 1.7 KB

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