From cd1127e0513d0494de2589a39f0b203bd4f2f125 Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Fri, 20 Jun 2025 22:25:07 +0800 Subject: [PATCH] style: normalize quotes and indentation --- src/app/actions/ai-improve.ts | 176 +++---- src/app/actions/ai-testcase.ts | 175 +++---- src/app/actions/getProblem.ts | 102 ++-- src/app/actions/getProblemLocales.ts | 14 +- src/components/ai-optimized-editor.tsx | 129 +++--- src/components/creater/edit-code-panel.tsx | 124 ++--- .../creater/edit-description-panel.tsx | 223 +++++---- src/components/creater/edit-detail-panel.tsx | 165 +++---- .../creater/edit-solution-panel.tsx | 206 +++++---- .../creater/edit-testcase-panel.tsx | 435 ++++++++++-------- src/components/creater/problem-maintain.tsx | 128 ++++-- src/types/ai-improve.ts | 14 +- src/types/ai-testcase.ts | 24 +- 13 files changed, 1046 insertions(+), 869 deletions(-) diff --git a/src/app/actions/ai-improve.ts b/src/app/actions/ai-improve.ts index e438bf2..d73a47a 100644 --- a/src/app/actions/ai-improve.ts +++ b/src/app/actions/ai-improve.ts @@ -1,9 +1,9 @@ "use server"; import { - OptimizeCodeInput, - OptimizeCodeOutput, - OptimizeCodeOutputSchema, + OptimizeCodeInput, + OptimizeCodeOutput, + OptimizeCodeOutputSchema, } from "@/types/ai-improve"; import { deepseek } from "@/lib/ai"; import { CoreMessage, generateText } from "ai"; @@ -15,71 +15,77 @@ import prisma from "@/lib/prisma"; * @returns 优化后的代码和说明 */ export const optimizeCode = async ( - input: OptimizeCodeInput + input: OptimizeCodeInput ): Promise => { - const model = deepseek("chat"); + const model = deepseek("chat"); - // 获取题目详情(如果提供了problemId) - let problemDetails = ""; + // 获取题目详情(如果提供了problemId) + let problemDetails = ""; - if (input.problemId) { - try { - // 尝试获取英文描述 - const problemLocalizationEn = await prisma.problemLocalization.findUnique({ - where: { - problemId_locale_type: { - problemId: input.problemId, - locale: "en", - type: "DESCRIPTION", - }, - }, - include: { - problem: true, - }, - }); + if (input.problemId) { + try { + // 尝试获取英文描述 + const problemLocalizationEn = await prisma.problemLocalization.findUnique( + { + where: { + problemId_locale_type: { + problemId: input.problemId, + locale: "en", + type: "DESCRIPTION", + }, + }, + include: { + problem: true, + }, + } + ); - if (problemLocalizationEn) { - problemDetails = ` + if (problemLocalizationEn) { + problemDetails = ` Problem Requirements: ------------------- Description: ${problemLocalizationEn.content} `; - } else { - // 回退到中文描述 - const problemLocalizationZh = await prisma.problemLocalization.findUnique({ - where: { - problemId_locale_type: { - problemId: input.problemId, - locale: "zh", - type: "DESCRIPTION", - }, - }, - include: { - problem: true, - }, - }); + } else { + // 回退到中文描述 + const problemLocalizationZh = + await prisma.problemLocalization.findUnique({ + where: { + problemId_locale_type: { + problemId: input.problemId, + locale: "zh", + type: "DESCRIPTION", + }, + }, + include: { + problem: true, + }, + }); - if (problemLocalizationZh) { - problemDetails = ` + if (problemLocalizationZh) { + problemDetails = ` Problem Requirements: ------------------- Description: ${problemLocalizationZh.content} `; - console.warn(`Fallback to Chinese description for problemId: ${input.problemId}`); - } else { - problemDetails = "Problem description not found in any language."; - console.warn(`No description found for problemId: ${input.problemId}`); - } - } - } catch (error) { - console.error("Failed to fetch problem details:", error); - problemDetails = "Error fetching problem description."; + console.warn( + `Fallback to Chinese description for problemId: ${input.problemId}` + ); + } else { + problemDetails = "Problem description not found in any language."; + console.warn( + `No description found for problemId: ${input.problemId}` + ); } + } + } catch (error) { + console.error("Failed to fetch problem details:", error); + problemDetails = "Error fetching problem description."; } + } - - // 构建AI提示词 - const prompt = ` + // 构建AI提示词 + const prompt = ` Analyze the following programming code for potential errors, inefficiencies or code style issues. Provide an optimized version of the code with explanations. Focus on: 1. Fixing any syntax errors @@ -104,40 +110,40 @@ Format: "issuesFixed": ["list of issues fixed"] } `; - console.log("Prompt:", prompt); + console.log("Prompt:", prompt); - // 发送请求给OpenAI - const messages: CoreMessage[] = [{ role: "user", content: prompt }]; - let text; - try { - const response = await generateText({ - model: model, - messages: messages, - }); - text = response.text; - } catch (error) { - console.error("Error generating text with OpenAI:", error); - throw new Error("Failed to generate response from OpenAI"); - } + // 发送请求给OpenAI + const messages: CoreMessage[] = [{ role: "user", content: prompt }]; + let text; + try { + const response = await generateText({ + model: model, + messages: messages, + }); + text = response.text; + } catch (error) { + console.error("Error generating text with OpenAI:", error); + throw new Error("Failed to generate response from OpenAI"); + } - // 解析LLM响应 - let llmResponseJson; - try { - const cleanedText = text.trim(); - llmResponseJson = JSON.parse(cleanedText); - } catch (error) { - console.error("Failed to parse LLM response as JSON:", error); - console.error("LLM raw output:", text); - throw new Error("Invalid JSON response from LLM"); - } + // 解析LLM响应 + let llmResponseJson; + try { + const cleanedText = text.trim(); + llmResponseJson = JSON.parse(cleanedText); + } catch (error) { + console.error("Failed to parse LLM response as JSON:", error); + console.error("LLM raw output:", text); + throw new Error("Invalid JSON response from LLM"); + } - // 验证响应格式 - const validationResult = OptimizeCodeOutputSchema.safeParse(llmResponseJson); - if (!validationResult.success) { - console.error("Zod validation failed:", validationResult.error.format()); - throw new Error("Response validation failed"); - } + // 验证响应格式 + const validationResult = OptimizeCodeOutputSchema.safeParse(llmResponseJson); + if (!validationResult.success) { + console.error("Zod validation failed:", validationResult.error.format()); + throw new Error("Response validation failed"); + } - console.log("LLM response:", llmResponseJson); - return validationResult.data; -}; \ No newline at end of file + console.log("LLM response:", llmResponseJson); + return validationResult.data; +}; diff --git a/src/app/actions/ai-testcase.ts b/src/app/actions/ai-testcase.ts index 5bdabc6..ddb6d4c 100644 --- a/src/app/actions/ai-testcase.ts +++ b/src/app/actions/ai-testcase.ts @@ -1,83 +1,91 @@ "use server"; -import {AITestCaseInput, AITestCaseOutput, AITestCaseOutputSchema} from "@/types/ai-testcase"; +import { + AITestCaseInput, + AITestCaseOutput, + AITestCaseOutputSchema, +} from "@/types/ai-testcase"; import { deepseek } from "@/lib/ai"; import { CoreMessage, generateText } from "ai"; import prisma from "@/lib/prisma"; - /** * * @param input * @returns */ export const generateAITestcase = async ( - input: AITestCaseInput + input: AITestCaseInput ): Promise => { - const model = deepseek("deepseek-chat"); + const model = deepseek("deepseek-chat"); - let problemDetails = ""; + let problemDetails = ""; - if (input.problemId) { - try { - // 尝试获取英文描述 - const problemLocalizationEn = await prisma.problemLocalization.findUnique({ - where: { - problemId_locale_type: { - problemId: input.problemId, - locale: "en", - type: "DESCRIPTION", - }, - }, - include: { - problem: true, - }, - }); + if (input.problemId) { + try { + // 尝试获取英文描述 + const problemLocalizationEn = await prisma.problemLocalization.findUnique( + { + where: { + problemId_locale_type: { + problemId: input.problemId, + locale: "en", + type: "DESCRIPTION", + }, + }, + include: { + problem: true, + }, + } + ); - if (problemLocalizationEn) { - problemDetails = ` + if (problemLocalizationEn) { + problemDetails = ` Problem Requirements: ------------------- Description: ${problemLocalizationEn.content} `; - } else { - // 回退到中文描述 - const problemLocalizationZh = await prisma.problemLocalization.findUnique({ - where: { - problemId_locale_type: { - problemId: input.problemId, - locale: "zh", - type: "DESCRIPTION", - }, - }, - include: { - problem: true, - }, - }); + } else { + // 回退到中文描述 + const problemLocalizationZh = + await prisma.problemLocalization.findUnique({ + where: { + problemId_locale_type: { + problemId: input.problemId, + locale: "zh", + type: "DESCRIPTION", + }, + }, + include: { + problem: true, + }, + }); - if (problemLocalizationZh) { - problemDetails = ` + if (problemLocalizationZh) { + problemDetails = ` Problem Requirements: ------------------- Description: ${problemLocalizationZh.content} `; - console.warn(`Fallback to Chinese description for problemId: ${input.problemId}`); - } else { - problemDetails = "Problem description not found in any language."; - console.warn(`No description found for problemId: ${input.problemId}`); - } - } - } catch (error) { - console.error("Failed to fetch problem details:", error); - problemDetails = "Error fetching problem description."; + console.warn( + `Fallback to Chinese description for problemId: ${input.problemId}` + ); + } else { + problemDetails = "Problem description not found in any language."; + console.warn( + `No description found for problemId: ${input.problemId}` + ); } + } + } catch (error) { + console.error("Failed to fetch problem details:", error); + problemDetails = "Error fetching problem description."; } + } - - - // 构建AI提示词 - const prompt = ` + // 构建AI提示词 + const prompt = ` Analyze the problem statement to get the expected input structure, constraints, and output logic. Generate **novel, randomized** inputs/outputs that strictly adhere to the problem's requirements. Focus on: Your entire response/output is going to consist of a single JSON object {}, and you will NOT wrap it within JSON Markdown markers. @@ -111,40 +119,37 @@ Respond **ONLY** with this JSON structure. `; - // 发送请求给OpenAI - const messages: CoreMessage[] = [{ role: "user", content: prompt }]; - let text; - try { - const response = await generateText({ - model: model, - messages: messages, - }); - text = response.text; - } catch (error) { - console.error("Error generating text with OpenAI:", error); - throw new Error("Failed to generate response from OpenAI"); - } + // 发送请求给OpenAI + const messages: CoreMessage[] = [{ role: "user", content: prompt }]; + let text; + try { + const response = await generateText({ + model: model, + messages: messages, + }); + text = response.text; + } catch (error) { + console.error("Error generating text with OpenAI:", error); + throw new Error("Failed to generate response from OpenAI"); + } - // 解析LLM响应 - let llmResponseJson; - try { - llmResponseJson = JSON.parse(text) + // 解析LLM响应 + let llmResponseJson; + try { + llmResponseJson = JSON.parse(text); + } catch (error) { + console.error("Failed to parse LLM response as JSON:", error); + console.error("LLM raw output:", text); + throw new Error("Invalid JSON response from LLM"); + } + // 验证响应格式 + const validationResult = AITestCaseOutputSchema.safeParse(llmResponseJson); + if (!validationResult.success) { + console.error("Zod validation failed:", validationResult.error.format()); + throw new Error("Response validation failed"); + } - } catch (error) { - console.error("Failed to parse LLM response as JSON:", error); - console.error("LLM raw output:", text); - throw new Error("Invalid JSON response from LLM"); - } - - - // 验证响应格式 - const validationResult = AITestCaseOutputSchema.safeParse(llmResponseJson); - if (!validationResult.success) { - console.error("Zod validation failed:", validationResult.error.format()); - throw new Error("Response validation failed"); - } - - console.log("LLM response:", llmResponseJson); - return validationResult.data; -}; \ No newline at end of file + console.log("LLM response:", llmResponseJson); + return validationResult.data; +}; diff --git a/src/app/actions/getProblem.ts b/src/app/actions/getProblem.ts index 223f2eb..99958c5 100644 --- a/src/app/actions/getProblem.ts +++ b/src/app/actions/getProblem.ts @@ -1,63 +1,63 @@ // app/actions/get-problem-data.ts -'use server'; +"use server"; -import prisma from '@/lib/prisma'; -import { Locale } from '@/generated/client'; -import { serialize } from 'next-mdx-remote/serialize'; +import prisma from "@/lib/prisma"; +import { Locale } from "@/generated/client"; +import { serialize } from "next-mdx-remote/serialize"; export async function getProblemData(problemId: string, locale?: string) { - const selectedLocale = locale as Locale; + const selectedLocale = locale as Locale; - const problem = await prisma.problem.findUnique({ - where: { id: problemId }, - include: { - templates: true, - testcases: { - include: { inputs: true } - }, - localizations: { - where: { - locale: selectedLocale, - }, - }, + const problem = await prisma.problem.findUnique({ + where: { id: problemId }, + include: { + templates: true, + testcases: { + include: { inputs: true }, + }, + localizations: { + where: { + locale: selectedLocale, }, - }); + }, + }, + }); - if (!problem) { - throw new Error('Problem not found'); - } + if (!problem) { + throw new Error("Problem not found"); + } - const getContent = (type: string) => - problem.localizations.find(loc => loc.type === type)?.content || ''; + const getContent = (type: string) => + problem.localizations.find((loc) => loc.type === type)?.content || ""; - const rawDescription = getContent('DESCRIPTION'); + const rawDescription = getContent("DESCRIPTION"); - const mdxDescription = await serialize(rawDescription, { - parseFrontmatter: false, - }); + const mdxDescription = await serialize(rawDescription, { + parseFrontmatter: false, + }); - return { - id: problem.id, - displayId: problem.displayId, - difficulty: problem.difficulty, - isPublished: problem.isPublished, - timeLimit: problem.timeLimit, - memoryLimit: problem.memoryLimit, - title: getContent('TITLE'), - description: rawDescription, - mdxDescription, - solution: getContent('SOLUTION'), - templates: problem.templates.map(t => ({ - language: t.language, - content: t.content, - })), - testcases: problem.testcases.map(tc => ({ - id: tc.id, - expectedOutput: tc.expectedOutput, - inputs: tc.inputs.map(input => ({ - name: input.name, - value: input.value, - })), - })), - }; + return { + id: problem.id, + displayId: problem.displayId, + difficulty: problem.difficulty, + isPublished: problem.isPublished, + timeLimit: problem.timeLimit, + memoryLimit: problem.memoryLimit, + title: getContent("TITLE"), + description: rawDescription, + mdxDescription, + solution: getContent("SOLUTION"), + templates: problem.templates.map((t) => ({ + language: t.language, + content: t.content, + })), + testcases: problem.testcases.map((tc) => ({ + id: tc.id, + expectedOutput: tc.expectedOutput, + inputs: tc.inputs.map((input) => ({ + name: input.name, + value: input.value, + })), + })), + }; } diff --git a/src/app/actions/getProblemLocales.ts b/src/app/actions/getProblemLocales.ts index c2c2c26..57d8a46 100644 --- a/src/app/actions/getProblemLocales.ts +++ b/src/app/actions/getProblemLocales.ts @@ -1,14 +1,14 @@ // src/app/actions/getProblemLocales.ts -'use server'; +"use server"; import prisma from "@/lib/prisma"; export async function getProblemLocales(problemId: string): Promise { - const locales = await prisma.problemLocalization.findMany({ - where: { problemId }, - select: { locale: true }, - distinct: ['locale'], - }); + const locales = await prisma.problemLocalization.findMany({ + where: { problemId }, + select: { locale: true }, + distinct: ["locale"], + }); - return locales.map(l => l.locale); + return locales.map((l) => l.locale); } diff --git a/src/components/ai-optimized-editor.tsx b/src/components/ai-optimized-editor.tsx index 68b082d..adfd522 100644 --- a/src/components/ai-optimized-editor.tsx +++ b/src/components/ai-optimized-editor.tsx @@ -19,24 +19,27 @@ interface AIEditorWrapperProps { } export const AIEditorWrapper = ({ - language, - value, - path, - problemId, - languageServerConfigs, - onChange, - // className, - }: AIEditorWrapperProps) => { + language, + value, + path, + problemId, + languageServerConfigs, + onChange, +}: // className, +AIEditorWrapperProps) => { const [currentCode, setCurrentCode] = useState(value ?? ""); const [optimizedCode, setOptimizedCode] = useState(""); const [isOptimizing, setIsOptimizing] = useState(false); const [error, setError] = useState(null); const [showDiff, setShowDiff] = useState(false); - const handleCodeChange = useCallback((val: string) => { - setCurrentCode(val); - onChange?.(val); - }, [onChange]); + const handleCodeChange = useCallback( + (val: string) => { + setCurrentCode(val); + onChange?.(val); + }, + [onChange] + ); const handleOptimize = useCallback(async () => { if (!problemId || !currentCode) return; @@ -66,59 +69,59 @@ export const AIEditorWrapper = ({ }, [optimizedCode, onChange]); return ( -
-
- +
+
+ - {showDiff && ( -
- - -
- )} -
- - {error && ( -
{error}
+ {showDiff && ( +
+ + +
)} - -
- {showDiff ? ( - - ) : ( - - )} -
+ + {error && ( +
{error}
+ )} + +
+ {showDiff ? ( + + ) : ( + + )} +
+
); }; diff --git a/src/components/creater/edit-code-panel.tsx b/src/components/creater/edit-code-panel.tsx index 8b73b59..b151d54 100644 --- a/src/components/creater/edit-code-panel.tsx +++ b/src/components/creater/edit-code-panel.tsx @@ -1,14 +1,14 @@ -"use client" +"use client"; -import React, { useEffect, useState } from 'react'; -import { getProblemData } from '@/app/actions/getProblem'; -import { updateProblemTemplate } from '@/components/creater/problem-maintain'; -import { Label } from '@/components/ui/label'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { CoreEditor } from '@/components/core-editor'; -import { Language } from '@/generated/client'; -import { toast } from 'sonner'; +import React, { useEffect, useState } from "react"; +import { getProblemData } from "@/app/actions/getProblem"; +import { updateProblemTemplate } from "@/components/creater/problem-maintain"; +import { Label } from "@/components/ui/label"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { CoreEditor } from "@/components/core-editor"; +import { Language } from "@/generated/client"; +import { toast } from "sonner"; interface Template { language: string; @@ -21,7 +21,7 @@ interface EditCodePanelProps { export default function EditCodePanel({ problemId }: EditCodePanelProps) { const [codeTemplate, setCodeTemplate] = useState