-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeEditor.tsx
More file actions
66 lines (60 loc) · 1.71 KB
/
CodeEditor.tsx
File metadata and controls
66 lines (60 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import React, { useState, useEffect } from "react";
import Editor from "@monaco-editor/react";
import axios from "axios";
const CodeEditor = ({ userId, language, artifactId }) => {
const [code, setCode] = useState("");
// Load existing code if editing an artifact
useEffect(() => {
if (artifactId) {
axios
.get(`http://localhost:8000/devbox/artifact/${artifactId}`)
.then((res) => setCode(res.data.content))
.catch((err) => console.error(err));
}
}, [artifactId]);
const saveArtifact = async () => {
try {
await axios.post("http://localhost:8000/devbox/create", {
user: userId,
language: language,
type: "file",
name: artifactId ? `Artifact-${artifactId}` : "NewArtifact",
content: code,
});
alert("Saved to DevBox!");
} catch (err) {
console.error(err);
alert("Save failed.");
}
};
const runArtifact = async () => {
try {
const res = await axios.post("http://localhost:8000/devbox/run", {
language,
content: code,
});
alert(`Output:\n${res.data.output}`);
} catch (err) {
console.error(err);
alert("Execution failed.");
}
};
return (
<div style={{ height: "80vh", display: "flex", flexDirection: "column" }}>
<Editor
height="70%"
defaultLanguage={language}
value={code}
onChange={(value) => setCode(value)}
theme="vs-dark"
/>
<div style={{ marginTop: "10px" }}>
<button onClick={saveArtifact}>💾 Save</button>
<button onClick={runArtifact} style={{ marginLeft: "10px" }}>
▶ Run
</button>
</div>
</div>
);
};
export default CodeEditor;