From 2d83d3f143ce6916df575c324e9b8af80115c75b Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Thu, 20 Mar 2025 13:01:18 +0800 Subject: [PATCH] feat(providers): add ProblemEditorProvider context for state management --- src/providers/problem-editor-provider.tsx | 93 +++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/providers/problem-editor-provider.tsx diff --git a/src/providers/problem-editor-provider.tsx b/src/providers/problem-editor-provider.tsx new file mode 100644 index 0000000..82120fc --- /dev/null +++ b/src/providers/problem-editor-provider.tsx @@ -0,0 +1,93 @@ +"use client"; + +import type { + EditorLanguage, + EditorLanguageConfig, + LanguageServerConfig, + Template, +} from "@prisma/client"; +import { createStore, StoreApi, useStore } from "zustand"; +import { persist, createJSONStorage } from "zustand/middleware"; +import { DEFAULT_EDITOR_LANGUAGE } from "@/config/editor-language"; +import { createContext, PropsWithChildren, useContext, useState } from "react"; + +type ProblemEditorState = { + globalLang: EditorLanguage; + currentLang: EditorLanguage; + currentValue: string; + problemId: string; + templates: Template[]; + editorLanguageConfigs: EditorLanguageConfig[]; + languageServerConfigs: LanguageServerConfig[]; +}; + +type ProblemEditorActions = { + setGlobalLang: (lang: EditorLanguage) => void; + setCurrentLang: (lang: EditorLanguage) => void; + setCurrentValue: (value: string) => void; +}; + +type ProblemEditorStore = ProblemEditorState & ProblemEditorActions; + +const ProblemEditorContext = createContext | undefined>(undefined); + +type ProblemEditorProviderProps = PropsWithChildren & { + problemId: string; + templates: Template[]; + editorLanguageConfigs: EditorLanguageConfig[]; + languageServerConfigs: LanguageServerConfig[]; +}; + +export function ProblemEditorProvider({ + children, + problemId, + templates, + editorLanguageConfigs, + languageServerConfigs, +}: ProblemEditorProviderProps) { + const [store] = useState(() => + createStore()( + persist( + (set) => ({ + globalLang: DEFAULT_EDITOR_LANGUAGE, + currentLang: DEFAULT_EDITOR_LANGUAGE, + currentValue: "", + problemId, + templates, + editorLanguageConfigs, + languageServerConfigs, + setGlobalLang: (lang) => set({ globalLang: lang }), + setCurrentLang: (lang) => set({ currentLang: lang }), + setCurrentValue: (value) => set({ currentValue: value }), + }), + { + name: "problem-store", + storage: createJSONStorage(() => localStorage), + partialize: (state) => ({ + globalLang: state.globalLang, + currentLang: state.currentLang, + currentValue: state.currentValue, + }), + } + ) + ) + ); + + return {children}; +} + +export function useProblemEditorStore(selector: (state: ProblemEditorStore) => T) { + const context = useContext(ProblemEditorContext); + if (!context) { + throw new Error("ProblemEditorContext.Provider is missing."); + } + return useStore(context, selector); +} + +export function useProblemEditorStoreInstance() { + const context = useContext(ProblemEditorContext); + if (!context) { + throw new Error("ProblemEditorContext.Provider is missing."); + } + return context; +}