1
1
import React , { useEffect , useState } from 'react'
2
2
import cx from 'classnames'
3
- import { isString , isUndefined } from 'lodash'
3
+ import { isUndefined , escapeRegExp } from 'lodash'
4
4
5
5
import { KeyInfo , Nullable , RedisString } from 'uiSrc/interfaces'
6
6
import { AllKeyTypes , VscodeMessageAction } from 'uiSrc/constants'
@@ -26,12 +26,14 @@ export interface Props {
26
26
}
27
27
28
28
export const KeysTree = ( { database } : Props ) => {
29
- const delimiter = useAppInfoStore ( ( state ) => state . delimiter )
29
+ const delimiters = useAppInfoStore ( ( state ) => state . delimiters )
30
30
const openNodes = useContextInContext ( ( state ) => state . keys . tree . openNodes )
31
31
const sorting = useContextInContext ( ( state ) => state . dbConfig . treeViewSort )
32
32
33
- const selectedKeyName = useSelectedKeyStore ( ( state ) => state . data ?. nameString ) || ''
34
- const selectedKey = useSelectedKeyStore ( ( state ) => state . data ?. name ) || null
33
+ const { selectedKeyName, selectedKey } = useSelectedKeyStore ( ( state ) => ( {
34
+ selectedKeyName : state . data ?. nameString || '' ,
35
+ selectedKey : state . data ?. name || null ,
36
+ } ) )
35
37
36
38
const keysState = useKeysInContext ( ( state ) => state . data )
37
39
const loading = useKeysInContext ( ( state ) => state . loading )
@@ -45,6 +47,11 @@ export const KeysTree = ({ database }: Props) => {
45
47
const [ firstDataLoaded , setFirstDataLoaded ] = useState < boolean > ( ! ! keysState . keys ?. length )
46
48
const [ items , setItems ] = useState < KeyInfo [ ] > ( parseKeyNames ( keysState . keys ?? [ ] ) )
47
49
50
+ // escape regexp symbols and join and transform to regexp
51
+ const delimiterPattern = delimiters
52
+ . map ( escapeRegExp )
53
+ . join ( '|' )
54
+
48
55
useEffect ( ( ) => {
49
56
if ( ! firstDataLoaded ) {
50
57
keysApi . fetchPatternKeysAction ( )
@@ -58,9 +65,9 @@ export const KeysTree = ({ database }: Props) => {
58
65
59
66
// open all parents for selected key
60
67
const openSelectedKey = ( selectedKeyName : Nullable < string > = '' ) => {
61
- if ( selectedKeyName && isString ( selectedKeyName ) ) {
62
- const parts = selectedKeyName ?. split ( delimiter )
63
- const parents = parts . map ( ( _ , index ) => parts . slice ( 0 , index + 1 ) . join ( delimiter ) + delimiter )
68
+ if ( selectedKeyName ) {
69
+ const parts = selectedKeyName ?. split ( delimiterPattern )
70
+ const parents = parts . map ( ( _ , index ) => parts . slice ( 0 , index + 1 ) . join ( delimiterPattern ) + delimiterPattern )
64
71
65
72
// remove key name from parents
66
73
parents . pop ( )
@@ -80,7 +87,7 @@ export const KeysTree = ({ database }: Props) => {
80
87
useEffect ( ( ) => {
81
88
setFirstDataLoaded ( true )
82
89
setItems ( parseKeyNames ( keysState . keys ) )
83
- } , [ sorting , delimiter , keysState . lastRefreshTime ] )
90
+ } , [ sorting , delimiterPattern , keysState . lastRefreshTime ] )
84
91
85
92
useEffect ( ( ) => {
86
93
openSelectedKey ( selectedKeyName )
@@ -167,7 +174,8 @@ export const KeysTree = ({ database }: Props) => {
167
174
>
168
175
< VirtualTree
169
176
items = { items }
170
- delimiter = { delimiter }
177
+ delimiters = { delimiters }
178
+ delimiterPattern = { delimiterPattern }
171
179
sorting = { sorting }
172
180
database = { database }
173
181
statusSelected = { selectedKeyName }
0 commit comments