From 17b74287796e6feb75466033e279dc3bcf57f1e6 Mon Sep 17 00:00:00 2001 From: Pujit Mehrotra Date: Wed, 25 Jun 2025 14:51:01 -0400 Subject: [PATCH] fix: incorrect state merging in redux store (#1437) omit stale config entries while merging in new config state ## Summary by CodeRabbit - **Refactor** - Improved state update handling across several modules to enhance performance and maintain consistency without impacting user experience. --- - To see the specific tasks where the Asana app for GitHub is being used, see below: - https://app.asana.com/0/0/1210628784568830 --- api/src/store/modules/dynamix.ts | 10 ++++++---- api/src/store/modules/emhttp.ts | 11 ++++------- api/src/store/modules/registration.ts | 7 +++---- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/api/src/store/modules/dynamix.ts b/api/src/store/modules/dynamix.ts index e78070577..4d1a5bc67 100644 --- a/api/src/store/modules/dynamix.ts +++ b/api/src/store/modules/dynamix.ts @@ -1,6 +1,5 @@ import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; -import { merge } from 'lodash-es'; import { type DynamixConfig } from '@app/core/types/ini.js'; import { loadDynamixConfigFile } from '@app/store/actions/load-dynamix-config-file.js'; @@ -20,7 +19,7 @@ export const dynamix = createSlice({ initialState, reducers: { updateDynamixConfig(state, action: PayloadAction>) { - return merge(state, action.payload); + return Object.assign(state, action.payload); }, }, extraReducers(builder) { @@ -29,11 +28,14 @@ export const dynamix = createSlice({ }); builder.addCase(loadDynamixConfigFile.fulfilled, (state, action) => { - merge(state, action.payload, { status: FileLoadStatus.LOADED }); + return { + ...(action.payload as DynamixConfig), + status: FileLoadStatus.LOADED, + }; }); builder.addCase(loadDynamixConfigFile.rejected, (state, action) => { - merge(state, action.payload, { + Object.assign(state, action.payload, { status: FileLoadStatus.FAILED_LOADING, }); }); diff --git a/api/src/store/modules/emhttp.ts b/api/src/store/modules/emhttp.ts index 6b50e75f9..4b2905d6e 100644 --- a/api/src/store/modules/emhttp.ts +++ b/api/src/store/modules/emhttp.ts @@ -2,7 +2,6 @@ import { join } from 'path'; import type { PayloadAction } from '@reduxjs/toolkit'; import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; -import { merge } from 'lodash-es'; import type { RootState } from '@app/store/index.js'; import type { StateFileToIniParserMap } from '@app/store/types.js'; @@ -176,7 +175,7 @@ export const emhttp = createSlice({ }> ) { const { field } = action.payload; - return merge(state, { [field]: action.payload.state }); + return Object.assign(state, { [field]: action.payload.state }); }, }, extraReducers(builder) { @@ -185,18 +184,16 @@ export const emhttp = createSlice({ }); builder.addCase(loadStateFiles.fulfilled, (state, action) => { - merge(state, action.payload, { status: FileLoadStatus.LOADED }); + Object.assign(state, action.payload, { status: FileLoadStatus.LOADED }); }); builder.addCase(loadStateFiles.rejected, (state, action) => { - merge(state, action.payload, { status: FileLoadStatus.FAILED_LOADING }); + Object.assign(state, action.payload, { status: FileLoadStatus.FAILED_LOADING }); }); builder.addCase(loadSingleStateFile.fulfilled, (state, action) => { if (action.payload) { - // const changedKey = Object.keys(action.payload)[0] - // emhttpLogger.debug('Key', changedKey, 'Difference in changes', getDiff(action.payload, { [changedKey]: state[changedKey] } )) - merge(state, action.payload); + Object.assign(state, action.payload); } else { emhttpLogger.warn('Invalid payload returned from loadSingleStateFile()'); } diff --git a/api/src/store/modules/registration.ts b/api/src/store/modules/registration.ts index 85f4e3612..6cb014815 100644 --- a/api/src/store/modules/registration.ts +++ b/api/src/store/modules/registration.ts @@ -2,7 +2,6 @@ import { format } from 'util'; import type { PayloadAction } from '@reduxjs/toolkit'; import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; -import { merge } from 'lodash-es'; import type { RootState } from '@app/store/index.js'; import { logger } from '@app/core/log.js'; @@ -48,7 +47,7 @@ export const registration = createSlice({ initialState, reducers: { updateRegistrationState(state, action: PayloadAction>) { - return merge(state, action.payload); + return Object.assign(state, action.payload); }, }, extraReducers(builder) { @@ -57,11 +56,11 @@ export const registration = createSlice({ }); builder.addCase(loadRegistrationKey.fulfilled, (state, action) => { - merge(state, action.payload, { status: FileLoadStatus.LOADED }); + Object.assign(state, action.payload, { status: FileLoadStatus.LOADED }); }); builder.addCase(loadRegistrationKey.rejected, (state, action) => { - merge(state, action.payload, { status: FileLoadStatus.FAILED_LOADING }); + Object.assign(state, action.payload, { status: FileLoadStatus.FAILED_LOADING }); }); }, });