1
1
import { useEffect , useMemo , useRef , useState } from 'react'
2
- import CodeMirrorMerge from 'react-codemirror-merge'
2
+ import { EditorView } from '@uiw/react-codemirror'
3
+ import CodeMirrorMerge , { CodeMirrorMergeRef } from 'react-codemirror-merge'
3
4
4
5
import { getComponentSpecificThemeClass } from '@Shared/Providers'
5
6
6
7
import { DiffMinimapProps } from '../types'
8
+ import { CODE_EDITOR_FONT_SIZE , CODE_EDITOR_LINE_HEIGHT } from '../CodeEditor.constants'
7
9
8
10
export const DiffMinimap = ( { view, state, diffMinimapExtensions, codeEditorTheme, theme } : DiffMinimapProps ) => {
9
- const minimapContainerRef = useRef < HTMLDivElement > ( null )
10
- const overlayRef = useRef < HTMLDivElement > ( null )
11
- const [ overlayHeight , setOverlayHeight ] = useState < number > ( 50 )
11
+ // STATES
12
12
const [ overlayTop , setOverlayTop ] = useState < number > ( 0 )
13
+ const [ overlayHeight , setOverlayHeight ] = useState < number > ( 50 )
13
14
const [ isDragging , setIsDragging ] = useState < boolean > ( false )
15
+
16
+ // REFS
17
+ const minimapContainerRef = useRef < HTMLDivElement > ( null )
18
+ const minimapEditorRef = useRef < CodeMirrorMergeRef > ( null )
19
+ const overlayRef = useRef < HTMLDivElement > ( null )
14
20
const dragStartY = useRef < number > ( 0 )
15
21
const startScrollTop = useRef < number > ( 0 )
16
22
23
+ // CONSTANTS
17
24
const componentSpecificThemeClass = getComponentSpecificThemeClass ( theme )
18
25
19
- const { scaleFactor , diffMinimapHeight } = useMemo ( ( ) => {
26
+ const scalingFactor = useMemo ( ( ) => {
20
27
if ( view ?. dom ) {
21
- return {
22
- scaleFactor : view . dom . parentElement . parentElement . clientHeight / view . dom . scrollHeight ,
23
- diffMinimapHeight : view . dom . scrollHeight ,
24
- }
28
+ return view . dom . clientHeight / view . dom . scrollHeight
25
29
}
26
30
27
- return { scaleFactor : 0 , diffMinimapHeight : 0 }
28
- } , [ view ] )
31
+ return 1
32
+ } , [ view ?. a . state . doc . length , view ?. b . state . doc . length ] )
29
33
30
34
// Update the overlay position and size
31
35
const updateOverlay = ( ) => {
@@ -45,7 +49,7 @@ export const DiffMinimap = ({ view, state, diffMinimapExtensions, codeEditorThem
45
49
46
50
useEffect ( ( ) => {
47
51
updateOverlay ( )
48
- } , [ scaleFactor ] )
52
+ } , [ scalingFactor ] )
49
53
50
54
// Sync overlay scrolling with the diff view
51
55
const handleDiffScroll = ( ) => {
@@ -128,48 +132,48 @@ export const DiffMinimap = ({ view, state, diffMinimapExtensions, codeEditorThem
128
132
view . dom . scrollTo ( { top : scrollRatio * ( scrollHeight - clientHeight ) } )
129
133
}
130
134
135
+ const minimapTheme = EditorView . theme ( {
136
+ '&.cm-editor' : {
137
+ fontSize : `${ scalingFactor * CODE_EDITOR_FONT_SIZE } px` ,
138
+ lineHeight : `${ scalingFactor * CODE_EDITOR_LINE_HEIGHT } ` ,
139
+ } ,
140
+ } )
141
+
131
142
return (
132
- < div ref = { minimapContainerRef } className = "dc__position-rel" >
143
+ < div
144
+ ref = { minimapContainerRef }
145
+ className = { `code-editor__minimap-container dc__position-rel dc__no-shrink cursor ${ componentSpecificThemeClass } ` }
146
+ onClick = { handleMinimapClick }
147
+ >
133
148
< CodeMirrorMerge
134
- key = { scaleFactor }
149
+ key = { scalingFactor }
150
+ ref = { minimapEditorRef }
135
151
theme = { codeEditorTheme }
136
- className = { ` code-editor__mini-map dc__overflow-hidden ${ componentSpecificThemeClass } ` }
152
+ className = " code-editor__mini-map dc__overflow-hidden w-100"
137
153
gutter = { false }
138
154
destroyRerender = { false }
139
- style = { {
140
- maxWidth : '30px' ,
141
- transform : `scale(1, ${ scaleFactor } )` ,
142
- height : `${ diffMinimapHeight } px` ,
143
- transformOrigin : 'top left' ,
144
- } }
145
155
>
146
156
< CodeMirrorMerge . Original
147
157
basicSetup = { false }
148
158
value = { state . lhsCode }
149
159
readOnly
150
160
editable = { false }
151
- extensions = { diffMinimapExtensions }
161
+ extensions = { [ ... diffMinimapExtensions , minimapTheme ] }
152
162
/>
153
163
< CodeMirrorMerge . Modified
154
164
basicSetup = { false }
155
165
value = { state . code }
156
166
readOnly
157
167
editable = { false }
158
- extensions = { diffMinimapExtensions }
168
+ extensions = { [ ... diffMinimapExtensions , minimapTheme ] }
159
169
/>
160
170
</ CodeMirrorMerge >
161
- < div
162
- className = "dc__position-abs dc__top-0 dc__left-0 dc__right-0 dc__bottom-0 dc__zi-1 cursor"
163
- onClick = { handleMinimapClick }
164
- />
165
171
< div
166
172
ref = { overlayRef }
167
- className = "dc__position-abs dc__left-0 w-100 br-4 dc__zi-2 "
173
+ className = "code-editor__minimap-overlay dc__position-abs dc__left-0 w-100 dc__zi-1 "
168
174
style = { {
169
175
top : `${ overlayTop } px` ,
170
176
height : `${ overlayHeight } px` ,
171
- backgroundColor : 'rgba(0, 0, 0, 0.3)' ,
172
- cursor : 'grab' ,
173
177
} }
174
178
onMouseDown = { handleOverlayMouseDown }
175
179
/>
0 commit comments