12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import { v4 } from 'uuid';
- import { Topic } from 'generated-sources';
- import { Action, TopicsState } from 'redux/interfaces';
- import ActionType from 'redux/actionType';
- export const initialState: TopicsState = {
- byName: {},
- allNames: [],
- messages: [],
- };
- const updateTopicList = (state: TopicsState, payload: Topic[]): TopicsState => {
- const initialMemo: TopicsState = {
- ...state,
- allNames: [],
- };
- return payload.reduce(
- (memo: TopicsState, topic) => ({
- ...memo,
- byName: {
- ...memo.byName,
- [topic.name]: {
- ...memo.byName[topic.name],
- ...topic,
- id: v4(),
- },
- },
- allNames: [...memo.allNames, topic.name],
- }),
- initialMemo
- );
- };
- const addToTopicList = (state: TopicsState, payload: Topic): TopicsState => {
- const newState: TopicsState = {
- ...state,
- };
- newState.allNames.push(payload.name);
- newState.byName[payload.name] = { ...payload, id: v4() };
- return newState;
- };
- const reducer = (state = initialState, action: Action): TopicsState => {
- switch (action.type) {
- case ActionType.GET_TOPICS__SUCCESS:
- return updateTopicList(state, action.payload);
- case ActionType.GET_TOPIC_DETAILS__SUCCESS:
- return {
- ...state,
- byName: {
- ...state.byName,
- [action.payload.topicName]: {
- ...state.byName[action.payload.topicName],
- ...action.payload.details,
- },
- },
- };
- case ActionType.GET_TOPIC_MESSAGES__SUCCESS:
- return {
- ...state,
- messages: action.payload,
- };
- case ActionType.GET_TOPIC_CONFIG__SUCCESS:
- return {
- ...state,
- byName: {
- ...state.byName,
- [action.payload.topicName]: {
- ...state.byName[action.payload.topicName],
- config: action.payload.config.map((inputConfig) => ({
- ...inputConfig,
- id: v4(),
- })),
- },
- },
- };
- case ActionType.POST_TOPIC__SUCCESS:
- return addToTopicList(state, action.payload);
- default:
- return state;
- }
- };
- export default reducer;
|