feat(problem-editor): add hydration state for better rehydration handling

This commit is contained in:
cfngc4594 2025-03-20 14:40:09 +08:00
parent 7a29d751d3
commit 9814358637

View File

@ -13,6 +13,7 @@ import { DEFAULT_EDITOR_LANGUAGE } from "@/config/editor-language";
import { createContext, PropsWithChildren, useContext, useState } from "react"; import { createContext, PropsWithChildren, useContext, useState } from "react";
type ProblemEditorState = { type ProblemEditorState = {
hydrated: boolean;
editor: editor.IStandaloneCodeEditor | null; editor: editor.IStandaloneCodeEditor | null;
globalLang: EditorLanguage; globalLang: EditorLanguage;
currentLang: EditorLanguage; currentLang: EditorLanguage;
@ -24,6 +25,7 @@ type ProblemEditorState = {
}; };
type ProblemEditorActions = { type ProblemEditorActions = {
setHydrated: (value: boolean) => void;
setEditor: (editor: editor.IStandaloneCodeEditor) => void; setEditor: (editor: editor.IStandaloneCodeEditor) => void;
setGlobalLang: (lang: EditorLanguage) => void; setGlobalLang: (lang: EditorLanguage) => void;
setCurrentLang: (lang: EditorLanguage) => void; setCurrentLang: (lang: EditorLanguage) => void;
@ -52,6 +54,7 @@ export function ProblemEditorProvider({
createStore<ProblemEditorStore>()( createStore<ProblemEditorStore>()(
persist( persist(
(set) => ({ (set) => ({
hydrated: false,
editor: null, editor: null,
globalLang: DEFAULT_EDITOR_LANGUAGE, globalLang: DEFAULT_EDITOR_LANGUAGE,
currentLang: DEFAULT_EDITOR_LANGUAGE, currentLang: DEFAULT_EDITOR_LANGUAGE,
@ -60,6 +63,7 @@ export function ProblemEditorProvider({
templates, templates,
editorLanguageConfigs, editorLanguageConfigs,
languageServerConfigs, languageServerConfigs,
setHydrated: (value) => set({ hydrated: value }),
setEditor: (editor) => set({ editor }), setEditor: (editor) => set({ editor }),
setGlobalLang: (lang) => set({ globalLang: lang }), setGlobalLang: (lang) => set({ globalLang: lang }),
setCurrentLang: (lang) => set({ currentLang: lang }), setCurrentLang: (lang) => set({ currentLang: lang }),
@ -71,6 +75,15 @@ export function ProblemEditorProvider({
partialize: (state) => ({ partialize: (state) => ({
globalLang: state.globalLang, globalLang: state.globalLang,
}), }),
onRehydrateStorage: () => {
return (state, error) => {
if (error) {
console.error("An error happened during hydration", error);
} else if (state) {
state.setHydrated(true);
}
};
},
} }
) )
) )