fix(frontend): 防止切换文件丢稿并修复主题恢复

This commit is contained in:
2026-08-30 00:14:10 +08:00
parent a7772430d5
commit 0dbd32a757
7 changed files with 44 additions and 20 deletions
+29 -9
View File
@@ -34,34 +34,54 @@ export const useEditorStore = defineStore('editor', () => {
}
let saveTimer: ReturnType<typeof setTimeout> | null = null
let pendingSave: Promise<void> | null = null
function scheduleAutoSave(delay = 1500) {
if (saveTimer) clearTimeout(saveTimer)
saveTimer = setTimeout(() => {
saveTimer = null
void save()
}, delay)
}
async function save() {
if (!currentFilePath.value) return
if (saveStatus.value === 'saving') return
if (pendingSave) return pendingSave
const targetPath = currentFilePath.value
const snapshot = content.value
saveStatus.value = 'saving'
try {
await workspaceService.saveFileContent(targetPath, snapshot)
if (currentFilePath.value === targetPath) {
saveStatus.value = content.value === snapshot ? 'saved' : 'dirty'
lastSavedAt.value = new Date().toISOString()
pendingSave = (async () => {
try {
await workspaceService.saveFileContent(targetPath, snapshot)
if (currentFilePath.value === targetPath) {
saveStatus.value = content.value === snapshot ? 'saved' : 'dirty'
lastSavedAt.value = new Date().toISOString()
}
} catch {
if (currentFilePath.value === targetPath) saveStatus.value = 'save_failed'
} finally {
pendingSave = null
}
} catch {
saveStatus.value = 'save_failed'
}
})()
return pendingSave
}
let loadVersion = 0
async function loadFile(filePath: string) {
if (currentFilePath.value === filePath) return
if (saveTimer) {
clearTimeout(saveTimer)
saveTimer = null
}
if (saveStatus.value === 'conflict') {
throw new Error('当前文件存在编辑冲突,请处理后再切换文件。')
}
if (pendingSave) await pendingSave
if (saveStatus.value === 'dirty' || saveStatus.value === 'save_failed') await save()
if (saveStatus.value === 'dirty' || saveStatus.value === 'save_failed') {
throw new Error('当前文件保存失败,已阻止切换以避免内容丢失。')
}
const version = ++loadVersion
currentFilePath.value = filePath
saveStatus.value = 'saving'
+6 -3
View File
@@ -14,6 +14,7 @@ export const useThemeStore = defineStore('theme', () => {
const fontEditorSize = ref(15)
const fontEditorFamily = ref('system-ui')
const lineHeight = ref(1.7)
let appearanceHydrated = false
const currentTheme = computed(() =>
themes.value.find((t) => t.theme_id === currentThemeId.value) || themes.value[0]
@@ -47,6 +48,8 @@ export const useThemeStore = defineStore('theme', () => {
} catch { localStorage.removeItem('editor-appearance') }
}
const saved = localStorage.getItem('theme')
appearanceHydrated = true
persistAppearance()
if (saved && themes.value.find((t) => t.theme_id === saved)) {
applyTheme(saved)
return
@@ -72,17 +75,17 @@ export const useThemeStore = defineStore('theme', () => {
watch(fontEditorSize, (v) => {
document.documentElement.style.setProperty('--font-editor-size', `${v}px`)
persistAppearance()
if (appearanceHydrated) persistAppearance()
}, { immediate: true })
watch(lineHeight, (v) => {
document.documentElement.style.setProperty('--font-editor-line-height', String(v))
persistAppearance()
if (appearanceHydrated) persistAppearance()
}, { immediate: true })
watch(fontEditorFamily, (v) => {
document.documentElement.style.setProperty('--font-editor-sans', v)
persistAppearance()
if (appearanceHydrated) persistAppearance()
}, { immediate: true })
return {