asenka0301/frontend-bootcamp-project-12

View on GitHub
frontend/src/slices/messagesSlice.js

Summary

Maintainability
A
0 mins
Test Coverage
import { createSlice, createEntityAdapter } from '@reduxjs/toolkit';
import { actions as channelsActions } from './channelsSlice';

const messagesAdapter = createEntityAdapter();

const initialState = messagesAdapter.getInitialState();

const messagesSlice = createSlice({
  name: 'channel',
  initialState,
  reducers: {
    addMessages: messagesAdapter.addMany,
    addMessage: messagesAdapter.addOne,
  },
  extraReducers: (builder) => {
    builder.addCase(channelsActions.removeChannel, (state, action) => {
      const removedChannelId = action.payload;
      const entities = Object.values(state.entities);
      const removeChannelMessageIds = entities.filter((el) => el.channelId === removedChannelId)
        .map(({ id }) => id);
      messagesAdapter.removeMany(state, removeChannelMessageIds);
    });
  },
});

export const { actions } = messagesSlice;
export default messagesSlice.reducer;
export const selectors = messagesAdapter.getSelectors((state) => state.messages);