@@ -44,7 +44,7 @@ import {
44
44
mergeAndRealizeTheme ,
45
45
} from "../common/styles.js" ;
46
46
import type { DataGridRef } from "../internal/data-grid/data-grid.js" ;
47
- import { getScrollBarWidth , useEventListener , useStateWithReactiveInput , whenDefined } from "../common/utils.js" ;
47
+ import { getScrollBarWidth , useEventListener , whenDefined } from "../common/utils.js" ;
48
48
import {
49
49
isGroupEqual ,
50
50
itemsAreEqual ,
@@ -83,6 +83,8 @@ import { type Keybinds, useKeybindingsWithDefaults } from "./data-editor-keybind
83
83
import type { Highlight } from "../internal/data-grid/render/data-grid-render.cells.js" ;
84
84
import { useRowGroupingInner , type RowGroupingOptions } from "./row-grouping.js" ;
85
85
import { useRowGrouping } from "./row-grouping-api.js" ;
86
+ import { useInitialScrollOffset } from "./use-initial-scroll-offset.js" ;
87
+ import type { VisibleRegion } from "./visible-region.js" ;
86
88
87
89
const DataGridOverlayEditor = React . lazy (
88
90
async ( ) => await import ( "../internal/data-grid-overlay-editor/data-grid-overlay-editor.js" )
@@ -732,7 +734,6 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
732
734
const searchInputRef = React . useRef < HTMLInputElement | null > ( null ) ;
733
735
const canvasRef = React . useRef < HTMLCanvasElement | null > ( null ) ;
734
736
const [ mouseState , setMouseState ] = React . useState < MouseState > ( ) ;
735
- const scrollRef = React . useRef < HTMLDivElement | null > ( null ) ;
736
737
const lastSent = React . useRef < [ number , number ] > ( ) ;
737
738
738
739
const safeWindow = typeof window === "undefined" ? null : window ;
@@ -1091,78 +1092,24 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
1091
1092
] ;
1092
1093
} , [ rowMarkers , columns , rowMarkerWidth , rowMarkerTheme , rowMarkerCheckboxStyle , rowMarkerChecked ] ) ;
1093
1094
1094
- const [ visibleRegionY , visibleRegionTy ] = React . useMemo ( ( ) => {
1095
- return [
1096
- scrollOffsetY !== undefined && typeof rowHeight === "number" ? Math . floor ( scrollOffsetY / rowHeight ) : 0 ,
1097
- scrollOffsetY !== undefined && typeof rowHeight === "number" ? - ( scrollOffsetY % rowHeight ) : 0 ,
1098
- ] ;
1099
- } , [ scrollOffsetY , rowHeight ] ) ;
1100
-
1101
- type VisibleRegion = Rectangle & {
1102
- /** value in px */
1103
- tx ?: number ;
1104
- /** value in px */
1105
- ty ?: number ;
1106
- extras ?: {
1107
- selected ?: Item ;
1108
- /**
1109
- * @deprecated
1110
- */
1111
- freezeRegion ?: Rectangle ;
1112
-
1113
- /**
1114
- * All visible freeze regions
1115
- */
1116
- freezeRegions ?: readonly Rectangle [ ] ;
1117
- } ;
1118
- } ;
1119
-
1120
1095
const visibleRegionRef = React . useRef < VisibleRegion > ( {
1121
1096
height : 1 ,
1122
1097
width : 1 ,
1123
1098
x : 0 ,
1124
1099
y : 0 ,
1125
1100
} ) ;
1126
- const visibleRegionInput = React . useMemo < VisibleRegion > (
1127
- ( ) => ( {
1128
- x : visibleRegionRef . current . x ,
1129
- y : visibleRegionY ,
1130
- width : visibleRegionRef . current . width ?? 1 ,
1131
- height : visibleRegionRef . current . height ?? 1 ,
1132
- // tx: 'TODO',
1133
- ty : visibleRegionTy ,
1134
- } ) ,
1135
- [ visibleRegionTy , visibleRegionY ]
1136
- ) ;
1137
1101
1138
1102
const hasJustScrolled = React . useRef ( false ) ;
1139
1103
1140
- const [ visibleRegion , setVisibleRegion , empty ] = useStateWithReactiveInput < VisibleRegion > ( visibleRegionInput ) ;
1141
- visibleRegionRef . current = visibleRegion ;
1142
-
1143
- const vScrollReady = ( visibleRegion . height ?? 1 ) > 1 ;
1144
- React . useLayoutEffect ( ( ) => {
1145
- if ( scrollOffsetY !== undefined && scrollRef . current !== null && vScrollReady ) {
1146
- if ( scrollRef . current . scrollTop === scrollOffsetY ) return ;
1147
- scrollRef . current . scrollTop = scrollOffsetY ;
1148
- if ( scrollRef . current . scrollTop !== scrollOffsetY ) {
1149
- empty ( ) ;
1150
- }
1151
- hasJustScrolled . current = true ;
1152
- }
1153
- } , [ scrollOffsetY , vScrollReady , empty ] ) ;
1104
+ const { setVisibleRegion, visibleRegion, scrollRef } = useInitialScrollOffset (
1105
+ scrollOffsetX ,
1106
+ scrollOffsetY ,
1107
+ rowHeight ,
1108
+ visibleRegionRef ,
1109
+ ( ) => ( hasJustScrolled . current = true )
1110
+ ) ;
1154
1111
1155
- const hScrollReady = ( visibleRegion . width ?? 1 ) > 1 ;
1156
- React . useLayoutEffect ( ( ) => {
1157
- if ( scrollOffsetX !== undefined && scrollRef . current !== null && hScrollReady ) {
1158
- if ( scrollRef . current . scrollLeft === scrollOffsetX ) return ;
1159
- scrollRef . current . scrollLeft = scrollOffsetX ;
1160
- if ( scrollRef . current . scrollLeft !== scrollOffsetX ) {
1161
- empty ( ) ;
1162
- }
1163
- hasJustScrolled . current = true ;
1164
- }
1165
- } , [ scrollOffsetX , hScrollReady , empty ] ) ;
1112
+ visibleRegionRef . current = visibleRegion ;
1166
1113
1167
1114
const cellXOffset = visibleRegion . x + rowMarkerOffset ;
1168
1115
const cellYOffset = visibleRegion . y ;
@@ -1494,7 +1441,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
1494
1441
forceEditMode : true ,
1495
1442
} ) ;
1496
1443
} ,
1497
- [ getMangledCellContent , setOverlaySimple ]
1444
+ [ getMangledCellContent , scrollRef , setOverlaySimple ]
1498
1445
) ;
1499
1446
1500
1447
const scrollTo = React . useCallback < ScrollToFn > (
@@ -1637,6 +1584,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
1637
1584
rowMarkerOffset ,
1638
1585
freezeTrailingRows ,
1639
1586
rowMarkerWidth ,
1587
+ scrollRef ,
1640
1588
totalHeaderHeight ,
1641
1589
freezeColumns ,
1642
1590
columns ,
@@ -3590,6 +3538,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
3590
3538
getMangledCellContent ,
3591
3539
gridSelection ,
3592
3540
keybindings . paste ,
3541
+ scrollRef ,
3593
3542
mangledCols . length ,
3594
3543
mangledOnCellsEdited ,
3595
3544
mangledRows ,
@@ -3697,7 +3646,16 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
3697
3646
}
3698
3647
}
3699
3648
} ,
3700
- [ columnsIn , getCellsForSelection , gridSelection , keybindings . copy , rowMarkerOffset , rows , copyHeaders ]
3649
+ [
3650
+ columnsIn ,
3651
+ getCellsForSelection ,
3652
+ gridSelection ,
3653
+ keybindings . copy ,
3654
+ rowMarkerOffset ,
3655
+ scrollRef ,
3656
+ rows ,
3657
+ copyHeaders ,
3658
+ ]
3701
3659
) ;
3702
3660
3703
3661
useEventListener ( "copy" , onCopy , safeWindow , false , false ) ;
@@ -3728,7 +3686,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
3728
3686
deleteRange ( effectiveSelection . current . range ) ;
3729
3687
}
3730
3688
} ,
3731
- [ deleteRange , gridSelection , keybindings . cut , onCopy , onDelete ]
3689
+ [ deleteRange , gridSelection , keybindings . cut , onCopy , scrollRef , onDelete ]
3732
3690
) ;
3733
3691
3734
3692
useEventListener ( "cut" , onCut , safeWindow , false , false ) ;
@@ -3912,7 +3870,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
3912
3870
}
3913
3871
} ,
3914
3872
} ) ,
3915
- [ appendRow , normalSizeColumn , onCopy , onKeyDown , onPasteInternal , rowMarkerOffset , scrollTo ]
3873
+ [ appendRow , normalSizeColumn , scrollRef , onCopy , onKeyDown , onPasteInternal , rowMarkerOffset , scrollTo ]
3916
3874
) ;
3917
3875
3918
3876
const [ selCol , selRow ] = currentCell ?? [ ] ;
0 commit comments