feat(editor): 将 Milkdown/ProseMirror 替换为 @metona-team/metona-editor v0.1.3 - 三模式视图 (edit/split/preview) 由编辑器内置工具栏切换 - searchReplace + imagePaste 预设插件 - unified/rehype 渲染管线通过 render 钩子集成 - 主题双向同步 (应用暗色模式 ↔ 编辑器主题) feat(toast): metona-toast 迁移为 @metona-team/metona-toast v2.0.1 refactor: 删除冗余组件与代码 - 移除 SourceEditor、Preview、SearchReplace、EditorToolbar、useMilkdown - 移除 StatusBar 组件及状态栏扩展架构(编辑器内置底栏替代) - 移除 useSettings、useStatusBarItem、useStatusBarItems、statusBarStore - 移除 EditMode/PreviewMode/SourceMode 图标 refactor(ui): 简化布局 - 工具栏移除模式切换按钮,新增自动保存开关 - useKeyboard 移除 Ctrl+1/2/3/B/I 快捷键 - Editor 三模式统一由 MetonaEditor 容器渲染 chore: 版本号 v0.3.13 → v0.4.0 docs: 全面更新 README/DESIGN/CONTRIBUTING/DEVSETUP
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import { useEffect, useRef } from 'react'
|
||
import { useEditorStore } from '../stores/editorStore'
|
||
import { useSidebarStore } from '../stores/sidebarStore'
|
||
import { settingsRepository } from '../db/settingsRepository'
|
||
import { logError } from '../lib/errorHandler'
|
||
|
||
/**
|
||
* AR-04: 统一设置加载 hook
|
||
* 一次性从 IndexedDB 加载所有设置,分发到各 store,
|
||
* 替代各 hook 各自独立加载设置的模式。
|
||
*/
|
||
export function useSettingsInit() {
|
||
const setDarkMode = useEditorStore(s => s.setDarkMode)
|
||
const setViewMode = useEditorStore(s => s.setViewMode)
|
||
const isInitialized = useRef(false)
|
||
|
||
useEffect(() => {
|
||
if (isInitialized.current) return
|
||
isInitialized.current = true
|
||
|
||
settingsRepository.load()
|
||
.then((settings) => {
|
||
// 主题
|
||
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
|
||
const darkMode = settings.darkMode !== undefined ? settings.darkMode : prefersDark
|
||
setDarkMode(darkMode)
|
||
document.documentElement.classList.toggle('dark', darkMode)
|
||
|
||
// 视图模式
|
||
setViewMode(settings.viewMode ?? 'editor')
|
||
|
||
// Sidebar 设置(直接分发,避免 sidebarStore 再次读取 IndexedDB)
|
||
const sidebarStore = useSidebarStore.getState()
|
||
if (!sidebarStore._loaded) {
|
||
useSidebarStore.setState({
|
||
isVisible: !settings.sidebarCollapsed,
|
||
sidebarWidth: settings.sidebarWidth,
|
||
_loaded: true
|
||
})
|
||
}
|
||
})
|
||
.catch((error: unknown) => {
|
||
logError('加载设置失败', error)
|
||
})
|
||
}, [setDarkMode, setViewMode])
|
||
|
||
return { isInitialized }
|
||
}
|