import { create } from 'zustand' import type { ViewMode, ThemeMode } from '../types/settings' import type { MarkdownEditor } from '@metona-team/metona-editor' // Module-level getter for the MetonaEditor instance // Used by OutlinePanel for heading navigation let _getEditor: (() => MarkdownEditor | null) | null = null export function setMetonaEditorGetter(fn: () => MarkdownEditor | null) { _getEditor = fn } export function getMetonaEditor(): MarkdownEditor | null { return _getEditor ? _getEditor() : null } const THEME_CYCLE: ThemeMode[] = ['light', 'dark', 'warm'] interface EditorState { viewMode: ViewMode themeMode: ThemeMode // AR-03: 外部修改检测状态,替代 DOM CustomEvent externallyModified: { filePath: string } | null // UX-02: 全局加载状态 loadingStates: Record setViewMode: (mode: ViewMode) => void setThemeMode: (mode: ThemeMode) => void cycleTheme: () => ThemeMode setExternallyModified: (info: { filePath: string } | null) => void // UX-02: 加载状态管理 setLoading: (key: string, loading: boolean) => void isLoading: (key: string) => boolean } export const useEditorStore = create((set, get) => ({ viewMode: 'editor', themeMode: 'light', externallyModified: null, loadingStates: {}, setViewMode: (mode: ViewMode) => set({ viewMode: mode }), setThemeMode: (mode: ThemeMode) => set({ themeMode: mode }), cycleTheme: () => { const current = get().themeMode const idx = THEME_CYCLE.indexOf(current) const next = THEME_CYCLE[(idx + 1) % THEME_CYCLE.length] set({ themeMode: next }) return next }, setExternallyModified: (info: { filePath: string } | null) => set({ externallyModified: info }), setLoading: (key: string, loading: boolean) => set(state => ({ loadingStates: { ...state.loadingStates, [key]: loading } })), isLoading: (key: string) => get().loadingStates[key] ?? false }))