1
+ import React , { useEffect , useState , useRef , useMemo } from 'react'
2
+ import { useLocation } from 'react-router-dom' ;
3
+ // codemirror components
4
+ import { useCodeMirror } from '@uiw/react-codemirror' ;
5
+
6
+ // import languages
7
+ import { javascript } from '@codemirror/lang-javascript' ;
8
+ import { cpp } from '@codemirror/lang-cpp' ;
9
+ import { python } from '@codemirror/lang-python' ;
10
+ import { java } from '@codemirror/lang-java' ;
11
+
12
+ // import themes
13
+ import { githubDark } from '@uiw/codemirror-theme-github' ;
14
+ import { xcodeDark , xcodeLight } from '@uiw/codemirror-theme-xcode' ;
15
+ import { eclipse } from '@uiw/codemirror-theme-eclipse' ;
16
+ import { abcdef } from '@uiw/codemirror-theme-abcdef' ;
17
+ import { solarizedDark } from '@uiw/codemirror-theme-solarized' ;
18
+ import ACTIONS from '../Actions' ;
19
+ import copy from 'copy-to-clipboard' ;
20
+ import toast from 'react-hot-toast' ;
21
+ import "../styles/editor.css"
22
+ import { Button } from 'react-bootstrap' ;
23
+
24
+
25
+ // const extensions = [javascript()]
26
+
27
+
28
+ const Editor = ( { sendHandler, roomId, onCodeChange, code, lang } ) => {
29
+ const history = useLocation ( )
30
+ const location = useLocation ( )
31
+ const uname = location ?. state ?. username
32
+ const [ theme , setTheme ] = useState ( githubDark ) ;
33
+ // const [code, setcode] = useState(code);
34
+ const [ selectValue , setSelectValue ] = useState ( 'javascript' )
35
+ const [ extensions , setExtensions ] = useState ( [ javascript ( ) ] )
36
+ const [ placeholder , setPlaceholder ] = useState ( 'Please enter the code.' ) ;
37
+ const thememap = new Map ( )
38
+ const langnMap = new Map ( )
39
+
40
+ const editorRef = useRef ( null )
41
+ const { setContainer} = useCodeMirror ( {
42
+ container : editorRef . current ,
43
+ extensions,
44
+ value : code ,
45
+ theme,
46
+ editable : true ,
47
+ height : `70vh` ,
48
+ width :`45vw` ,
49
+ basicSetup :{
50
+ foldGutter : false ,
51
+ dropCursor : false ,
52
+ indentOnInput : false ,
53
+ } ,
54
+ options :{
55
+ autoComplete :true ,
56
+ } ,
57
+ placeholder : placeholder ,
58
+ style : {
59
+ position : `relative` ,
60
+ zIndex : `999` ,
61
+ borderRadius : `10px` ,
62
+ } ,
63
+ onChange : ( value ) => {
64
+ onCodeChange ( value )
65
+ // console.log(conns);
66
+ sendHandler ( 3 , { value} )
67
+ // for(let {conn, name} of conns) {
68
+ // conn.send({sig:3, data:{value}})
69
+ // }
70
+ }
71
+
72
+ } )
73
+
74
+
75
+ const themeInit = ( ) => {
76
+ thememap . set ( "githubDark" , githubDark )
77
+ thememap . set ( "xcodeDark" , xcodeDark )
78
+ thememap . set ( "eclipse" , eclipse )
79
+ thememap . set ( "xcodeLight" , xcodeLight )
80
+ thememap . set ( "abcdef" , abcdef )
81
+ thememap . set ( "solarizedDark" , solarizedDark )
82
+ }
83
+
84
+ const langInit = ( ) => {
85
+ langnMap . set ( 'java' , java )
86
+ langnMap . set ( 'cpp' , cpp )
87
+ langnMap . set ( "javascript" , javascript )
88
+ langnMap . set ( 'python' , python )
89
+ }
90
+
91
+
92
+ const handleThemeChange = ( event ) => {
93
+ setTheme ( thememap . get ( event . target . value ) ) ;
94
+ } ;
95
+
96
+ const handleLanguageChange = ( event ) => {
97
+ setExtensions ( [ langnMap . get ( event . target . value ) ( ) ] ) ;
98
+
99
+ sendHandler ( 4 , { newLang : event . target . value } )
100
+ setSelectValue ( event . target . value )
101
+ } ;
102
+
103
+ themeInit ( )
104
+ langInit ( )
105
+
106
+ useEffect ( ( ) => {
107
+ if ( ! editorRef . current ) {
108
+ alert ( 'error loading editor' )
109
+ history ( '/' )
110
+ }
111
+ if ( editorRef . current ) {
112
+ setContainer ( editorRef . current )
113
+ }
114
+
115
+ } , [ editorRef . current ] )
116
+
117
+ useEffect ( ( ) => {
118
+ if ( lang != selectValue && lang ) {
119
+ setSelectValue ( lang )
120
+ setExtensions ( [ langnMap . get ( lang ) ( ) ] ) ;
121
+ }
122
+ } , [ lang ] )
123
+
124
+ const copyCode = ( e ) => {
125
+ e . preventDefault ( ) ;
126
+ if ( copy ( roomId ) )
127
+ toast . success ( 'Session ID copied' )
128
+ else toast . error ( 'Cannot copy to clipboard' )
129
+ }
130
+
131
+ return (
132
+ < div className = 'editorcomponent' >
133
+ < span > Theme:</ span >
134
+ < select onChange = { handleThemeChange } >
135
+ < option default value = { "githubDark" } > githubDark</ option >
136
+ < option value = { "eclipse" } > eclipse</ option >
137
+ < option value = { "xcodeLight" } > xcodeLight</ option >
138
+ < option value = { "xcodeDark" } > xcodeDark</ option >
139
+ < option value = { "solarizedDark" } > solarizedDark</ option >
140
+ < option value = { "abcdef" } > abcdef</ option >
141
+ </ select >
142
+ < span > Language:</ span >
143
+ < select onChange = { handleLanguageChange } value = { selectValue } >
144
+ < option default value = { "javascript" } > javascript</ option >
145
+ < option value = { "java" } > java</ option >
146
+ < option value = { "cpp" } > cpp</ option >
147
+ < option value = { "python" } > python</ option >
148
+ </ select >
149
+ < div ref = { editorRef } className = 'ide' > </ div >
150
+ < div className = 'd-flex' >
151
+ { /* <Button className='mt-3 mx-4 btn-secondary' onClick={updateCode} >Update Code</Button> */ }
152
+ < Button className = 'mt-3 btn-info' onClick = { copyCode } > Copy Session Id</ Button >
153
+ </ div >
154
+ </ div >
155
+ ) ;
156
+ }
157
+
158
+ export default Editor
0 commit comments