@@ -13,9 +13,14 @@ import {
1313 Tooltip ,
1414} from '@mongodb-js/compass-components' ;
1515import React , { useState , useCallback , useEffect } from 'react' ;
16- import type { Field } from '../../modules/create-index' ;
16+ import { errorEncountered , type Field } from '../../modules/create-index' ;
1717import MDBCodeViewer from './mdb-code-viewer' ;
1818import { areAllFieldsFilledIn } from '../../utils/create-index-modal-validation' ;
19+ import { connect } from 'react-redux' ;
20+ import {
21+ TrackFunction ,
22+ useTelemetry ,
23+ } from '@mongodb-js/compass-telemetry/provider' ;
1924
2025const flexContainerStyles = css ( {
2126 display : 'flex' ,
@@ -78,10 +83,12 @@ export type IndexFlowSectionProps = {
7883 createIndexFieldsComponent : JSX . Element | null ;
7984 dbName : string ;
8085 collectionName : string ;
86+ onErrorEncountered : ( error : string ) => void ;
8187} ;
8288
8389const generateCoveredQueries = (
84- coveredQueriesArr : Array < Record < string , number > >
90+ coveredQueriesArr : Array < Record < string , number > > ,
91+ track : TrackFunction
8592) => {
8693 const rows = [ ] ;
8794 for ( let i = 0 ; i < coveredQueriesArr . length ; i ++ ) {
@@ -93,6 +100,14 @@ const generateCoveredQueries = (
93100 ) ;
94101 }
95102
103+ if ( rows . length === 0 ) {
104+ track ( 'Error generating covered queries' , {
105+ context : 'Create Index Modal' ,
106+ } ) ;
107+ throw new Error (
108+ 'Error generating covered query examples. Please try again later.'
109+ ) ;
110+ }
96111 return < > { rows } </ > ;
97112} ;
98113
@@ -149,6 +164,7 @@ const IndexFlowSection = ({
149164 fields,
150165 dbName,
151166 collectionName,
167+ onErrorEncountered,
152168} : IndexFlowSectionProps ) => {
153169 const [ isCodeEquivalentToggleChecked , setIsCodeEquivalentToggleChecked ] =
154170 useState ( false ) ;
@@ -157,6 +173,7 @@ const IndexFlowSection = ({
157173 const hasUnsupportedQueryTypes = fields . some ( ( field ) => {
158174 return field . type === '2dsphere' || field . type === 'text' ;
159175 } ) ;
176+ const track = useTelemetry ( ) ;
160177
161178 const isCoveredQueriesButtonDisabled =
162179 ! areAllFieldsFilledIn ( fields ) ||
@@ -188,13 +205,18 @@ const IndexFlowSection = ({
188205 return { [ field . name ] : index + 1 } ;
189206 } ) ;
190207
191- setCoveredQueriesObj ( {
192- coveredQueries : generateCoveredQueries ( coveredQueriesArr ) ,
193- optimalQueries : generateOptimalQueries ( coveredQueriesArr ) ,
194- showCoveredQueries : true ,
195- } ) ;
208+ try {
209+ setCoveredQueriesObj ( {
210+ coveredQueries : generateCoveredQueries ( coveredQueriesArr , track ) ,
211+ optimalQueries : generateOptimalQueries ( coveredQueriesArr ) ,
212+ showCoveredQueries : true ,
213+ } ) ;
214+ } catch ( e ) {
215+ onErrorEncountered ( e . message ) ;
216+ }
217+
196218 setHasFieldChanges ( false ) ;
197- } , [ fields ] ) ;
219+ } , [ fields , onErrorEncountered , track ] ) ;
198220
199221 useEffect ( ( ) => {
200222 setHasFieldChanges ( true ) ;
@@ -320,4 +342,12 @@ const IndexFlowSection = ({
320342 ) ;
321343} ;
322344
323- export default IndexFlowSection ;
345+ const mapState = ( ) => {
346+ return { } ;
347+ } ;
348+
349+ const mapDispatch = {
350+ onErrorEncountered : errorEncountered ,
351+ } ;
352+
353+ export default connect ( mapState , mapDispatch ) ( IndexFlowSection ) ;
0 commit comments