@@ -12,6 +12,8 @@ import FiChevronRight from "@/app/styles/icons/HiChevronRightGreen";
12
12
import { useRouter } from "next/navigation" ;
13
13
import { useUserSolutionStore , useEditorStore } from "@/lib/stores" ;
14
14
import { sendGAEvent } from "@next/third-parties/google" ;
15
+ import { CodeFile , OutputResult } from "@/lib/types" ;
16
+ import { OutputReducerAction } from "@/lib/reducers" ;
15
17
16
18
export default function CodeEditor ( {
17
19
codeString,
@@ -22,14 +24,23 @@ export default function CodeEditor({
22
24
stepIndex,
23
25
chapterIndex,
24
26
outputResult,
27
+ } : {
28
+ codeString : string ;
29
+ setCodeString : ( codeString : string ) => void ;
30
+ codeFile : CodeFile ;
31
+ dispatchOutput : React . Dispatch < OutputReducerAction > ;
32
+ nextStepPath : string | undefined ;
33
+ stepIndex : number ;
34
+ chapterIndex : number ;
35
+ outputResult : OutputResult ;
25
36
} ) {
26
37
const { colorMode } = useColorMode ( ) ;
27
- const [ monaco , setMonaco ] = useState ( null ) ;
38
+ const [ monaco , setMonaco ] = useState < any > ( null ) ;
28
39
const [ isValidating , setIsValidating ] = useState ( false ) ;
29
40
const router = useRouter ( ) ;
30
41
const editorStore = useEditorStore ( ) ;
31
42
const userSolutionStore = useUserSolutionStore ( ) ;
32
- const editorRef = useRef ( null ) ;
43
+ const editorRef = useRef < any > ( null ) ;
33
44
34
45
useEffect ( ( ) => {
35
46
if ( monaco ) {
@@ -52,18 +63,7 @@ export default function CodeEditor({
52
63
value : "Validate (through shortcut)" ,
53
64
} ) ;
54
65
event . preventDefault ( ) ;
55
- setIsValidating ( true ) ;
56
- setTimeout ( ( ) => {
57
- tryFormattingCode ( editorRef , setCodeString ) ;
58
- validateCode (
59
- codeString ,
60
- codeFile ,
61
- dispatchOutput ,
62
- stepIndex ,
63
- chapterIndex ,
64
- ) ;
65
- setIsValidating ( false ) ;
66
- } , 500 ) ;
66
+ handleValidate ( ) ;
67
67
}
68
68
} ;
69
69
@@ -97,6 +97,21 @@ export default function CodeEditor({
97
97
}
98
98
} , [ userSolutionStore ] ) ;
99
99
100
+ const handleValidate = ( ) => {
101
+ setIsValidating ( true ) ;
102
+ setTimeout ( ( ) => {
103
+ tryFormattingCode ( editorRef , setCodeString ) ;
104
+ validateCode (
105
+ codeString ,
106
+ codeFile ,
107
+ dispatchOutput ,
108
+ stepIndex ,
109
+ chapterIndex ,
110
+ ) ;
111
+ setIsValidating ( false ) ;
112
+ } , 500 ) ;
113
+ } ;
114
+
100
115
return (
101
116
< >
102
117
< div className = { ctx ( styles . codeEditor , GeistMono . className ) } >
@@ -124,24 +139,11 @@ export default function CodeEditor({
124
139
< div className = { styles . buttonsWrapper } >
125
140
< Flex dir = "row" gap = "8px" alignItems = "end" >
126
141
< MyBtn
127
- onClick = { ( ) => {
128
- setIsValidating ( true ) ;
129
- setTimeout ( ( ) => {
130
- tryFormattingCode ( editorRef , setCodeString ) ;
131
- validateCode (
132
- codeString ,
133
- codeFile ,
134
- dispatchOutput ,
135
- stepIndex ,
136
- chapterIndex ,
137
- ) ;
138
- setIsValidating ( false ) ;
139
- } , 500 ) ;
140
- } }
141
- isDisabled = { isValidating }
142
+ onClick = { ( ) => handleValidate ( ) }
142
143
variant = {
143
144
outputResult . validityStatus === "valid" ? "success" : "default"
144
145
}
146
+ isDisabled = { isValidating }
145
147
tooltip = "Shift + Enter"
146
148
>
147
149
{ isValidating ? "Validating..." : "Validate" }
0 commit comments