reducer.ts 2.1 KB

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