@@ -13,17 +13,18 @@ import {
13
13
Tooltip ,
14
14
useDarkMode ,
15
15
} from '@mongodb-js/compass-components' ;
16
- import React , { useState , useCallback , useEffect } from 'react' ;
16
+ import React , { useState , useCallback } from 'react' ;
17
17
import {
18
- errorCleared ,
19
18
errorEncountered ,
19
+ fetchCoveredQueries ,
20
20
type Field ,
21
21
} from '../../modules/create-index' ;
22
22
import MDBCodeViewer from './mdb-code-viewer' ;
23
23
import { areAllFieldsFilledIn } from '../../utils/create-index-modal-validation' ;
24
24
import { connect } from 'react-redux' ;
25
25
import type { TrackFunction } from '@mongodb-js/compass-telemetry/provider' ;
26
26
import { useTelemetry } from '@mongodb-js/compass-telemetry/provider' ;
27
+ import type { RootState } from '../../modules' ;
27
28
28
29
const flexContainerStyles = css ( {
29
30
display : 'flex' ,
@@ -106,13 +107,18 @@ export type IndexFlowSectionProps = {
106
107
dbName : string ;
107
108
collectionName : string ;
108
109
onErrorEncountered : ( error : string ) => void ;
109
- onErrorCleared : ( ) => void ;
110
+ onCoveredQueriesFetched : ( ) => void ;
111
+ coveredQueriesArr : Array < Record < string , number > > | null ;
112
+ hasIndexFieldChanges : boolean ;
110
113
} ;
111
114
112
- const generateCoveredQueries = (
113
- coveredQueriesArr : Array < Record < string , number > > ,
115
+ export const generateCoveredQueries = (
116
+ coveredQueriesArr : Array < Record < string , number > > | null ,
114
117
track : TrackFunction
115
118
) => {
119
+ if ( ! coveredQueriesArr ) {
120
+ return ;
121
+ }
116
122
const rows = [ ] ;
117
123
for ( let i = 0 ; i < coveredQueriesArr . length ; i ++ ) {
118
124
const currentRow = Object . assign ( { } , ...coveredQueriesArr . slice ( 0 , i + 1 ) ) ;
@@ -135,9 +141,12 @@ const generateCoveredQueries = (
135
141
return < > { rows } </ > ;
136
142
} ;
137
143
138
- const generateOptimalQueries = (
139
- coveredQueriesArr : Array < Record < string , number > >
144
+ export const generateOptimalQueries = (
145
+ coveredQueriesArr : Array < Record < string , number > > | null
140
146
) => {
147
+ if ( ! coveredQueriesArr ) {
148
+ return ;
149
+ }
141
150
const numOfFields = coveredQueriesArr . length ;
142
151
143
152
// Do not show for 1 field or less
@@ -187,18 +196,25 @@ const generateOptimalQueries = (
187
196
) ;
188
197
} ;
189
198
199
+ export const generateCoveredQueriesArr = ( fields : Field [ ] ) => {
200
+ return fields . map ( ( field , index ) => {
201
+ return { [ field . name ] : index + 1 } ;
202
+ } ) ;
203
+ } ;
204
+
190
205
const IndexFlowSection = ( {
191
206
createIndexFieldsComponent,
192
207
fields,
193
208
dbName,
194
209
collectionName,
195
210
onErrorEncountered,
196
- onErrorCleared,
211
+ onCoveredQueriesFetched,
212
+ coveredQueriesArr,
213
+ hasIndexFieldChanges,
197
214
} : IndexFlowSectionProps ) => {
198
215
const darkMode = useDarkMode ( ) ;
199
216
const [ isCodeEquivalentToggleChecked , setIsCodeEquivalentToggleChecked ] =
200
217
useState ( false ) ;
201
- const [ hasFieldChanges , setHasFieldChanges ] = useState ( false ) ;
202
218
203
219
const hasUnsupportedQueryTypes = fields . some ( ( field ) => {
204
220
return field . type === '2dsphere' || field . type === 'text' ;
@@ -208,7 +224,7 @@ const IndexFlowSection = ({
208
224
const isCoveredQueriesButtonDisabled =
209
225
! areAllFieldsFilledIn ( fields ) ||
210
226
hasUnsupportedQueryTypes ||
211
- ! hasFieldChanges ;
227
+ ! hasIndexFieldChanges ;
212
228
213
229
const indexNameTypeMap = fields . reduce < Record < string , string > > (
214
230
( accumulator , currentValue ) => {
@@ -220,45 +236,21 @@ const IndexFlowSection = ({
220
236
{ }
221
237
) ;
222
238
223
- const [ coveredQueriesObj , setCoveredQueriesObj ] = useState < {
224
- coveredQueries : JSX . Element ;
225
- optimalQueries : string | JSX . Element ;
226
- showCoveredQueries : boolean ;
227
- } > ( {
228
- coveredQueries : < > </ > ,
229
- optimalQueries : '' ,
230
- showCoveredQueries : false ,
231
- } ) ;
232
-
233
239
const onCoveredQueriesButtonClick = useCallback ( ( ) => {
234
- const coveredQueriesArr = fields . map ( ( field , index ) => {
235
- return { [ field . name ] : index + 1 } ;
236
- } ) ;
237
-
238
240
track ( 'Covered Queries Button Clicked' , {
239
241
context : 'Create Index Modal' ,
240
242
} ) ;
241
243
242
244
try {
243
- setCoveredQueriesObj ( {
244
- coveredQueries : generateCoveredQueries ( coveredQueriesArr , track ) ,
245
- optimalQueries : generateOptimalQueries ( coveredQueriesArr ) ,
246
- showCoveredQueries : true ,
247
- } ) ;
245
+ onCoveredQueriesFetched ( ) ;
248
246
} catch ( e ) {
249
247
onErrorEncountered ( e instanceof Error ? e . message : String ( e ) ) ;
250
248
}
249
+ } , [ onCoveredQueriesFetched , onErrorEncountered , track ] ) ;
251
250
252
- setHasFieldChanges ( false ) ;
253
- } , [ fields , onErrorEncountered , track ] ) ;
254
-
255
- useEffect ( ( ) => {
256
- setHasFieldChanges ( true ) ;
257
- onErrorCleared ( ) ;
258
- } , [ fields , onErrorCleared ] ) ;
259
-
260
- const { coveredQueries, optimalQueries, showCoveredQueries } =
261
- coveredQueriesObj ;
251
+ const coveredQueries = generateCoveredQueries ( coveredQueriesArr , track ) ;
252
+ const optimalQueries = generateOptimalQueries ( coveredQueriesArr ) ;
253
+ const showCoveredQueries = coveredQueriesArr !== null ;
262
254
263
255
return (
264
256
< div >
@@ -422,13 +414,17 @@ const IndexFlowSection = ({
422
414
) ;
423
415
} ;
424
416
425
- const mapState = ( ) => {
426
- return { } ;
417
+ const mapState = ( { createIndex } : RootState ) => {
418
+ const { coveredQueriesArr, hasIndexFieldChanges } = createIndex ;
419
+ return {
420
+ coveredQueriesArr,
421
+ hasIndexFieldChanges,
422
+ } ;
427
423
} ;
428
424
429
425
const mapDispatch = {
430
426
onErrorEncountered : errorEncountered ,
431
- onErrorCleared : errorCleared ,
427
+ onCoveredQueriesFetched : fetchCoveredQueries ,
432
428
} ;
433
429
434
430
export default connect ( mapState , mapDispatch ) ( IndexFlowSection ) ;
0 commit comments