@@ -16,6 +16,8 @@ interface CollaborationContextType {
16
16
languages : Language [ ] ;
17
17
handleChangeLanguage : ( lang : Language ) => void ;
18
18
handleExecuteCode : ( ) => void ;
19
+ stdout : string ;
20
+ stderr : string ;
19
21
}
20
22
const CollaborationContext = createContext < CollaborationContextType | undefined > ( undefined ) ;
21
23
@@ -33,6 +35,10 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
33
35
} ) ;
34
36
const [ languages , setLanguages ] = useState < Language [ ] > ( [ ] ) ;
35
37
38
+ const [ stdout , setStdout ] = useState < string > ( "" ) ;
39
+ const [ stderr , setStderr ] = useState < string > ( "" ) ;
40
+ const [ isExecuting , setIsExecuting ] = useState < boolean > ( false ) ;
41
+
36
42
const editorRef = useRef < monaco . editor . IStandaloneCodeEditor | null > ( null ) ;
37
43
const monacoRef = useRef < Monaco | null > ( null ) ;
38
44
const bindingRef = useRef < MonacoBinding | null > ( null ) ;
@@ -44,14 +50,20 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
44
50
editorRef . current = editor ;
45
51
monacoRef . current = monaco ;
46
52
47
- await initialiseLanguages ( monaco ) ;
48
53
const { yDoc, provider, yMap } = initialiseYdoc ( roomId ) ;
54
+
49
55
bindEditorToDoc ( editor , yDoc , provider ) ;
50
56
setUpObserver ( yMap ) ;
51
57
setUpConnectionAwareness ( provider ) ;
58
+ await initialiseLanguages ( monaco , yMap , editor ) ;
52
59
} ;
53
60
54
- const initialiseLanguages = async ( monaco : Monaco ) => {
61
+ const initialiseLanguages = async (
62
+ monaco : Monaco ,
63
+ yMap : Y . Map < any > ,
64
+ editor : monaco . editor . IStandaloneCodeEditor
65
+ ) => {
66
+ // Initialise language dropdown
55
67
const allLanguages = monaco . languages . getLanguages ( ) ;
56
68
const pistonLanguageVersions = await PistonClient . getLanguageVersions ( ) ;
57
69
setLanguages (
@@ -63,6 +75,13 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
63
75
version : pistonLanguageVersions . find ( ( pistonLang : any ) => pistonLang . language === lang . id ) ?. version
64
76
} ) )
65
77
) ;
78
+
79
+ // Set the editor's language
80
+ const language : Language = yMap . get ( SELECTED_LANGUAGE ) ;
81
+ const model = editor ?. getModel ( ) ;
82
+ if ( model ) {
83
+ monaco . editor . setModelLanguage ( model , language ?. language ?? "javascript" ) ;
84
+ }
66
85
} ;
67
86
68
87
const initialiseYdoc = ( roomId : string ) : { yDoc : Y . Doc ; yMap : Y . Map < any > ; provider : WebsocketProvider } => {
@@ -98,9 +117,11 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
98
117
yMap . observe ( ( event ) => {
99
118
event . changes . keys . forEach ( ( change , key ) => {
100
119
if ( key === SELECTED_LANGUAGE ) {
101
- const language = yMap . get ( SELECTED_LANGUAGE ) ;
102
- if ( language ) {
103
- setSelectedLanguage ( language ) ;
120
+ const language : Language = yMap . get ( SELECTED_LANGUAGE ) ;
121
+ setSelectedLanguage ( language ) ;
122
+ const model = editorRef . current ?. getModel ( ) ;
123
+ if ( model ) {
124
+ monaco . editor . setModelLanguage ( model , language . language ) ;
104
125
}
105
126
}
106
127
} ) ;
@@ -129,13 +150,36 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
129
150
yMapRef . current ?. set ( SELECTED_LANGUAGE , lang ) ;
130
151
} ;
131
152
132
- const handleExecuteCode = ( ) => {
133
- const sourceCode = editorRef . current ?. getValue ( ) ;
153
+ const handleExecuteCode = async ( ) => {
154
+ try {
155
+ setIsExecuting ( true ) ;
156
+ const sourceCode = editorRef . current ?. getValue ( ) ;
157
+ if ( ! sourceCode ) {
158
+ // TODO
159
+ return ;
160
+ }
161
+ const output = await PistonClient . executeCode ( selectedLanguage , sourceCode ) ;
162
+ const { stdout, stderr } = output ;
163
+ setStdout ( stdout ) ;
164
+ setStderr ( stderr ) ;
165
+ } catch ( e ) {
166
+ toast . error ( "There was an issue running the code" ) ;
167
+ } finally {
168
+ setIsExecuting ( false ) ;
169
+ }
134
170
} ;
135
171
136
172
return (
137
173
< CollaborationContext . Provider
138
- value = { { initialiseEditor, selectedLanguage, languages, handleChangeLanguage, handleExecuteCode } }
174
+ value = { {
175
+ initialiseEditor,
176
+ selectedLanguage,
177
+ languages,
178
+ handleChangeLanguage,
179
+ handleExecuteCode,
180
+ stdout,
181
+ stderr
182
+ } }
139
183
>
140
184
{ children }
141
185
</ CollaborationContext . Provider >
0 commit comments