reducer.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. };
  11. const transformTopicMessages = (
  12. state: TopicsState,
  13. messages: TopicMessage[]
  14. ): TopicsState => ({
  15. ...state,
  16. messages: messages.map((mes) => {
  17. const { content } = mes;
  18. let parsedContent = content;
  19. if (content) {
  20. try {
  21. parsedContent =
  22. typeof content !== 'object' ? JSON.parse(content) : content;
  23. } catch (_) {
  24. // do nothing
  25. }
  26. }
  27. return {
  28. ...mes,
  29. content: parsedContent,
  30. };
  31. }),
  32. });
  33. const reducer = (state = initialState, action: Action): TopicsState => {
  34. switch (action.type) {
  35. case getType(actions.fetchTopicsListAction.success):
  36. case getType(actions.fetchTopicDetailsAction.success):
  37. case getType(actions.fetchTopicConfigAction.success):
  38. case getType(actions.createTopicAction.success):
  39. case getType(actions.updateTopicAction.success):
  40. return action.payload;
  41. case getType(actions.fetchTopicMessagesAction.success):
  42. return transformTopicMessages(state, action.payload);
  43. case getType(actions.deleteTopicAction.success): {
  44. const newState: TopicsState = { ...state };
  45. delete newState.byName[action.payload];
  46. newState.allNames = newState.allNames.filter(
  47. (name) => name !== action.payload
  48. );
  49. return newState;
  50. }
  51. default:
  52. return state;
  53. }
  54. };
  55. export default reducer;