2025-02-20 06:04:36 +00:00
|
|
|
import { create } from "zustand";
|
2025-03-01 15:19:35 +00:00
|
|
|
import { type editor } from "monaco-editor";
|
2025-03-02 05:40:33 +00:00
|
|
|
import { JudgeResult } from "@/config/judge";
|
2025-02-23 07:05:30 +00:00
|
|
|
import { CODE_EDITOR_OPTIONS } from "@/constants/option";
|
2025-02-20 06:04:36 +00:00
|
|
|
import { SupportedLanguage } from "@/constants/language";
|
2025-02-23 05:53:55 +00:00
|
|
|
import { MonacoLanguageClient } from "monaco-languageclient";
|
2025-03-01 15:14:29 +00:00
|
|
|
import { persist, createJSONStorage } from "zustand/middleware";
|
2025-02-26 07:57:49 +00:00
|
|
|
import { DEFAULT_EDITOR_LANGUAGE } from "@/config/editor/language";
|
2025-02-20 06:04:36 +00:00
|
|
|
|
|
|
|
interface CodeEditorState {
|
2025-03-01 15:19:35 +00:00
|
|
|
editor: editor.IStandaloneCodeEditor | null;
|
2025-02-20 06:04:36 +00:00
|
|
|
language: SupportedLanguage;
|
2025-02-23 05:53:55 +00:00
|
|
|
languageClient: MonacoLanguageClient | null;
|
2025-02-26 07:57:49 +00:00
|
|
|
loading: boolean;
|
2025-03-02 05:40:33 +00:00
|
|
|
result: JudgeResult | null;
|
2025-03-01 15:19:35 +00:00
|
|
|
setEditor: (editor: editor.IStandaloneCodeEditor | null) => void;
|
2025-02-20 06:04:36 +00:00
|
|
|
setLanguage: (language: SupportedLanguage) => void;
|
2025-02-23 05:53:55 +00:00
|
|
|
setLanguageClient: (languageClient: MonacoLanguageClient | null) => void;
|
2025-02-26 07:57:49 +00:00
|
|
|
setLoading: (loading: boolean) => void;
|
2025-03-02 05:40:33 +00:00
|
|
|
setResult: (result: JudgeResult) => void;
|
2025-02-20 06:04:36 +00:00
|
|
|
}
|
|
|
|
|
2025-03-01 15:14:29 +00:00
|
|
|
export const useCodeEditorState = create<CodeEditorState>()(
|
|
|
|
persist(
|
|
|
|
(set) => ({
|
|
|
|
editor: null,
|
|
|
|
language: DEFAULT_EDITOR_LANGUAGE,
|
|
|
|
languageClient: null,
|
|
|
|
loading: true,
|
|
|
|
result: null,
|
|
|
|
setEditor: (editor) => set({ editor }),
|
|
|
|
setLanguage: (language) => set({ language }),
|
|
|
|
setLanguageClient: (languageClient) => set({ languageClient }),
|
|
|
|
setLoading: (loading) => set({ loading }),
|
|
|
|
setResult: (result) => set({ result }),
|
|
|
|
}),
|
|
|
|
{
|
|
|
|
name: "code-editor-language",
|
|
|
|
storage: createJSONStorage(() => localStorage),
|
|
|
|
partialize: (state) => ({ language: state.language }),
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
2025-02-23 06:22:16 +00:00
|
|
|
|
2025-03-01 15:19:35 +00:00
|
|
|
export const useCodeEditorOption = create<editor.IEditorConstructionOptions>((set) => ({
|
2025-02-23 06:22:16 +00:00
|
|
|
fontSize: CODE_EDITOR_OPTIONS.fontSize,
|
|
|
|
lineHeight: CODE_EDITOR_OPTIONS.lineHeight,
|
|
|
|
setFontSize: (fontSize: number) => set({ fontSize }),
|
2025-02-24 05:17:16 +00:00
|
|
|
setLineHeight: (lineHeight: number) => set({ lineHeight }),
|
|
|
|
}));
|
2025-02-26 07:57:49 +00:00
|
|
|
|
|
|
|
async function initializeEditor() {
|
|
|
|
useCodeEditorState.getState().setLoading(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
initializeEditor();
|