@@ -77,6 +77,10 @@ interface Awareness {
77
77
submitting : boolean ;
78
78
id : number ;
79
79
} ;
80
+ editorState : {
81
+ language : string ;
82
+ id : number ;
83
+ } ;
80
84
}
81
85
82
86
export const usercolors = [
@@ -101,8 +105,10 @@ const CollaborativeEditor = forwardRef(
101
105
) => {
102
106
const editorRef = useRef ( null ) ;
103
107
// const providerRef = useRef<WebrtcProvider | null>(null);
104
- const [ selectedLanguage , setSelectedLanguage ] = useState ( "Python" ) ;
108
+ const [ selectedLanguage , setSelectedLanguage ] = useState ( "python" ) ;
109
+ const [ mounted , setMounted ] = useState ( false ) ;
105
110
let sessionEndNotified = false ;
111
+ let sessionEndTimeout : any ;
106
112
107
113
const languageConf = new Compartment ( ) ;
108
114
@@ -113,57 +119,25 @@ const CollaborativeEditor = forwardRef(
113
119
} ) ;
114
120
115
121
// Referenced: https://codemirror.net/examples/config/#dynamic-configuration
116
- // const autoLanguage = EditorState.transactionExtender.of((tr) => {
117
- // if (!tr.docChanged) return null;
118
-
119
- // const snippet = tr.newDoc.sliceString(0, 100);
120
-
121
- // // Handle code change
122
- // props.onCodeChange(tr.newDoc.toString());
123
-
124
- // // Test for various language
125
- // const docIsPython = /^\s*(def|class)\s/.test(snippet);
126
- // const docIsJava = /^\s*(class|public\s+static\s+void\s+main)\s/.test(
127
- // snippet
128
- // ); // Java has some problems
129
- // const docIsCpp = /^\s*(#include|namespace|int\s+main)\s/.test(snippet); // Yet to test c++
130
- // const docIsGo = /^(package|import|func|type|var|const)\s/.test(snippet);
131
-
132
- // let newLanguage;
133
- // let languageType;
134
- // let languageLabel;
135
-
136
- // if (docIsPython) {
137
- // newLanguage = python();
138
- // languageLabel = "Python";
139
- // languageType = pythonLanguage;
140
- // } else if (docIsJava) {
141
- // newLanguage = java();
142
- // languageLabel = "Java";
143
- // languageType = javaLanguage;
144
- // } else if (docIsGo) {
145
- // newLanguage = go();
146
- // languageLabel = "Go";
147
- // languageType = goLanguage;
148
- // } else if (docIsCpp) {
149
- // newLanguage = cpp();
150
- // languageLabel = "C++";
151
- // languageType = cppLanguage;
152
- // } else {
153
- // newLanguage = javascript(); // Default to JavaScript
154
- // languageLabel = "JavaScript";
155
- // languageType = javascriptLanguage;
156
- // }
157
-
158
- // const stateLanguage = tr.startState.facet(language);
159
- // if (languageType == stateLanguage) return null;
160
-
161
- // setSelectedLanguage(languageLabel);
162
-
163
- // return {
164
- // effects: languageConf.reconfigure(newLanguage),
165
- // };
166
- // });
122
+ const autoLanguage = EditorState . transactionExtender . of ( ( tr ) => {
123
+ if ( ! tr . docChanged ) return null ;
124
+ const editorLanguage = localStorage . getItem ( "editor-language" ) ?? "" ;
125
+ let stateIsJs = tr . startState . facet ( language ) == javascriptLanguage ;
126
+ let stateIsPython = tr . startState . facet ( language ) == pythonLanguage ;
127
+ if (
128
+ ( stateIsJs && editorLanguage . toLowerCase ( ) === "javascript" ) ||
129
+ ( stateIsPython && editorLanguage . toLowerCase ( ) === "python" )
130
+ )
131
+ return null ;
132
+
133
+ return {
134
+ effects : languageConf . reconfigure (
135
+ editorLanguage . toLowerCase ( ) === "javascript"
136
+ ? javascript ( )
137
+ : python ( )
138
+ ) ,
139
+ } ;
140
+ } ) ;
167
141
168
142
const [ messageApi , contextHolder ] = message . useMessage ( ) ;
169
143
@@ -199,6 +173,7 @@ const CollaborativeEditor = forwardRef(
199
173
let latestSubmissionId : number = new Date ( 0 ) . getTime ( ) ;
200
174
let latestExecutingId : number = new Date ( 0 ) . getTime ( ) ;
201
175
let latestSubmittingId : number = new Date ( 0 ) . getTime ( ) ;
176
+ let latestLanguageChangeId : number = new Date ( 0 ) . getTime ( ) ;
202
177
203
178
useImperativeHandle ( ref , ( ) => ( {
204
179
endSession : ( ) => {
@@ -219,7 +194,20 @@ const CollaborativeEditor = forwardRef(
219
194
} ,
220
195
} ) ) ;
221
196
222
- let sessionEndTimeout : any ;
197
+ useEffect ( ( ) => {
198
+ localStorage . setItem ( "editor-language" , selectedLanguage ) ;
199
+
200
+ if ( props . providerRef . current && mounted ) {
201
+ latestLanguageChangeId = Date . now ( ) ;
202
+ props . providerRef . current . awareness . setLocalStateField ( "editorState" , {
203
+ language : selectedLanguage ,
204
+ id : latestLanguageChangeId ,
205
+ } ) ;
206
+ success ( `Changed Code Editor's language to ${ selectedLanguage } ` ) ;
207
+ } else {
208
+ setMounted ( true ) ;
209
+ }
210
+ } , [ selectedLanguage ] ) ;
223
211
224
212
useEffect ( ( ) => {
225
213
if ( process . env . NEXT_PUBLIC_SIGNALLING_SERVICE_URL === undefined ) {
@@ -309,6 +297,21 @@ const CollaborativeEditor = forwardRef(
309
297
. getStates ( )
310
298
. get ( clientID ) as Awareness ;
311
299
300
+ // New section to check for changes in language
301
+ if (
302
+ state &&
303
+ state . editorState &&
304
+ state . editorState . id !== latestLanguageChangeId
305
+ ) {
306
+ latestSubmissionId = state . editorState . id ;
307
+ setSelectedLanguage ( state . editorState . language ) ;
308
+ // if (props.user === state.user.name) {
309
+ // console.log("ownself update ownself");
310
+ // } else {
311
+ // console.log("others update ownself");
312
+ // }
313
+ }
314
+
312
315
if (
313
316
state &&
314
317
state . submissionResultsState &&
@@ -383,7 +386,7 @@ const CollaborativeEditor = forwardRef(
383
386
basicSetup ,
384
387
languageConf . of ( python ( ) ) ,
385
388
// languageConf.of(javascript()),
386
- // autoLanguage,
389
+ autoLanguage ,
387
390
yCollab ( ytext , provider . awareness , { undoManager } ) ,
388
391
keymap . of ( [ indentWithTab ] ) ,
389
392
codeChangeListener ,
@@ -410,10 +413,12 @@ const CollaborativeEditor = forwardRef(
410
413
< div className = "code-language" > Select Language:</ div >
411
414
< Select
412
415
className = "language-select"
413
- defaultValue = { selectedLanguage }
416
+ // defaultValue={localStorage.getItem("editor-language")}
417
+ value = { selectedLanguage }
414
418
options = { ProgrammingLanguageOptions }
415
- onSelect = { ( val ) => setSelectedLanguage ( val ) }
416
- disabled
419
+ onSelect = { ( val ) => {
420
+ setSelectedLanguage ( val ) ;
421
+ } }
417
422
/>
418
423
</ div >
419
424
< div
0 commit comments