1
- import { Box , Button , Image , ThemeIcon , Tooltip } from "@mantine/core" ;
1
+ import { Box , Button , Image , Loader , ThemeIcon , Tooltip } from "@mantine/core" ;
2
2
import classes from "./CodeContainer.module.css" ;
3
3
import { Highlight , themes } from "prism-react-renderer" ;
4
4
import {
7
7
IconFoldUp ,
8
8
} from "@tabler/icons-react" ;
9
9
import useMountedState from "@/hooks/useMountedState" ;
10
+ import { useGetFile } from "@/hooks/useGetFile" ;
11
+ import { useEffect } from "react" ;
10
12
11
13
type CodeContainerProps = {
12
14
code_type : string ;
@@ -16,8 +18,6 @@ type CodeContainerProps = {
16
18
module : string ;
17
19
snippet : string ;
18
20
struct_name : string ;
19
- upper_lines : string ;
20
- lower_lines : string ;
21
21
} ;
22
22
docstring : string | null ;
23
23
line : number ;
@@ -35,42 +35,61 @@ const loadCount = 10;
35
35
export function CodeContainer ( props : CodeContainerProps ) {
36
36
const { context, line_from, sub_matches, line_to } = props ;
37
37
const [ codeLineFrom , setCodeLineFrom ] = useMountedState ( line_from ) ;
38
- const [ codeLineTo , setCodeLineTo ] = useMountedState ( 0 ) ;
38
+ const [ codeLineTo , setCodeLineTo ] = useMountedState ( line_to ) ;
39
39
const [ code , setCode ] = useMountedState ( props . context . snippet ) ;
40
+ const { data, error, loading, getFile } = useGetFile ( ) ;
41
+ const [ inStack , setInStack ] = useMountedState <
42
+ "loadUpperCode" | "loadLowerCode" | null
43
+ > ( null ) ;
40
44
41
45
const loadUpperCode = ( ) => {
42
- const upperCodeArray = context . upper_lines . split ( "\n" ) ;
43
- const upperCode = upperCodeArray
44
- . slice (
45
- codeLineFrom - loadCount + 1 > 0 ? codeLineFrom - loadCount + 1 : 0 ,
46
- codeLineFrom
47
- )
48
- . join ( "\n" ) ;
49
- setCodeLineFrom ( ( number ) => {
50
- return number - loadCount > 0 ? number - loadCount : 1 ;
51
- } ) ;
52
- setCode ( `${ upperCode } ${ code } ` ) ;
46
+ if ( ! data ) {
47
+ getFile ( context . file_path ) ;
48
+ setInStack ( "loadUpperCode" ) ;
49
+ }
50
+ if ( data ) {
51
+ const upperCodeArray = data . result [ 0 ] . code ;
52
+ const upperCode = upperCodeArray
53
+ . slice (
54
+ codeLineFrom - loadCount + 1 > 0 ? codeLineFrom - loadCount + 1 : 0 ,
55
+ codeLineFrom
56
+ )
57
+ . join ( "" ) ;
58
+ setCodeLineFrom ( ( number ) => {
59
+ return number - loadCount > 0 ? number - loadCount : 1 ;
60
+ } ) ;
61
+ setCode ( `${ upperCode } ${ code } ` ) ;
62
+ }
53
63
} ;
54
64
55
65
const loadLowerCode = ( ) => {
56
- const lowerCodeArray = context . lower_lines . split ( "\n" ) ;
57
- if ( lowerCodeArray . length > codeLineTo + loadCount ) {
66
+ if ( ! data ) {
67
+ getFile ( context . file_path ) ;
68
+ setInStack ( "loadLowerCode" ) ;
69
+ }
70
+ if ( data ) {
71
+ const lowerCodeArray = data . result [ 0 ] . code ;
58
72
const lowerCode = lowerCodeArray
59
- . slice ( codeLineTo , codeLineTo + loadCount + 1 )
60
- . join ( "\n " ) ;
73
+ . slice ( codeLineTo , codeLineTo + loadCount )
74
+ . join ( "" ) ;
61
75
setCodeLineTo ( ( number ) => {
62
76
return number + loadCount ;
63
77
} ) ;
64
78
setCode ( `${ code } ${ lowerCode } ` ) ;
65
- } else {
66
- const lowerCode = lowerCodeArray
67
- . slice ( codeLineTo , lowerCodeArray . length )
68
- . join ( "\n" ) ;
69
- setCodeLineTo ( lowerCodeArray . length ) ;
70
- setCode ( `${ code } ${ lowerCode } ` ) ;
71
79
}
72
80
} ;
73
81
82
+ useEffect ( ( ) => {
83
+ if ( inStack === "loadUpperCode" && data ) {
84
+ loadUpperCode ( ) ;
85
+ setInStack ( null ) ;
86
+ }
87
+ if ( inStack === "loadLowerCode" && data ) {
88
+ loadLowerCode ( ) ;
89
+ setInStack ( null ) ;
90
+ }
91
+ } , [ data ] ) ;
92
+
74
93
return (
75
94
< Box
76
95
className = { classes . wrapper }
@@ -131,12 +150,18 @@ export function CodeContainer(props: CodeContainerProps) {
131
150
withArrow
132
151
>
133
152
< span className = { classes . codeLoad } onClick = { loadUpperCode } >
134
- < IconFoldUp />
153
+ { loading && inStack === "loadUpperCode" ? (
154
+ < Loader type = "oval" size = "xs" />
155
+ ) : (
156
+ < IconFoldUp />
157
+ ) }
135
158
</ span >
136
159
</ Tooltip >
137
160
< div className = { classes . codeLine } >
138
161
< span className = { classes . codeNumber } >
139
- @@ { 1 } - { codeLineFrom - 1 } of { context . file_name }
162
+ { error
163
+ ? error
164
+ : `@@ 1 - ${ codeLineFrom - 1 } of ${ context . file_name } ` }
140
165
</ span >
141
166
</ div >
142
167
</ div >
@@ -174,10 +199,7 @@ export function CodeContainer(props: CodeContainerProps) {
174
199
) ) }
175
200
< div
176
201
style = {
177
- codeLineTo === context . lower_lines . split ( "\n" ) . length ||
178
- context . lower_lines === undefined ||
179
- context . lower_lines === null ||
180
- context . lower_lines === ""
202
+ data ?. result [ 0 ] . endline && codeLineTo >= data ?. result [ 0 ] . endline
181
203
? { display : "none" }
182
204
: {
183
205
display : "flex" ,
@@ -191,12 +213,12 @@ export function CodeContainer(props: CodeContainerProps) {
191
213
}
192
214
>
193
215
< Tooltip
194
- label = { `Load ${ line_to + codeLineTo + 2 } to ${
195
- line_to + codeLineTo + loadCount + 1 <
196
- context . lower_lines . split ( "\n" ) . length + line_to
197
- ? line_to + codeLineTo + loadCount + 1
198
- : context . lower_lines . split ( "\n" ) . length + line_to
199
- } `}
216
+ label = { `Load ${ codeLineTo + 2 } to ${
217
+ data ?. result [ 0 ] . endline &&
218
+ data ?. result [ 0 ] . endline < codeLineTo + loadCount + 2
219
+ ? data ?. result [ 0 ] . endline + 1
220
+ : codeLineTo + loadCount + 2
221
+ } of file `}
200
222
withArrow
201
223
>
202
224
< span
@@ -206,14 +228,22 @@ export function CodeContainer(props: CodeContainerProps) {
206
228
} }
207
229
onClick = { loadLowerCode }
208
230
>
209
- < IconFoldDown />
231
+ { loading && inStack === "loadLowerCode" ? (
232
+ < Loader type = "oval" size = "xs" />
233
+ ) : (
234
+ < IconFoldDown />
235
+ ) }
210
236
</ span >
211
237
</ Tooltip >
212
238
< div className = { classes . codeLine } >
213
239
< span className = { classes . codeNumber } >
214
- @@ { line_to + codeLineTo + 2 } -{ " " }
215
- { context . lower_lines . split ( "\n" ) . length + line_to } of{ " " }
216
- { context . file_name }
240
+ { error
241
+ ? error
242
+ : `@@ ${ codeLineTo + 2 } - ${
243
+ data ?. result [ 0 ] . endline
244
+ ? data ?. result [ 0 ] . endline + 1
245
+ : "end"
246
+ } of ${ context . file_name } `}
217
247
</ span >
218
248
</ div >
219
249
</ div >
0 commit comments