mirror of
https://github.com/massbug/judge4c.git
synced 2025-05-17 23:12:23 +00:00
refactor(problem-store): consolidate problem data structure into ProblemWithDetails
This commit is contained in:
parent
5698a6b81f
commit
f1f2a70c0e
@ -14,36 +14,31 @@ 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: {
|
templates: true,
|
||||||
templates: true,
|
testcases: {
|
||||||
testcases: {
|
include: {
|
||||||
include: {
|
data: true,
|
||||||
data: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
prisma.editorLanguageConfig.findMany(),
|
}),
|
||||||
prisma.languageServerConfig.findMany(),
|
prisma.editorLanguageConfig.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}
|
||||||
>
|
>
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
});
|
});
|
||||||
|
@ -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[];
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user