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

View File

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

View File

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

View File

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