2025-06-14 03:33:17 +00:00
|
|
|
"use client";
|
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
import React, { useState, useEffect } from "react";
|
2025-06-14 03:33:17 +00:00
|
|
|
import { DiffEditor } from "@monaco-editor/react";
|
2025-06-21 08:08:38 +00:00
|
|
|
import { useMonacoTheme } from "@/hooks/use-monaco-theme";
|
2025-06-14 03:33:17 +00:00
|
|
|
import { optimizeCode } from "@/app/actions/ai-improve";
|
2025-06-21 08:08:38 +00:00
|
|
|
import { AIOptimizeButton } from "@/features/problems/code/components/toolbar/actions/AIOptimizeButton";
|
2025-06-14 05:33:26 +00:00
|
|
|
|
|
|
|
interface AIEditorWrapperProps {
|
2025-06-21 08:08:38 +00:00
|
|
|
language: string;
|
|
|
|
originalCode: string;
|
|
|
|
onReset: () => void;
|
2025-06-14 05:33:26 +00:00
|
|
|
}
|
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
export const AIEditorWrapper = ({ language, originalCode, onReset }: AIEditorWrapperProps) => {
|
|
|
|
const [optimizedCode, setOptimizedCode] = useState<string>("");
|
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
const { theme } = useMonacoTheme();
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
// 自动在组件首次挂载后执行 AI 优化
|
|
|
|
useEffect(() => {
|
|
|
|
if (!optimizedCode) {
|
|
|
|
handleOptimize();
|
|
|
|
}
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
}, []);
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
const handleOptimize = async () => {
|
|
|
|
setLoading(true);
|
|
|
|
try {
|
|
|
|
const res = await optimizeCode({
|
|
|
|
code: originalCode,
|
|
|
|
error: "",
|
|
|
|
problemId: "",
|
|
|
|
});
|
|
|
|
setOptimizedCode(res.optimizedCode);
|
|
|
|
} catch (err) {
|
|
|
|
console.error("优化失败", err);
|
|
|
|
setOptimizedCode("// 优化失败,请稍后重试");
|
|
|
|
} finally {
|
|
|
|
setLoading(false);
|
|
|
|
}
|
|
|
|
};
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
const handleClick = () => {
|
|
|
|
if (optimizedCode) {
|
|
|
|
// 已有优化,点击返回
|
|
|
|
setOptimizedCode("");
|
|
|
|
onReset();
|
|
|
|
} else {
|
|
|
|
// 手动触发优化(如果需要)
|
|
|
|
handleOptimize();
|
|
|
|
}
|
|
|
|
};
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
return (
|
|
|
|
<div className="w-full h-[80vh] flex flex-col gap-4">
|
|
|
|
<div>
|
|
|
|
<AIOptimizeButton
|
|
|
|
loading={loading}
|
|
|
|
hasOptimized={!!optimizedCode}
|
|
|
|
onClick={handleClick}
|
|
|
|
/>
|
|
|
|
</div>
|
2025-06-14 05:33:26 +00:00
|
|
|
|
2025-06-21 08:08:38 +00:00
|
|
|
{optimizedCode && (
|
|
|
|
<div className="flex-1">
|
|
|
|
<DiffEditor
|
|
|
|
language={language}
|
|
|
|
original={originalCode}
|
|
|
|
modified={optimizedCode}
|
|
|
|
height="100%"
|
|
|
|
theme={theme}
|
|
|
|
options={{ readOnly: true, renderSideBySide: true, automaticLayout: true }}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
2025-06-14 05:33:26 +00:00
|
|
|
};
|