1
- import React , { createContext , useState , useContext , ReactNode , useEffect , useRef , useMemo } from "react" ;
2
- import { Monaco } from "@monaco-editor/react" ;
1
+ import React , { createContext , useState , useContext , ReactNode , useEffect , useMemo } from "react" ;
3
2
import * as Y from "yjs" ;
4
3
import * as monaco from "monaco-editor" ;
5
4
import { MonacoBinding } from "y-monaco" ;
@@ -20,6 +19,7 @@ interface CollaborationContextType {
20
19
isExecuting : boolean ;
21
20
execResult : CodeExecResult | null ;
22
21
setRoomId : ( roomId : string ) => void ;
22
+ connectedUsers : string [ ] ;
23
23
}
24
24
25
25
const CollaborationContext = createContext < CollaborationContextType | undefined > ( undefined ) ;
@@ -36,14 +36,17 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
36
36
version : "1.32.3" ,
37
37
alias : "Javascript"
38
38
} ) ;
39
- const [ languages , setLanguages ] = useState < Language [ ] > ( [ ] ) ;
40
- const [ execResult , setExecResult ] = useState < CodeExecResult | null > ( null ) ;
41
- const [ isExecuting , setIsExecuting ] = useState < boolean > ( false ) ;
42
39
43
40
const ydoc = useMemo ( ( ) => new Y . Doc ( ) , [ ] ) ;
44
41
const ymap : Y . Map < any > = useMemo ( ( ) => ydoc . getMap ( "sharedMap" ) , [ ydoc ] ) ;
45
42
46
43
const [ roomId , setRoomId ] = useState < string | null > ( null ) ;
44
+
45
+ const [ languages , setLanguages ] = useState < Language [ ] > ( [ ] ) ;
46
+ const [ execResult , setExecResult ] = useState < CodeExecResult | null > ( null ) ;
47
+ const [ isExecuting , setIsExecuting ] = useState < boolean > ( false ) ;
48
+ const [ connectedUsers , setConnectedUsers ] = useState < string [ ] > ( [ ] ) ;
49
+
47
50
const [ editor , setEditor ] = useState < monaco . editor . IStandaloneCodeEditor | null > ( null ) ;
48
51
const [ provider , setProvider ] = useState < WebsocketProvider | null > ( null ) ;
49
52
const [ binding , setBinding ] = useState < MonacoBinding | null > ( null ) ;
@@ -55,11 +58,14 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
55
58
}
56
59
const provider = new WebsocketProvider ( "ws://localhost:1234" , roomId , ydoc ) ;
57
60
setProvider ( provider ) ;
61
+
58
62
provider . awareness . setLocalStateField ( USERNAME , username ) ;
59
63
provider . awareness . on ( "change" , ( update : any ) => {
60
- const users = provider . awareness . getStates ( ) ;
64
+ const users = Array . from ( provider . awareness . getStates ( ) . values ( ) ) ;
65
+ setConnectedUsers ( users . map ( ( user ) => user [ USERNAME ] ) ) ;
61
66
// TODO: Some UI feedback about connection status of the other user
62
67
} ) ;
68
+
63
69
return ( ) => {
64
70
provider ?. destroy ( ) ;
65
71
ydoc ?. destroy ( ) ;
@@ -156,7 +162,8 @@ export const CollaborationProvider: React.FC<{ children: ReactNode }> = ({ child
156
162
handleChangeLanguage,
157
163
handleExecuteCode,
158
164
isExecuting,
159
- execResult
165
+ execResult,
166
+ connectedUsers
160
167
} }
161
168
>
162
169
{ children }
0 commit comments