@@ -13,14 +13,18 @@ export function useColumnWidths<R, SR>(
1313 resizedColumnWidths : ReadonlyMap < string , number > ,
1414 measuredColumnWidths : ReadonlyMap < string , number > ,
1515 setResizedColumnWidths : StateSetter < ReadonlyMap < string , number > > ,
16- setMeasuredColumnWidths : StateSetter < ReadonlyMap < string , number > > ,
16+ setMeasuredColumnWidths : ( columnWidths : ReadonlyMap < string , number > ) => void ,
1717 onColumnResize : DataGridProps < R , SR > [ 'onColumnResize' ]
1818) {
1919 const [ columnToAutoResize , setColumnToAutoResize ] = useState < {
2020 readonly key : string ;
2121 readonly width : ResizedWidth ;
2222 } | null > ( null ) ;
2323 const [ prevGridWidth , setPreviousGridWidth ] = useState ( gridWidth ) ;
24+ const [ temporaryMeasuredColumnWidths , setTemporaryMeasuredColumnWidths ] = useState < ReadonlyMap <
25+ string ,
26+ number
27+ > | null > ( null ) ;
2428 const columnsCanFlex : boolean = columns . length === viewportColumns . length ;
2529 // Allow columns to flex again when...
2630 const ignorePreviouslyMeasuredColumns : boolean =
@@ -38,7 +42,10 @@ export function useColumnWidths<R, SR>(
3842 columnsToMeasure . push ( key ) ;
3943 } else if (
4044 typeof width === 'string' &&
41- ( ignorePreviouslyMeasuredColumns || ! measuredColumnWidths . has ( key ) ) &&
45+ ( ignorePreviouslyMeasuredColumns ||
46+ ( temporaryMeasuredColumnWidths !== null
47+ ? temporaryMeasuredColumnWidths . has ( key )
48+ : ! measuredColumnWidths . has ( key ) ) ) &&
4249 ! resizedColumnWidths . has ( key )
4350 ) {
4451 newTemplateColumns [ idx ] = width ;
@@ -54,22 +61,22 @@ export function useColumnWidths<R, SR>(
5461 setPreviousGridWidth ( gridWidth ) ;
5562 if ( columnsToMeasure . length === 0 ) return ;
5663
57- setMeasuredColumnWidths ( ( measuredColumnWidths ) => {
58- const newMeasuredColumnWidths = new Map ( measuredColumnWidths ) ;
59- let hasChanges = false ;
60-
61- for ( const key of columnsToMeasure ) {
62- const measuredWidth = measureColumnWidth ( gridRef , key ) ;
63- hasChanges ||= measuredWidth !== measuredColumnWidths . get ( key ) ;
64- if ( measuredWidth === undefined ) {
65- newMeasuredColumnWidths . delete ( key ) ;
66- } else {
67- newMeasuredColumnWidths . set ( key , measuredWidth ) ;
68- }
64+ const newMeasuredColumnWidths = new Map ( measuredColumnWidths ) ;
65+ let hasChanges = false ;
66+
67+ for ( const key of columnsToMeasure ) {
68+ const measuredWidth = measureColumnWidth ( gridRef , key ) ;
69+ hasChanges ||= measuredWidth !== measuredColumnWidths . get ( key ) ;
70+ if ( measuredWidth === undefined ) {
71+ newMeasuredColumnWidths . delete ( key ) ;
72+ } else {
73+ newMeasuredColumnWidths . set ( key , measuredWidth ) ;
6974 }
75+ }
7076
71- return hasChanges ? newMeasuredColumnWidths : measuredColumnWidths ;
72- } ) ;
77+ if ( hasChanges ) {
78+ setMeasuredColumnWidths ( newMeasuredColumnWidths ) ;
79+ }
7380
7481 if ( columnToAutoResize !== null ) {
7582 const resizingKey = columnToAutoResize . key ;
@@ -93,15 +100,14 @@ export function useColumnWidths<R, SR>(
93100 flushSync ( ( ) => {
94101 if ( columnsCanFlex ) {
95102 // remeasure all the columns that can flex and are not resized by the user
96- setMeasuredColumnWidths ( ( measuredColumnWidths ) => {
97- const newMeasuredColumnWidths = new Map ( measuredColumnWidths ) ;
98- for ( const { key, width } of viewportColumns ) {
99- if ( resizingKey !== key && typeof width === 'string' && ! resizedColumnWidths . has ( key ) ) {
100- newMeasuredColumnWidths . delete ( key ) ;
101- }
103+ const newMeasuredColumnWidths = new Map ( measuredColumnWidths ) ;
104+ for ( const { key, width } of viewportColumns ) {
105+ if ( resizingKey !== key && typeof width === 'string' && ! resizedColumnWidths . has ( key ) ) {
106+ newMeasuredColumnWidths . delete ( key ) ;
102107 }
103- return newMeasuredColumnWidths ;
104- } ) ;
108+ }
109+
110+ setTemporaryMeasuredColumnWidths ( newMeasuredColumnWidths ) ;
105111 }
106112
107113 setColumnToAutoResize ( {
@@ -110,6 +116,8 @@ export function useColumnWidths<R, SR>(
110116 } ) ;
111117 } ) ;
112118
119+ setTemporaryMeasuredColumnWidths ( null ) ;
120+
113121 if ( onColumnResize ) {
114122 const previousWidth = resizedColumnWidths . get ( resizingKey ) ;
115123 const newWidth =
0 commit comments