refactor(problem-store): consolidate problem data structure into ProblemWithDetails

This commit is contained in:
cfngc4594 2025-04-09 20:38:53 +08:00
parent 5698a6b81f
commit f1f2a70c0e
4 changed files with 22 additions and 43 deletions

View File

@ -14,36 +14,31 @@ export default async function ProblemLayout({
}: ProblemProps) {
const { id } = await params;
const [problemData, editorLanguageConfigs, languageServerConfigs] =
await Promise.all([
prisma.problem.findUnique({
where: { id },
include: {
templates: true,
testcases: {
include: {
data: true,
},
const [problem, editorLanguageConfigs, languageServerConfigs] = await Promise.all([
prisma.problem.findUnique({
where: { id },
include: {
templates: true,
testcases: {
include: {
data: true,
},
},
}),
prisma.editorLanguageConfig.findMany(),
prisma.languageServerConfig.findMany(),
]);
},
}),
prisma.editorLanguageConfig.findMany(),
prisma.languageServerConfig.findMany(),
]);
if (!problemData) {
if (!problem) {
return notFound();
}
const { templates, testcases, ...problemWithoutTemplates } = problemData;
return (
<div className="flex flex-col h-screen">
<ProblemStoreProvider
problemId={id}
problem={problemWithoutTemplates}
templates={templates}
testcases={testcases}
problem={problem}
editorLanguageConfigs={editorLanguageConfigs}
languageServerConfigs={languageServerConfigs}
>

View File

@ -52,15 +52,14 @@ export const useProblem = () => {
setCurrentValue,
problemId,
problem,
templates,
editorLanguageConfigs,
languageServerConfigs,
} = useProblemStore((state) => state);
// Get the default template for the current language from the templates list
const currentTemplate = useMemo(
() => templates.find((t) => t.language === currentLang)?.template || "",
[templates, currentLang]
() => problem.templates.find((t) => t.language === currentLang)?.template || "",
[problem.templates, currentLang]
);
const currentEditorLanguageConfig = useMemo(
@ -124,7 +123,6 @@ export const useProblem = () => {
currentValue,
problemId,
problem,
templates,
editorLanguageConfigs,
languageServerConfigs,
currentTemplate,

View File

@ -2,28 +2,22 @@
import {
EditorLanguage,
type Problem,
type EditorLanguageConfig,
type LanguageServerConfig,
type Template,
} from "@/generated/client";
import { useStore } from "zustand";
import { TestcaseWithData } from "@/types/prisma";
import { type ProblemWithDetails } from "@/types/prisma";
import { type ReactNode, createContext, useRef, useContext } from "react";
import { type ProblemStore, createProblemStore } from "@/stores/problem-store";
export type ProblemStoreApi = ReturnType<typeof createProblemStore>;
export const ProblemStoreContext = createContext<ProblemStoreApi | undefined>(
undefined
);
export const ProblemStoreContext = createContext<ProblemStoreApi | undefined>(undefined);
export interface ProblemStoreProviderProps {
children: ReactNode;
problemId: string;
problem: Problem;
templates: Template[];
testcases: TestcaseWithData;
problem: ProblemWithDetails;
editorLanguageConfigs: EditorLanguageConfig[];
languageServerConfigs: LanguageServerConfig[];
}
@ -32,8 +26,6 @@ export const ProblemStoreProvider = ({
children,
problemId,
problem,
templates,
testcases,
editorLanguageConfigs,
languageServerConfigs,
}: ProblemStoreProviderProps) => {
@ -50,8 +42,6 @@ export const ProblemStoreProvider = ({
currentValue: "",
problemId,
problem,
templates,
testcases,
editorLanguageConfigs,
languageServerConfigs,
});

View File

@ -2,12 +2,10 @@ import type {
EditorLanguage,
EditorLanguageConfig,
LanguageServerConfig,
Problem,
Template,
} from "@/generated/client";
import type { editor } from "monaco-editor";
import { createStore } from "zustand/vanilla";
import { TestcaseWithData } from "@/types/prisma";
import type { ProblemWithDetails } from "@/types/prisma";
import { createJSONStorage, persist } from "zustand/middleware";
export type ProblemState = {
@ -19,9 +17,7 @@ export type ProblemState = {
currentLang: EditorLanguage;
currentValue: string;
problemId: string;
problem: Problem;
templates: Template[];
testcases: TestcaseWithData;
problem: ProblemWithDetails;
editorLanguageConfigs: EditorLanguageConfig[];
languageServerConfigs: LanguageServerConfig[];
};