Files
frontend-app-learning/src/generic/model-store/slice.js
Kshitij Sobti f004d0ab3c feat: Sidebar refactor and add support for discussions sidebar. (#762)
squash!: remove unnecessary styling and migrate to bootstrap and other review feedback
2022-03-07 18:56:05 +05:00

81 lines
2.2 KiB
JavaScript

/* eslint-disable no-param-reassign */
import { createSlice } from '@reduxjs/toolkit';
function add(state, modelType, model, idField) {
idField = idField ?? 'id';
const id = model[idField];
if (state[modelType] === undefined) {
state[modelType] = {};
}
state[modelType][id] = model;
}
function update(state, modelType, model, idField) {
idField = idField ?? 'id';
const id = model[idField];
if (state[modelType] === undefined) {
state[modelType] = {};
}
state[modelType][id] = { ...state[modelType][id], ...model };
}
function remove(state, modelType, id) {
if (state[modelType] === undefined) {
state[modelType] = {};
}
delete state[modelType][id];
}
const slice = createSlice({
name: 'models',
initialState: {},
reducers: {
addModel: (state, { payload }) => {
const { modelType, model, idField } = payload;
add(state, modelType, model, idField);
},
addModels: (state, { payload }) => {
const { modelType, models, idField } = payload;
models.forEach(model => add(state, modelType, model, idField));
},
addModelsMap: (state, { payload }) => {
const { modelType, modelsMap, idField } = payload;
Object.values(modelsMap).forEach(model => add(state, modelType, model, idField));
},
updateModel: (state, { payload }) => {
const { modelType, model, idField } = payload;
update(state, modelType, model, idField);
},
updateModels: (state, { payload }) => {
const { modelType, models, idField } = payload;
models.forEach(model => update(state, modelType, model, idField));
},
updateModelsMap: (state, { payload }) => {
const { modelType, modelsMap, idField } = payload;
Object.values(modelsMap).forEach(model => update(state, modelType, model, idField));
},
removeModel: (state, { payload }) => {
const { modelType, id } = payload;
remove(state, modelType, id);
},
removeModels: (state, { payload }) => {
const { modelType, ids } = payload;
ids.forEach(id => remove(state, modelType, id));
},
},
});
export const {
addModel,
addModels,
addModelsMap,
updateModel,
updateModels,
updateModelsMap,
removeModel,
removeModels,
} = slice.actions;
export const { reducer } = slice;