Skip to content

Commit 70948a0

Browse files
committed
Enable toggling of theme for code editor
1 parent b1ef5d6 commit 70948a0

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

frontend/components/collab/code-editor.tsx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
SelectTrigger,
1010
SelectValue,
1111
} from "@/components/ui/select";
12+
import { Button } from "@/components/ui/button";
1213
import * as Y from "yjs";
1314
import { WebsocketProvider } from "y-websocket";
1415
import { MonacoBinding } from "y-monaco";
@@ -42,33 +43,28 @@ const languages: Record<string, LanguageEntry> = {
4243
export default function CodeEditor({ roomId }: { roomId: string }) {
4344
const monaco = useMonaco();
4445
const [language, setLanguage] = useState<string>("Javascript");
46+
const [theme, setTheme] = useState<string>("light");
4547
const ydoc = useMemo(() => new Y.Doc(), []);
4648
const [editor, setEditor] =
4749
useState<MonacoEditor.IStandaloneCodeEditor | null>(null);
4850
const [provider, setProvider] = useState<WebsocketProvider | null>(null);
4951
const languageMap = useMemo(() => ydoc.getMap("language"), [ydoc]);
5052

51-
// this effect manages the lifetime of the Yjs document and the provider
5253
useEffect(() => {
5354
const provider = new WebsocketProvider(
5455
"ws://localhost:3002/yjs",
5556
roomId,
5657
ydoc
5758
);
58-
console.log(provider);
5959
setProvider(provider);
6060
return () => {
6161
provider?.destroy();
6262
ydoc.destroy();
6363
};
6464
}, [ydoc, roomId]);
6565

66-
// this effect manages the lifetime of the editor binding
6766
useEffect(() => {
68-
if (provider == null || editor == null) {
69-
console.log(provider, editor);
70-
return;
71-
}
67+
if (provider == null || editor == null) return;
7268
const monacoBinding = new MonacoBinding(
7369
ydoc.getText(),
7470
editor.getModel()!,
@@ -80,9 +76,7 @@ export default function CodeEditor({ roomId }: { roomId: string }) {
8076
};
8177
}, [ydoc, provider, editor]);
8278

83-
// Sync language changes across clients
8479
useEffect(() => {
85-
// Update language when languageMap changes
8680
const handleLanguageChange = () => {
8781
const newLanguage = languageMap.get("selectedLanguage") as string;
8882
if (newLanguage && newLanguage !== language) {
@@ -96,7 +90,6 @@ export default function CodeEditor({ roomId }: { roomId: string }) {
9690
};
9791
}, [languageMap, language]);
9892

99-
// Apply language change in the editor model
10093
useEffect(() => {
10194
if (editor && monaco) {
10295
const model = editor.getModel();
@@ -106,6 +99,12 @@ export default function CodeEditor({ roomId }: { roomId: string }) {
10699
}
107100
}, [language, editor, monaco]);
108101

102+
useEffect(() => {
103+
if (monaco) {
104+
monaco.editor.setTheme(theme === "dark" ? "vs-dark" : "light");
105+
}
106+
}, [theme, monaco]);
107+
109108
return (
110109
<div className="w-3/5 p-4">
111110
<Card className="h-full flex flex-col">
@@ -126,6 +125,12 @@ export default function CodeEditor({ roomId }: { roomId: string }) {
126125
))}
127126
</SelectContent>
128127
</Select>
128+
<Button
129+
onClick={() => setTheme(theme === "light" ? "dark" : "light")}
130+
variant={theme === "light" ? "secondary" : "default"}
131+
>
132+
{theme === "light" ? "Light" : "Dark"} Mode
133+
</Button>
129134
</div>
130135
<div className="flex-1 h-7/5">
131136
<Editor
@@ -134,6 +139,7 @@ export default function CodeEditor({ roomId }: { roomId: string }) {
134139
onMount={(editor) => {
135140
setEditor(editor);
136141
}}
142+
theme={theme === "dark" ? "vs-dark" : "light"}
137143
/>
138144
</div>
139145
</CardContent>

0 commit comments

Comments
 (0)