fix: 状态镜像防冲掉——服务端按 key 合并,客户端读不到宿主就不写

This commit is contained in:
2026-11-02 23:14:04 +08:00
parent 26c7dee390
commit 8ae28b9a92
8 changed files with 115 additions and 39 deletions
+10 -3
View File
@@ -12,7 +12,7 @@ import { previewFromEvents, previewFromNodes, readSessionPreview, presetApiOf, m
import { photoStore, kindOf } from './photoStore'
import { DEFAULT_BG_SVG, b64ToBlob } from './defaultBg'
import { WAVE_BG_B64 } from './waveBg'
import { loadHostState, queueHostSave, markHydrated, flushHostSave } from './hostState'
import { loadHostState, queueHostSave, markHydrated, staysReadOnly, flushHostSave } from './hostState'
/**
* dsh-worktable 客户端(v2):侧边栏底部「工作台」区块。
@@ -1433,8 +1433,15 @@ function WorktableSection(props: any) {
useEffect(() => {
let cancelled = false
void (async () => {
const host = await loadHostState()
const res = await loadHostState()
if (cancelled) return
if (!res.reachable) {
// 读不到就不写:宁可本次只在本地,也不拿空状态覆盖宿主镜像
staysReadOnly()
console.warn('[dsh-worktable] 宿主状态暂不可读,本次会话不写镜像')
return
}
const host = res.state
let localAt = 0
try { localAt = Number(localStorage.getItem(SAVED_AT_KEY) ?? '0') || 0 } catch {}
const hostAt = typeof host?.updatedAt === 'number' ? host.updatedAt : 0
@@ -1442,7 +1449,7 @@ function WorktableSection(props: any) {
if (host.projects) persistProjects(normalizeProjects(host.projects))
if (host.view) persistView(normalizeView(host.view))
}
markHydrated()
markHydrated(host ? { projects: host.projects, view: host.view } : {})
if (hostAt <= localAt) flushHostSave()
})()
const flush = () => flushHostSave()