Skip to content

Commit 80673c9

Browse files
committed
#RI-3689 - Key list refreshed when refreshing only key details
1 parent 3d958bb commit 80673c9

File tree

4 files changed

+23
-81
lines changed

4 files changed

+23
-81
lines changed

redisinsight/ui/src/pages/browser/components/key-list/KeyList.spec.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React from 'react'
2+
import { cloneDeep } from 'lodash'
23
import { render, waitFor } from 'uiSrc/utils/test-utils'
34
import { KeysStoreData, KeyViewType } from 'uiSrc/slices/interfaces/keys'
45
import { keysSelector, setLastBatchKeys } from 'uiSrc/slices/browser/keys'
@@ -101,7 +102,7 @@ describe('KeyList', () => {
101102
})
102103

103104
it('should call apiService.post to get key info', async () => {
104-
const apiServiceMock = jest.fn().mockResolvedValue([...propsMock.keysState.keys])
105+
const apiServiceMock = jest.fn().mockResolvedValue(cloneDeep(propsMock.keysState.keys))
105106
apiService.post = apiServiceMock
106107

107108
const { rerender } = render(<KeyList {...propsMock} keysState={{ ...propsMock.keysState, keys: [] }} />)
@@ -120,7 +121,7 @@ describe('KeyList', () => {
120121

121122
it('apiService.post should be called with only keys without info', async () => {
122123
const params = { params: { encoding: 'buffer' } }
123-
const apiServiceMock = jest.fn().mockResolvedValue([...propsMock.keysState.keys])
124+
const apiServiceMock = jest.fn().mockResolvedValue(cloneDeep(propsMock.keysState.keys))
124125
apiService.post = apiServiceMock
125126

126127
const { rerender } = render(<KeyList {...propsMock} keysState={{ ...propsMock.keysState, keys: [] }} />)
@@ -130,7 +131,7 @@ describe('KeyList', () => {
130131
keysState={{
131132
...propsMock.keysState,
132133
keys: [
133-
...propsMock.keysState.keys.map(({ name }) => ({ name })),
134+
...cloneDeep(propsMock.keysState.keys).map(({ name }) => ({ name })),
134135
{ name: 'key5', size: 100, length: 100 }, // key with info
135136
] }}
136137
/>)
@@ -162,7 +163,7 @@ describe('KeyList', () => {
162163
keysState={{
163164
...propsMock.keysState,
164165
keys: [
165-
...propsMock.keysState.keys.map(({ name }) => ({ name })),
166+
...cloneDeep(propsMock).keysState.keys.map(({ name }) => ({ name })),
166167
] }}
167168
/>)
168169

redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
formatLongName,
2020
bufferToString,
2121
bufferFormatRangeItems,
22+
isEqualBuffers,
2223
} from 'uiSrc/utils'
2324
import {
2425
NoKeysToDisplayText,
@@ -68,7 +69,7 @@ const KeyList = forwardRef((props: Props, ref) => {
6869

6970
const { instanceId = '' } = useParams<{ instanceId: string }>()
7071

71-
const { data: selectedKey } = useSelector(selectedKeySelector)
72+
const selectedKey = useSelector(selectedKeySelector)
7273
const { total, nextCursor, previousResultCount } = useSelector(keysDataSelector)
7374
const { isSearched, isFiltered, viewType } = useSelector(keysSelector)
7475
const { keyList: { scrollTopPosition } } = useSelector(appContextBrowser)
@@ -108,6 +109,18 @@ const KeyList = forwardRef((props: Props, ref) => {
108109
rerender({})
109110
}, [keysState.keys])
110111

112+
useEffect(() => {
113+
if (!selectedKey || !selectedKey?.data) return
114+
115+
const indexKeyForUpdate = itemsRef.current.findIndex(({ name }) =>
116+
isEqualBuffers(name, selectedKey?.data?.name))
117+
118+
if (indexKeyForUpdate === -1) return
119+
120+
itemsRef.current[indexKeyForUpdate] = selectedKey.data
121+
rerender({})
122+
}, [selectedKey])
123+
111124
const onNoKeysLinkClick = () => {
112125
sendEventTelemetry({
113126
event: getBasedOnViewTypeEvent(
@@ -168,7 +181,7 @@ const KeyList = forwardRef((props: Props, ref) => {
168181

169182
const newItems = bufferFormatRows(startIndex, lastIndex)
170183

171-
getMetadata(startIndex, lastIndex, newItems)
184+
getMetadata(startIndex, newItems)
172185
rerender({})
173186
}
174187

@@ -185,7 +198,6 @@ const KeyList = forwardRef((props: Props, ref) => {
185198

186199
const getMetadata = (
187200
startIndex: number,
188-
lastIndex: number,
189201
itemsInit: GetKeyInfoResponse[] = []
190202
): void => {
191203
const isSomeNotUndefined = ({ type, size, length }: GetKeyInfoResponse) =>
@@ -364,7 +376,7 @@ const KeyList = forwardRef((props: Props, ref) => {
364376
totalItemsCount={keysState.total ? keysState.total : Infinity}
365377
scanned={isSearched || isFiltered ? keysState.scanned : 0}
366378
noItemsMessage={getNoItemsMessage()}
367-
selectedKey={selectedKey}
379+
selectedKey={selectedKey.data}
368380
scrollTopProp={scrollTopPosition}
369381
setScrollTopPosition={setScrollTopPosition}
370382
hideFooter={hideFooter}

redisinsight/ui/src/slices/browser/keys.ts

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import { addErrorNotification, addMessageNotification } from '../app/notificatio
4141
import { KeysStore, KeyViewType } from '../interfaces/keys'
4242
import { AppDispatch, RootState } from '../store'
4343
import { StreamViewType } from '../interfaces/stream'
44-
import { RedisResponseBuffer } from '../interfaces'
44+
import { RedisResponseBuffer, RedisString } from '../interfaces'
4545

4646
const defaultViewFormat = KeyValueFormat.Unicode
4747

@@ -227,19 +227,6 @@ const keysSlice = createSlice({
227227
error: payload,
228228
}
229229
},
230-
editKeyTTLFromList: (state, { payload }) => {
231-
const keys = state.data.keys.map((key) => {
232-
if (isEqualBuffers(key.name, payload?.key)) {
233-
key.ttl = payload?.ttl
234-
}
235-
return key
236-
})
237-
238-
state.data = {
239-
...state.data,
240-
keys,
241-
}
242-
},
243230
editKeyFromList: (state, { payload }) => {
244231
const keys = state.data.keys.map((key) => {
245232
if (isEqualBuffers(key.name, payload?.key)) {
@@ -253,19 +240,6 @@ const keysSlice = createSlice({
253240
keys,
254241
}
255242
},
256-
updateKeySizeFromList: (state, { payload }) => {
257-
const keys = state.data.keys.map((key) => {
258-
if (isEqualBuffers(key.name, payload?.key)) {
259-
key.size = payload?.size
260-
}
261-
return key
262-
})
263-
264-
state.data = {
265-
...state.data,
266-
keys,
267-
}
268-
},
269243

270244
// update length for Selected Key
271245
updateSelectedKeyLength: (state, { payload }) => {
@@ -373,9 +347,7 @@ export const {
373347
deleteKeySuccess,
374348
deleteKeyFailure,
375349
deleteKeyFromList,
376-
editKeyTTLFromList,
377350
editKeyFromList,
378-
updateKeySizeFromList,
379351
updateSelectedKeyLength,
380352
setSearchMatch,
381353
setFilter,
@@ -582,9 +554,6 @@ export function fetchKeyInfo(key: RedisResponseBuffer, resetData?: boolean) {
582554
if (isStatusSuccessful(status)) {
583555
dispatch(loadKeyInfoSuccess(data))
584556
dispatch(updateSelectedKeyRefreshTime(Date.now()))
585-
if (isEqualBuffers(state.browser.keys.selectedKey?.data?.name, key)) {
586-
// dispatch(updateKeySizeFromList({ key, size: data?.size }))
587-
}
588557
}
589558

590559
if (data.type === KeyTypes.Hash) {
@@ -646,9 +615,6 @@ export function refreshKeyInfoAction(key: RedisResponseBuffer) {
646615
if (isStatusSuccessful(status)) {
647616
dispatch(refreshKeyInfoSuccess(data))
648617
dispatch(updateSelectedKeyRefreshTime(Date.now()))
649-
if (isEqualBuffers(state.browser.keys.selectedKey?.data?.name, key)) {
650-
// dispatch(updateKeySizeFromList({ key, size: data?.size }))
651-
}
652618
}
653619
} catch (error) {
654620
dispatch(refreshKeyInfoFail())
@@ -888,7 +854,6 @@ export function editKeyTTL(key: string, ttl: number) {
888854
}
889855
})
890856
if (ttl !== 0) {
891-
dispatch(editKeyTTLFromList({ key, ttl }))
892857
dispatch<any>(fetchKeyInfo(key))
893858
} else {
894859
dispatch(deleteKeySuccess())
@@ -906,7 +871,7 @@ export function editKeyTTL(key: string, ttl: number) {
906871

907872
// Asynchronous thunk action
908873
export function fetchKeysMetadata(
909-
keys: GetKeyInfoResponse[],
874+
keys: RedisString[],
910875
onSuccessAction?: (data: GetKeyInfoResponse[]) => void,
911876
onFailAction?: () => void
912877
) {

redisinsight/ui/src/slices/tests/browser/keys.spec.ts

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import reducer, {
4747
editKey,
4848
defaultSelectedKeyActionFailure,
4949
editKeyTTL,
50-
editKeyTTLFromList,
5150
addHashKey,
5251
addSetKey,
5352
addReJSONKey,
@@ -717,39 +716,6 @@ describe('keys slice', () => {
717716
})
718717
})
719718

720-
describe('editKeyTTLFromList', () => {
721-
it('should properly set the state before the edit TTL', () => {
722-
// Arrange
723-
724-
const data = {
725-
key: 'test',
726-
ttl: 1000,
727-
}
728-
729-
const initialStateMock = {
730-
...initialState,
731-
data: {
732-
keys: [{ name: data.key, ttl: -1 }],
733-
},
734-
}
735-
const state = {
736-
...initialState,
737-
data: {
738-
keys: [{ name: data.key, ttl: data.ttl }],
739-
},
740-
}
741-
742-
// Act
743-
const nextState = reducer(initialStateMock, editKeyTTLFromList(data))
744-
745-
// Assert
746-
const rootState = Object.assign(initialStateDefault, {
747-
browser: { keys: nextState },
748-
})
749-
expect(keysSelector(rootState)).toEqual(state)
750-
})
751-
})
752-
753719
describe('editKeyFromList', () => {
754720
it('should properly set the state before the edit key', () => {
755721
// Arrange
@@ -1288,8 +1254,6 @@ describe('keys slice', () => {
12881254
// Assert
12891255
const expectedActions = [
12901256
defaultSelectedKeyAction(),
1291-
editKeyTTLFromList({ key, ttl }),
1292-
12931257
// fetch keyInfo
12941258
defaultSelectedKeyAction(),
12951259
defaultSelectedKeyActionSuccess(),

0 commit comments

Comments
 (0)