1- import React , {
2- useMemo ,
3- useCallback ,
4- useEffect ,
5- useReducer ,
6- useState ,
7- } from 'react' ;
1+ import React , { useMemo , useCallback , useEffect , useState } from 'react' ;
82import {
93 BSONValue ,
104 css ,
@@ -13,6 +7,7 @@ import {
137 LeafyGreenProvider ,
148 spacing ,
159 withDarkMode ,
10+ useForceUpdate ,
1611} from '@mongodb-js/compass-components' ;
1712import { type Document , Element } from 'hadron-document' ;
1813import type { ICellRendererParams } from 'ag-grid-community' ;
@@ -90,6 +85,21 @@ const decrypdedIconStyles = css({
9085 display : 'flex' ,
9186} ) ;
9287
88+ const getElementLength = (
89+ element : Element | undefined | null
90+ ) : number | undefined => {
91+ if ( ! element ) {
92+ return undefined ;
93+ }
94+
95+ if ( element . currentType === 'Object' ) {
96+ return Object . keys ( element . generateObject ( ) as object ) . length ;
97+ }
98+ if ( element . currentType === 'Array' && element . elements ) {
99+ return element . elements . size ;
100+ }
101+ } ;
102+
93103interface CellContentProps {
94104 element : Element | undefined | null ;
95105 cellState :
@@ -110,7 +120,7 @@ const CellContent: React.FC<CellContentProps> = ({
110120 onUndo,
111121 onExpand,
112122} ) => {
113- const [ , forceUpdate ] = useReducer ( ( x : number ) => x + 1 , 0 ) ;
123+ const forceUpdate = useForceUpdate ( ) ;
114124 const isEmpty = element === undefined || element === null ;
115125 const handleElementEvent = useCallback ( ( ) => {
116126 forceUpdate ( ) ;
@@ -133,18 +143,7 @@ const CellContent: React.FC<CellContentProps> = ({
133143 }
134144 } , [ isEmpty , element , handleElementEvent ] ) ;
135145
136- const elementLength = useMemo ( ( ) : number | undefined => {
137- if ( ! element ) {
138- return undefined ;
139- }
140-
141- if ( element . currentType === 'Object' ) {
142- return Object . keys ( element . generateObject ( ) as object ) . length ;
143- }
144- if ( element . currentType === 'Array' && element . elements ) {
145- return element . elements . size ;
146- }
147- } , [ element ] ) ;
146+ const elementLength = getElementLength ( element ) ;
148147
149148 const renderContent = useCallback ( ( ) => {
150149 if ( cellState === EMPTY || ! element ) {
@@ -183,7 +182,6 @@ const CellContent: React.FC<CellContentProps> = ({
183182 }
184183 } else {
185184 elementContent = (
186- //@ts -expect-error Types for this are currently not consistent
187185 < BSONValue type = { element . currentType } value = { element . currentValue } />
188186 ) ;
189187 }
@@ -204,7 +202,14 @@ const CellContent: React.FC<CellContentProps> = ({
204202 </ div >
205203 </ div >
206204 ) ;
207- } , [ element , elementLength , cellState ] ) ;
205+ // eslint-disable-next-line react-hooks/exhaustive-deps
206+ } , [
207+ element ,
208+ element ?. currentType ,
209+ element ?. currentValue ,
210+ elementLength ,
211+ cellState ,
212+ ] ) ;
208213
209214 const canUndo =
210215 cellState === ADDED ||
@@ -355,22 +360,18 @@ const CellRenderer: React.FC<CellRendererProps> = ({
355360 // `ag-grid` renders this component outside of the context chain
356361 // so we re-supply the dark mode theme here.
357362 < LeafyGreenProvider darkMode = { darkMode } >
358- < div >
359- { /* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus*/ }
360- < div
361- className = {
362- cellState === VALID ? BEM_BASE : `${ BEM_BASE } -${ cellState } `
363- }
364- onClick = { handleClicked }
365- role = "button"
366- >
367- < CellContent
368- element = { element }
369- cellState = { cellState }
370- onUndo = { handleUndo }
371- onExpand = { handleDrillDown }
372- />
373- </ div >
363+ { /* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus*/ }
364+ < div
365+ className = { cellState === VALID ? BEM_BASE : `${ BEM_BASE } -${ cellState } ` }
366+ onClick = { handleClicked }
367+ role = "button"
368+ >
369+ < CellContent
370+ element = { element }
371+ cellState = { cellState }
372+ onUndo = { handleUndo }
373+ onExpand = { handleDrillDown }
374+ />
374375 </ div >
375376 </ LeafyGreenProvider >
376377 ) ;
0 commit comments