2025-03-20 05:01:18 +00:00
|
|
|
"use client";
|
|
|
|
|
2025-03-21 15:59:07 +00:00
|
|
|
import {
|
2025-03-20 05:01:18 +00:00
|
|
|
EditorLanguage,
|
2025-03-24 02:28:58 +00:00
|
|
|
type Problem,
|
2025-03-21 15:59:07 +00:00
|
|
|
type EditorLanguageConfig,
|
|
|
|
type LanguageServerConfig,
|
|
|
|
type Template,
|
2025-04-01 03:46:07 +00:00
|
|
|
} from "@/generated/client";
|
2025-03-21 15:59:07 +00:00
|
|
|
import { useStore } from "zustand";
|
|
|
|
import { type ReactNode, createContext, useRef, useContext } from "react";
|
|
|
|
import { type ProblemStore, createProblemStore } from "@/stores/problem-store";
|
2025-03-20 05:01:18 +00:00
|
|
|
|
2025-03-21 15:59:07 +00:00
|
|
|
export type ProblemStoreApi = ReturnType<typeof createProblemStore>;
|
2025-03-20 05:01:18 +00:00
|
|
|
|
2025-03-21 15:59:07 +00:00
|
|
|
export const ProblemStoreContext = createContext<ProblemStoreApi | undefined>(
|
|
|
|
undefined
|
|
|
|
);
|
2025-03-20 05:01:18 +00:00
|
|
|
|
2025-03-21 15:59:07 +00:00
|
|
|
export interface ProblemStoreProviderProps {
|
|
|
|
children: ReactNode;
|
2025-03-20 05:01:18 +00:00
|
|
|
problemId: string;
|
2025-03-24 02:28:58 +00:00
|
|
|
problem: Problem;
|
2025-03-20 05:01:18 +00:00
|
|
|
templates: Template[];
|
|
|
|
editorLanguageConfigs: EditorLanguageConfig[];
|
|
|
|
languageServerConfigs: LanguageServerConfig[];
|
2025-03-21 15:59:07 +00:00
|
|
|
}
|
2025-03-20 05:01:18 +00:00
|
|
|
|
2025-03-21 15:59:07 +00:00
|
|
|
export const ProblemStoreProvider = ({
|
2025-03-20 05:01:18 +00:00
|
|
|
children,
|
|
|
|
problemId,
|
2025-03-24 02:28:58 +00:00
|
|
|
problem,
|
2025-03-20 05:01:18 +00:00
|
|
|
templates,
|
|
|
|
editorLanguageConfigs,
|
|
|
|
languageServerConfigs,
|
2025-03-21 15:59:07 +00:00
|
|
|
}: ProblemStoreProviderProps) => {
|
|
|
|
const storeRef = useRef<ProblemStoreApi | null>(null);
|
|
|
|
|
|
|
|
if (storeRef.current === null) {
|
|
|
|
storeRef.current = createProblemStore({
|
|
|
|
hydrated: false,
|
|
|
|
editor: null,
|
2025-03-25 05:03:40 +00:00
|
|
|
markers: [],
|
2025-03-23 15:48:19 +00:00
|
|
|
webSocket: null,
|
2025-03-21 15:59:07 +00:00
|
|
|
globalLang: EditorLanguage.c,
|
|
|
|
currentLang: EditorLanguage.c,
|
|
|
|
currentValue: "",
|
|
|
|
problemId,
|
2025-03-24 02:28:58 +00:00
|
|
|
problem,
|
2025-03-21 15:59:07 +00:00
|
|
|
templates,
|
|
|
|
editorLanguageConfigs,
|
|
|
|
languageServerConfigs,
|
|
|
|
});
|
|
|
|
}
|
2025-03-20 05:01:18 +00:00
|
|
|
|
2025-03-20 06:18:15 +00:00
|
|
|
return (
|
2025-03-21 15:59:07 +00:00
|
|
|
<ProblemStoreContext.Provider value={storeRef.current}>
|
2025-03-20 06:18:15 +00:00
|
|
|
{children}
|
2025-03-21 15:59:07 +00:00
|
|
|
</ProblemStoreContext.Provider>
|
2025-03-20 06:18:15 +00:00
|
|
|
);
|
2025-03-21 15:59:07 +00:00
|
|
|
};
|
2025-03-20 05:01:18 +00:00
|
|
|
|
2025-03-21 15:59:07 +00:00
|
|
|
export const useProblemStore = <T,>(selector: (store: ProblemStore) => T): T => {
|
|
|
|
const problemStoreContext = useContext(ProblemStoreContext);
|
|
|
|
|
|
|
|
if (!problemStoreContext) {
|
|
|
|
throw new Error("useProblemStore must be used within ProblemStoreProvider");
|
2025-03-20 05:01:18 +00:00
|
|
|
}
|
2025-03-21 15:59:07 +00:00
|
|
|
|
|
|
|
return useStore(problemStoreContext, selector);
|
|
|
|
};
|