2025-06-14 03:33:17 +00:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
import { DiffEditor } from "@monaco-editor/react";
|
|
|
|
import { optimizeCode } from "@/app/actions/ai-improve";
|
2025-06-21 18:36:13 +00:00
|
|
|
import { useMonacoTheme } from "@/hooks/use-monaco-theme";
|
|
|
|
import React, { useState, useEffect, useCallback } from "react";
|
|
|
|
import { useProblemEditorStore } from "@/stores/problem-editor";
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 18:36:13 +00:00
|
|
|
export const AIEditorWrapper = () => {
|
|
|
|
const {
|
|
|
|
language,
|
|
|
|
value: originalCode,
|
|
|
|
setLoading,
|
|
|
|
AIgenerate,
|
|
|
|
LastOptimizedCode,
|
|
|
|
setLastOptimizedCode,
|
|
|
|
} = useProblemEditorStore();
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 18:36:13 +00:00
|
|
|
const [optimizedCode, setOptimizedCode] = useState<string>("");
|
|
|
|
const { theme } = useMonacoTheme();
|
2025-06-14 05:33:26 +00:00
|
|
|
|
|
|
|
const handleOptimize = useCallback(async () => {
|
2025-06-21 18:36:13 +00:00
|
|
|
setLoading(true);
|
2025-06-14 05:33:26 +00:00
|
|
|
try {
|
2025-06-21 18:36:13 +00:00
|
|
|
const res = await optimizeCode({
|
|
|
|
code: originalCode,
|
|
|
|
error: "",
|
|
|
|
problemId: "",
|
|
|
|
});
|
|
|
|
setOptimizedCode(res.optimizedCode);
|
|
|
|
setLastOptimizedCode(res.optimizedCode);
|
2025-06-14 05:33:26 +00:00
|
|
|
} catch (err) {
|
2025-06-21 18:36:13 +00:00
|
|
|
console.error("优化失败", err);
|
|
|
|
setOptimizedCode("// 优化失败,请稍后重试");
|
2025-06-14 05:33:26 +00:00
|
|
|
} finally {
|
2025-06-21 18:36:13 +00:00
|
|
|
setLoading(false);
|
2025-06-14 03:33:17 +00:00
|
|
|
}
|
2025-06-21 18:36:13 +00:00
|
|
|
}, [originalCode, setLoading, setLastOptimizedCode]);
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 18:36:13 +00:00
|
|
|
useEffect(() => {
|
|
|
|
if (AIgenerate) {
|
|
|
|
handleOptimize();
|
|
|
|
} else if (LastOptimizedCode) {
|
|
|
|
setOptimizedCode(LastOptimizedCode);
|
|
|
|
}
|
|
|
|
}, [AIgenerate, LastOptimizedCode, handleOptimize]);
|
2025-06-14 05:33:26 +00:00
|
|
|
|
|
|
|
return (
|
2025-06-21 18:36:13 +00:00
|
|
|
<div className="w-full h-[80vh] flex flex-col gap-4">
|
|
|
|
{optimizedCode && (
|
|
|
|
<div className="flex-1">
|
2025-06-20 14:25:07 +00:00
|
|
|
<DiffEditor
|
|
|
|
language={language}
|
2025-06-21 18:36:13 +00:00
|
|
|
original={originalCode}
|
|
|
|
modified={optimizedCode}
|
|
|
|
height="100%"
|
|
|
|
theme={theme}
|
|
|
|
options={{
|
|
|
|
readOnly: true,
|
|
|
|
renderSideBySide: true,
|
|
|
|
automaticLayout: true,
|
|
|
|
}}
|
2025-06-20 14:25:07 +00:00
|
|
|
/>
|
2025-06-21 18:36:13 +00:00
|
|
|
</div>
|
|
|
|
)}
|
2025-06-20 14:25:07 +00:00
|
|
|
</div>
|
2025-06-14 05:33:26 +00:00
|
|
|
);
|
|
|
|
};
|