feat(problem-store): add submissions to problem store state and provider

- Added `submissions` field to `ProblemState` and `ProblemStore` type
- Updated `createProblemStore` function to handle `submissions`
- Modified `ProblemStoreProvider` to pass `submissions` as a prop
- Updated `ProblemLayout` to fetch `submissions` from the database and pass to the provider
This commit is contained in:
cfngc4594 2025-04-11 17:42:52 +08:00
parent ad43eb9b0a
commit 82b0705bdb
3 changed files with 11 additions and 1 deletions

View File

@ -14,7 +14,7 @@ export default async function ProblemLayout({
}: ProblemProps) { }: ProblemProps) {
const { id } = await params; const { id } = await params;
const [problem, editorLanguageConfigs, languageServerConfigs] = await Promise.all([ const [problem, editorLanguageConfigs, languageServerConfigs, submissions] = await Promise.all([
prisma.problem.findUnique({ prisma.problem.findUnique({
where: { id }, where: { id },
include: { include: {
@ -28,6 +28,9 @@ export default async function ProblemLayout({
}), }),
prisma.editorLanguageConfig.findMany(), prisma.editorLanguageConfig.findMany(),
prisma.languageServerConfig.findMany(), prisma.languageServerConfig.findMany(),
prisma.submission.findMany({
where: { problemId: id },
})
]); ]);
if (!problem) { if (!problem) {
@ -41,6 +44,7 @@ export default async function ProblemLayout({
problem={problem} problem={problem}
editorLanguageConfigs={editorLanguageConfigs} editorLanguageConfigs={editorLanguageConfigs}
languageServerConfigs={languageServerConfigs} languageServerConfigs={languageServerConfigs}
submissions={submissions}
> >
<PlaygroundHeader /> <PlaygroundHeader />
<main className="flex flex-grow overflow-y-hidden p-2.5 pt-0"> <main className="flex flex-grow overflow-y-hidden p-2.5 pt-0">

View File

@ -2,6 +2,7 @@
import { import {
EditorLanguage, EditorLanguage,
type Submission,
type EditorLanguageConfig, type EditorLanguageConfig,
type LanguageServerConfig, type LanguageServerConfig,
} from "@/generated/client"; } from "@/generated/client";
@ -20,6 +21,7 @@ export interface ProblemStoreProviderProps {
problem: ProblemWithDetails; problem: ProblemWithDetails;
editorLanguageConfigs: EditorLanguageConfig[]; editorLanguageConfigs: EditorLanguageConfig[];
languageServerConfigs: LanguageServerConfig[]; languageServerConfigs: LanguageServerConfig[];
submissions: Submission[];
} }
export const ProblemStoreProvider = ({ export const ProblemStoreProvider = ({
@ -28,6 +30,7 @@ export const ProblemStoreProvider = ({
problem, problem,
editorLanguageConfigs, editorLanguageConfigs,
languageServerConfigs, languageServerConfigs,
submissions,
}: ProblemStoreProviderProps) => { }: ProblemStoreProviderProps) => {
const storeRef = useRef<ProblemStoreApi | null>(null); const storeRef = useRef<ProblemStoreApi | null>(null);
@ -44,6 +47,7 @@ export const ProblemStoreProvider = ({
problem, problem,
editorLanguageConfigs, editorLanguageConfigs,
languageServerConfigs, languageServerConfigs,
submissions,
}); });
} }

View File

@ -2,6 +2,7 @@ import type {
EditorLanguage, EditorLanguage,
EditorLanguageConfig, EditorLanguageConfig,
LanguageServerConfig, LanguageServerConfig,
Submission,
} 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";
@ -20,6 +21,7 @@ export type ProblemState = {
problem: ProblemWithDetails; problem: ProblemWithDetails;
editorLanguageConfigs: EditorLanguageConfig[]; editorLanguageConfigs: EditorLanguageConfig[];
languageServerConfigs: LanguageServerConfig[]; languageServerConfigs: LanguageServerConfig[];
submissions: Submission[];
}; };
export type ProblemActions = { export type ProblemActions = {