refactor(playground): commented out the playground page

This commit is contained in:
ngc2207 2025-01-08 15:29:57 +08:00
parent 0c91222fb1
commit 1346ba7980

View File

@ -1,230 +1,234 @@
"use client"; // "use client";
import { Send } from "lucide-react"; // import { Send } from "lucide-react";
import * as monaco from "monaco-editor"; // import * as monaco from "monaco-editor";
import { Button } from "@/components/ui/button"; // import { Button } from "@/components/ui/button";
import { runCode } from "@/actions/docker/compile"; // import { runCode } from "@/actions/docker/compile";
import { useEffect, useRef, useState } from "react"; // import { useEffect, useRef, useState } from "react";
import { Editor, loader } from "@monaco-editor/react"; // import { Editor, loader } from "@monaco-editor/react";
import { MonacoLanguageClient } from "monaco-languageclient"; // import { MonacoLanguageClient } from "monaco-languageclient";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; // import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; // import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
import { COriginal, CplusplusOriginal, JavaOriginal } from "devicons-react"; // import { COriginal, CplusplusOriginal, JavaOriginal } from "devicons-react";
import { connectToLanguageServer, LSP_SUPPORTED_LANGUAGES } from "@/lib/lsp"; // import { connectToLanguageServer, LSP_SUPPORTED_LANGUAGES } from "@/lib/lsp";
import { codeToHtml } from "shiki"; // import { codeToHtml } from "shiki";
const files: { // const files: {
[key: string]: { name: string; language: string; value: string }; // [key: string]: { name: string; language: string; value: string };
} = { // } = {
c: { // c: {
name: "main.c", // name: "main.c",
language: "c", // language: "c",
value: `#include <stdio.h> // value: `#include <stdio.h>
int main() { // int main() {
printf("Hello, World!"); // printf("Hello, World!");
return 0; // return 0;
}`, // }`,
}, // },
cpp: { // cpp: {
name: "main.cpp", // name: "main.cpp",
language: "cpp", // language: "cpp",
value: `#include <iostream> // value: `#include <iostream>
int main() { // int main() {
std::cout << "Hello, World!"; // std::cout << "Hello, World!";
return 0; // return 0;
}`, // }`,
}, // },
java: { // java: {
name: "Main.java", // name: "Main.java",
language: "java", // language: "java",
value: `public class Main { // value: `public class Main {
public static void main(String[] args) { // public static void main(String[] args) {
System.out.println("Hello, World!"); // System.out.println("Hello, World!");
} // }
}`, // }`,
}, // },
}; // };
loader.config({ monaco }); // loader.config({ monaco });
// export default function PlaygroundPage() {
// const [language, setLanguage] = useState<string>("c");
// const [highlightedMessage, setHighlightedMessage] = useState<string>("");
// const file = files[language];
// const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
// const webSocketRef = useRef<WebSocket | null>(null);
// const languageClientRef = useRef<MonacoLanguageClient | null>(null);
// useEffect(() => {
// const handleLanguageChange = async () => {
// if (editorRef.current) {
// const model = editorRef.current.getModel();
// if (model) {
// const lineCount = model.getLineCount();
// const lastLineLength = model.getLineLength(lineCount);
// editorRef.current.setPosition({
// lineNumber: lineCount,
// column: lastLineLength + 1,
// });
// editorRef.current.focus();
// if (
// languageClientRef.current &&
// language in LSP_SUPPORTED_LANGUAGES
// ) {
// await languageClientRef.current.stop();
// languageClientRef.current = null;
// }
// if (
// webSocketRef.current &&
// webSocketRef.current.readyState !== WebSocket.CLOSED &&
// webSocketRef.current.readyState !== WebSocket.CLOSING &&
// language in LSP_SUPPORTED_LANGUAGES
// ) {
// webSocketRef.current.close();
// webSocketRef.current = null;
// }
// if (language in LSP_SUPPORTED_LANGUAGES) {
// try {
// const languageClient = await connectToLanguageServer(
// language,
// webSocketRef
// );
// languageClientRef.current = languageClient;
// } catch (error) {
// console.error("Failed to connect to language server:", error);
// }
// }
// }
// }
// };
// handleLanguageChange();
// }, [language]);
// const handleSubmit = async () => {
// const code = editorRef.current?.getValue();
// if (!code) {
// console.error("No code to compile");
// return;
// }
// const result = await runCode(code, language);
// const statusMessage = result.success
// ? "Compilation successful"
// : "Compilation failed";
// const fullMessage = `${statusMessage}\n\n${result.output}`;
// const highlighted = await codeToHtml(fullMessage, {
// lang: "log",
// theme: "one-dark-pro",
// });
// setHighlightedMessage(highlighted);
// };
// return (
// <div className="h-full flex flex-col">
// <div className="flex items-center justify-between">
// <Tabs defaultValue={language as string}>
// <ScrollArea>
// <TabsList className="m-3">
// <TabsTrigger
// value="c"
// onClick={() => setLanguage("c")}
// disabled={language === "c"}
// >
// <COriginal
// className="-ms-0.5 me-1.5"
// size={16}
// strokeWidth={2}
// aria-hidden="true"
// />
// C
// </TabsTrigger>
// <TabsTrigger
// value="cpp"
// className="group"
// onClick={() => setLanguage("cpp")}
// disabled={language === "cpp"}
// >
// <CplusplusOriginal
// className="-ms-0.5 me-1.5"
// size={16}
// strokeWidth={2}
// aria-hidden="true"
// />
// C++
// </TabsTrigger>
// <TabsTrigger
// value="java"
// className="group"
// onClick={() => setLanguage("java")}
// disabled={language === "java"}
// >
// <JavaOriginal
// className="-ms-0.5 me-1.5"
// size={16}
// strokeWidth={2}
// aria-hidden="true"
// />
// Java
// </TabsTrigger>
// </TabsList>
// <ScrollBar orientation="horizontal" />
// </ScrollArea>
// </Tabs>
// <div className="m-3">
// <Button variant="outline" onClick={handleSubmit}>
// Submit
// <Send
// className="-me-1 ms-2 opacity-60"
// size={16}
// strokeWidth={2}
// aria-hidden="true"
// />
// </Button>
// </div>
// </div>
// <div className="flex flex-1 mt-0 m-3 gap-x-1">
// <div className="w-2/3">
// <Editor
// theme="vs-dark"
// path={file.name}
// defaultLanguage={file.language}
// defaultValue={file.value}
// options={{ automaticLayout: true }}
// onMount={(editor) => {
// editorRef.current = editor;
// if (editorRef.current) {
// const model = editorRef.current.getModel();
// if (model) {
// const lineCount = model.getLineCount();
// const lastLineLength = model.getLineLength(lineCount);
// editorRef.current.setPosition({
// lineNumber: lineCount,
// column: lastLineLength + 1,
// });
// editorRef.current.focus();
// connectToLanguageServer(language, webSocketRef)
// .then((languageClient) => {
// languageClientRef.current = languageClient;
// })
// .catch((error) => {
// console.error(
// "Failed to connect to language server:",
// error
// );
// });
// }
// }
// }}
// />
// </div>
// <div className="h-full w-1/3">
// <div dangerouslySetInnerHTML={{ __html: highlightedMessage }} />
// </div>
// </div>
// </div>
// );
// }
export default function PlaygroundPage() { export default function PlaygroundPage() {
const [language, setLanguage] = useState<string>("c"); return null;
const [highlightedMessage, setHighlightedMessage] = useState<string>("");
const file = files[language];
const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
const webSocketRef = useRef<WebSocket | null>(null);
const languageClientRef = useRef<MonacoLanguageClient | null>(null);
useEffect(() => {
const handleLanguageChange = async () => {
if (editorRef.current) {
const model = editorRef.current.getModel();
if (model) {
const lineCount = model.getLineCount();
const lastLineLength = model.getLineLength(lineCount);
editorRef.current.setPosition({
lineNumber: lineCount,
column: lastLineLength + 1,
});
editorRef.current.focus();
if (
languageClientRef.current &&
language in LSP_SUPPORTED_LANGUAGES
) {
await languageClientRef.current.stop();
languageClientRef.current = null;
}
if (
webSocketRef.current &&
webSocketRef.current.readyState !== WebSocket.CLOSED &&
webSocketRef.current.readyState !== WebSocket.CLOSING &&
language in LSP_SUPPORTED_LANGUAGES
) {
webSocketRef.current.close();
webSocketRef.current = null;
}
if (language in LSP_SUPPORTED_LANGUAGES) {
try {
const languageClient = await connectToLanguageServer(
language,
webSocketRef
);
languageClientRef.current = languageClient;
} catch (error) {
console.error("Failed to connect to language server:", error);
}
}
}
}
};
handleLanguageChange();
}, [language]);
const handleSubmit = async () => {
const code = editorRef.current?.getValue();
if (!code) {
console.error("No code to compile");
return;
}
const result = await runCode(code, language);
const statusMessage = result.success
? "Compilation successful"
: "Compilation failed";
const fullMessage = `${statusMessage}\n\n${result.output}`;
const highlighted = await codeToHtml(fullMessage, {
lang: "log",
theme: "one-dark-pro",
});
setHighlightedMessage(highlighted);
};
return (
<div className="h-full flex flex-col">
<div className="flex items-center justify-between">
<Tabs defaultValue={language as string}>
<ScrollArea>
<TabsList className="m-3">
<TabsTrigger
value="c"
onClick={() => setLanguage("c")}
disabled={language === "c"}
>
<COriginal
className="-ms-0.5 me-1.5"
size={16}
strokeWidth={2}
aria-hidden="true"
/>
C
</TabsTrigger>
<TabsTrigger
value="cpp"
className="group"
onClick={() => setLanguage("cpp")}
disabled={language === "cpp"}
>
<CplusplusOriginal
className="-ms-0.5 me-1.5"
size={16}
strokeWidth={2}
aria-hidden="true"
/>
C++
</TabsTrigger>
<TabsTrigger
value="java"
className="group"
onClick={() => setLanguage("java")}
disabled={language === "java"}
>
<JavaOriginal
className="-ms-0.5 me-1.5"
size={16}
strokeWidth={2}
aria-hidden="true"
/>
Java
</TabsTrigger>
</TabsList>
<ScrollBar orientation="horizontal" />
</ScrollArea>
</Tabs>
<div className="m-3">
<Button variant="outline" onClick={handleSubmit}>
Submit
<Send
className="-me-1 ms-2 opacity-60"
size={16}
strokeWidth={2}
aria-hidden="true"
/>
</Button>
</div>
</div>
<div className="flex flex-1 mt-0 m-3 gap-x-1">
<div className="w-2/3">
<Editor
theme="vs-dark"
path={file.name}
defaultLanguage={file.language}
defaultValue={file.value}
options={{ automaticLayout: true }}
onMount={(editor) => {
editorRef.current = editor;
if (editorRef.current) {
const model = editorRef.current.getModel();
if (model) {
const lineCount = model.getLineCount();
const lastLineLength = model.getLineLength(lineCount);
editorRef.current.setPosition({
lineNumber: lineCount,
column: lastLineLength + 1,
});
editorRef.current.focus();
connectToLanguageServer(language, webSocketRef)
.then((languageClient) => {
languageClientRef.current = languageClient;
})
.catch((error) => {
console.error(
"Failed to connect to language server:",
error
);
});
}
}
}}
/>
</div>
<div className="h-full w-1/3">
<div dangerouslySetInnerHTML={{ __html: highlightedMessage }} />
</div>
</div>
</div>
);
} }