feat(playground): extend runCode function to include output in message props and update terminal components for output display

This commit is contained in:
ngc2207 2025-01-08 20:00:16 +08:00
parent f20fbabba4
commit dbfcc8dfce
6 changed files with 26 additions and 7 deletions

View File

@ -107,7 +107,7 @@ function mapResultTypeToMessageType(type: ResultType): MessageType {
export async function runCode( export async function runCode(
language: string, language: string,
code: string code: string
): Promise<MessageProps> { ): Promise<MessageProps & { output: string }> {
const docker = new Dockerode({ socketPath: "/var/run/docker.sock" }); const docker = new Dockerode({ socketPath: "/var/run/docker.sock" });
const imageGCC = "gcc:latest"; const imageGCC = "gcc:latest";
let container: Dockerode.Container | undefined; let container: Dockerode.Container | undefined;
@ -126,6 +126,7 @@ export async function runCode(
return { return {
type: mapResultTypeToMessageType(result.type), type: mapResultTypeToMessageType(result.type),
message: result.message, message: result.message,
output: result.output,
}; };
} else { } else {
throw new Error(`不支持的语言: ${language}`); throw new Error(`不支持的语言: ${language}`);
@ -135,6 +136,7 @@ export async function runCode(
return { return {
type: "error", type: "error",
message: error instanceof Error ? error.message : "未知错误", message: error instanceof Error ? error.message : "未知错误",
output: "",
}; };
} finally { } finally {
if (container) { if (container) {

View File

@ -8,7 +8,7 @@ import { useTerminalStore } from "@/store/useTerminalStore";
export default function Run() { export default function Run() {
const { language, code } = useEditorStore(); const { language, code } = useEditorStore();
const { setType, setMessage } = useTerminalStore(); const { setType, setMessage, setOutput } = useTerminalStore();
return ( return (
<div className="inline-flex -space-x-px rounded-lg shadow-sm shadow-black/5 rtl:space-x-reverse"> <div className="inline-flex -space-x-px rounded-lg shadow-sm shadow-black/5 rtl:space-x-reverse">
@ -20,6 +20,7 @@ export default function Run() {
const result = runCode(language, code); const result = runCode(language, code);
setType((await result).type); setType((await result).type);
setMessage((await result).message); setMessage((await result).message);
setOutput((await result).output);
} else { } else {
console.error("Language or code is null"); console.error("Language or code is null");
} }

View File

@ -48,15 +48,15 @@ export default function Terminal() {
</TabsTrigger> </TabsTrigger>
</TabsList> </TabsList>
<div className="grow rounded-lg border border-border text-start bg-[#3e4452]"> <div className="grow rounded-lg border border-border text-start bg-[#3e4452]">
<TabsContent value="terminal"> <TabsContent value="terminal" className="h-full">
<Result /> <Result />
</TabsContent> </TabsContent>
<TabsContent value="comment"> <TabsContent value="comment" className="h-full">
<p className="px-4 py-1.5 text-xs text-muted-foreground"> <p className="px-4 py-1.5 text-xs text-muted-foreground">
Content for Tab 2 Content for Tab 2
</p> </p>
</TabsContent> </TabsContent>
<TabsContent value="case"> <TabsContent value="case" className="h-full">
<p className="px-4 py-1.5 text-xs text-muted-foreground"> <p className="px-4 py-1.5 text-xs text-muted-foreground">
Content for Tab 3 Content for Tab 3
</p> </p>

View File

@ -1,9 +1,21 @@
"use client"; "use client";
import { Message } from "./components/message"; import { Message } from "./components/message";
import { ScrollArea } from "@/components/ui/scroll-area";
import { useTerminalStore } from "@/store/useTerminalStore"; import { useTerminalStore } from "@/store/useTerminalStore";
export default function ResultPage() { export default function ResultPage() {
const { type, message } = useTerminalStore(); const { type, message, output } = useTerminalStore();
return <>{type && message && <Message type={type} message={message} />}</>; return (
<>
{type && message && (
<ScrollArea className="h-full bg-[#3e4452]">
<Message type={type} message={message} />
{output && (
<pre className="flex-grow px-4 text-sm text-white">{output}</pre>
)}
</ScrollArea>
)}
</>
);
} }

View File

@ -4,6 +4,8 @@ import { TerminalState } from "@/types/terminal";
export const useTerminalStore = create<TerminalState>((set) => ({ export const useTerminalStore = create<TerminalState>((set) => ({
type: null, type: null,
message: null, message: null,
output: null,
setType: (type) => set({ type }), setType: (type) => set({ type }),
setMessage: (message) => set({ message }), setMessage: (message) => set({ message }),
setOutput: (output) => set({ output }),
})); }));

View File

@ -3,6 +3,8 @@ import { MessageType } from "@/app/playground/layout/terminal/components/message
export interface TerminalState { export interface TerminalState {
type: MessageType | null; type: MessageType | null;
message: string | null; message: string | null;
output: string | null;
setType: (type: MessageType) => void; setType: (type: MessageType) => void;
setMessage: (message: string) => void; setMessage: (message: string) => void;
setOutput: (output: string) => void;
} }