reducer.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { TopicMessage } from 'generated-sources';
  2. import { Action, TopicsState } from 'redux/interfaces';
  3. import { getType } from 'typesafe-actions';
  4. import * as actions from 'redux/actions';
  5. export const initialState: TopicsState = {
  6. byName: {},
  7. allNames: [],
  8. totalPages: 1,
  9. messages: [],
  10. search: '',
  11. orderBy: null,
  12. consumerGroups: [],
  13. };
  14. const transformTopicMessages = (
  15. state: TopicsState,
  16. messages: TopicMessage[]
  17. ): TopicsState => ({
  18. ...state,
  19. messages: messages.map((mes) => {
  20. const { content } = mes;
  21. let parsedContent = content;
  22. if (content) {
  23. try {
  24. parsedContent =
  25. typeof content !== 'object' ? JSON.parse(content) : content;
  26. } catch (_) {
  27. // do nothing
  28. }
  29. }
  30. return {
  31. ...mes,
  32. content: parsedContent,
  33. };
  34. }),
  35. });
  36. const reducer = (state = initialState, action: Action): TopicsState => {
  37. switch (action.type) {
  38. case getType(actions.fetchTopicsListAction.success):
  39. case getType(actions.fetchTopicDetailsAction.success):
  40. case getType(actions.fetchTopicConfigAction.success):
  41. case getType(actions.createTopicAction.success):
  42. case getType(actions.fetchTopicConsumerGroupsAction.success):
  43. case getType(actions.updateTopicAction.success):
  44. return action.payload;
  45. case getType(actions.fetchTopicMessagesAction.success):
  46. return transformTopicMessages(state, action.payload);
  47. case getType(actions.deleteTopicAction.success): {
  48. const newState: TopicsState = { ...state };
  49. delete newState.byName[action.payload];
  50. newState.allNames = newState.allNames.filter(
  51. (name) => name !== action.payload
  52. );
  53. return newState;
  54. }
  55. case getType(actions.clearMessagesTopicAction.success): {
  56. return {
  57. ...state,
  58. messages: [],
  59. };
  60. }
  61. case getType(actions.setTopicsSearchAction): {
  62. return {
  63. ...state,
  64. search: action.payload,
  65. };
  66. }
  67. case getType(actions.setTopicsOrderByAction): {
  68. return {
  69. ...state,
  70. orderBy: action.payload,
  71. };
  72. }
  73. default:
  74. return state;
  75. }
  76. };
  77. export default reducer;