Skip to content

Commit 0deef37

Browse files
committed
Add code run feature
User 1 clicks run button -> output appears in User 1, but not in User 2 output User 1 selects Java -> User 2 is still on default Python
1 parent 760f507 commit 0deef37

File tree

5 files changed

+67
-10
lines changed

5 files changed

+67
-10
lines changed

Frontend/src/components/collab/Chat.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const Chat = () => {
55

66
const messages = ["Hello!", "Nice to meet you!"]
77
return (
8-
<Card>
8+
<Card className='mt-3'>
99
<Card.Header>Chat</Card.Header>
1010
<Card.Body>
1111
<ListGroup>

Frontend/src/components/collab/CodeSpace.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@ import React from 'react'
22
import { Editor } from '@monaco-editor/react'
33
import { Container, Stack } from 'react-bootstrap'
44

5-
const CodeSpace = ({ handleEditorChange, code }) => {
5+
const CodeSpace = ({ handleEditorChange, code, language, output }) => {
66
return (
77

88
<Stack gap={3} className='h-100'>
99
<Editor
1010
height='400px'
11-
defaultLanguage='javascript'
11+
defaultLanguage="python"
12+
language={language}
1213
value={code}
1314
onChange={handleEditorChange}
1415
theme='vs-dark'
1516
/>
1617
<Container style={{ height: '200px', border: '1px solid #ccc', borderRadius: '0.5rem', padding: '1rem', backgroundColor: '#f8f9fa'}}>
1718
<h5>Output</h5>
19+
<p style={{ fontFamily: 'monospace', whiteSpace: 'pre-wrap'}}>{output}</p>
1820
</Container>
1921
</Stack>
2022

Frontend/src/components/collab/CollabNavigationBar.jsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,31 @@
11
import React from 'react';
2-
import { Button, Container, Navbar, Nav } from 'react-bootstrap';
2+
import { Button, Container, Navbar, Nav, Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'react-bootstrap';
3+
4+
const CollabNavigationBar = ({ handleExit, users, handleCodeRun, setLanguage, language }) => {
35

4-
const CollabNavigationBar = ({ handleExit, users }) => {
56
return (
67
<Navbar className='bg-light' sticky='top'>
78
<Container className='d-flex justify-content-between'>
9+
{/* Language Dropdown on left */}
10+
<Nav className='me-auto'>
11+
<Dropdown onSelect={(eventKey) => setLanguage(eventKey)}>
12+
<DropdownToggle style={{ backgroundColor: 'transparent', border: '1px solid #ccc', borderRadius: '0', color: '#000', padding: '8px 16px'}}>
13+
{language}
14+
</DropdownToggle>
15+
<DropdownMenu>
16+
<DropdownItem eventKey="python">Python</DropdownItem>
17+
<DropdownItem eventKey="c++">C++</DropdownItem>
18+
<DropdownItem eventKey="java">Java</DropdownItem>
19+
</DropdownMenu>
20+
</Dropdown>
21+
</Nav>
822
{/* Run Code and Exit Buttons in Center */}
923
<Nav className='mx-auto'>
10-
<Button>Run Code</Button>
24+
<Button onClick={handleCodeRun}>Run Code</Button>
1125
<Button variant="danger" className="ms-2" onClick={handleExit}>Exit</Button>
1226
</Nav>
1327

28+
{/* Users at the right */}
1429
<Nav>
1530
{users.map(user => {
1631
return <div

Frontend/src/components/collab/CollaborationSpace.jsx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import { getUserFromToken } from '../user/userAvatarBox';
66
import QuestionDisplay from './QuestionDisplay';
77
import Chat from './Chat';
88
import CollabNavigationBar from './CollabNavigationBar';
9-
import CodingSpace from './CodeSpace';
9+
import CodeSpace from './CodeSpace';
1010
import { Container, Row, Col } from 'react-bootstrap';
11+
import collabService from '../../services/collab';
1112

1213
const CollaborationSpace = () => {
1314
const navigate = useNavigate();
@@ -18,8 +19,17 @@ const CollaborationSpace = () => {
1819
const [code, setCode] = useState('');
1920
const [users, setUsers] = useState([]); // track users in the room
2021
const [userId, setUserId] = useState(""); // current user
22+
const [language, setLanguage] = useState("python") // set default language to python
23+
const [output, setOutput] = useState("")
24+
25+
// use https://emkc.org/api/v2/piston/runtimes to GET other languages
26+
const LANGUAGEVERSIONS = {
27+
"python" : "3.10.0",
28+
"java" : "15.0.2",
29+
"c++": "10.2.0"
30+
}
2131

22-
// get the userid only once with useEffect
32+
{/* Set up websockets for room management on client side, and collaboration for Yjs */}
2333
useEffect(() => {
2434
const fetchUser = async () => {
2535
const user = await getUserFromToken();
@@ -82,6 +92,8 @@ const CollaborationSpace = () => {
8292
}
8393
}
8494

95+
{/* Functions to handle interaction with UI elements */}
96+
8597
const handleExit = () => {
8698
// Notify server 3004 user is leaving
8799
websocket.send(JSON.stringify({ type: 'leaveRoom', roomId, userId}));
@@ -98,6 +110,26 @@ const CollaborationSpace = () => {
98110
navigate("/home")
99111
};
100112

113+
const handleCodeRun = () => {
114+
const code_message = {
115+
"language": language,
116+
"files": [
117+
{
118+
"content": code
119+
}
120+
],
121+
"version": LANGUAGEVERSIONS[language]
122+
}
123+
124+
collabService.getCodeOutput(code_message)
125+
.then(result => {
126+
console.log(result.data.run.output)
127+
setOutput(result.data.run.output)
128+
})
129+
.catch(err => console.log(err));
130+
131+
}
132+
101133
const handleEditorChange = (value) => {
102134
const yText = yDoc.getText('monacoEditor');
103135
yText.delete(0, yText.length); // Clear existing content
@@ -106,11 +138,11 @@ const CollaborationSpace = () => {
106138

107139
return (
108140
<div>
109-
<CollabNavigationBar handleExit={handleExit} users={users}/>
141+
<CollabNavigationBar handleExit={handleExit} handleCodeRun={handleCodeRun} users={users} setLanguage={setLanguage} language={language}/>
110142
<Container fluid style={{ marginTop: '20px' }}>
111143
<Row>
112144
<Col md={8}>
113-
<CodingSpace handleEditorChange={handleEditorChange} code={code}/>
145+
<CodeSpace handleEditorChange={handleEditorChange} code={code} language={language} output={output}/>
114146
</Col>
115147
<Col md={4}>
116148
<QuestionDisplay/>

Frontend/src/services/collab.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import axios from 'axios';
2+
3+
const getCodeOutput = async (codeData) => {
4+
const response = await axios.post("https://emkc.org/api/v2/piston/execute", codeData);
5+
return response;
6+
}
7+
8+
export default { getCodeOutput }

0 commit comments

Comments
 (0)