Skip to content

refactor: clarify state ownership - promote windowId to explicit lifecycle atom (phase 2)#21

Merged
lyx-tec merged 1 commit into
mainfrom
refactor/workspace-switch-phase2
Jul 16, 2026
Merged

refactor: clarify state ownership - promote windowId to explicit lifecycle atom (phase 2)#21
lyx-tec merged 1 commit into
mainfrom
refactor/workspace-switch-phase2

Conversation

@lyx-tec

@lyx-tec lyx-tec commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Summary

明确 state owner,将 window 相关状态从 GlobalModel 的普通属性 + 内联 derived atom 迁移为显式 lifecycle atoms,消除第二条隐式 workspace 派生链。Phase 2 of workspace-switch refactor.

Changes

New explicit lifecycle atoms

Atom Type Owner Set by
atoms.windowId PrimitiveAtom<string> lifecycle applyWorkspaceContext() + init value from initOpts.windowId
atoms.windowData Atom<WaveWindow> derived display derived from atoms.windowId via WOS
atoms.windowId + atoms.windowData added to GlobalAtomsType

uiContextAtom now reactive

windowid 字段由闭包捕获 initOpts.windowId 改为从 atoms.windowId 派生。当 workspace reinit 更新 windowIdAtom 时,uiContextAtom 自动反映最新值。

GlobalModel 精简

移除 windowId 字段、windowDataAtomworkspaceAtom(死代码,从未被任何组件消费)。GlobalModel 降级为仅提供 setIsActive() 工具方法。

AppInner gate 迁移

AppInner 的初始化守卫从 GlobalModel.getInstance().windowDataAtom 迁移到 atoms.windowData,与主生命周期链对齐。

架构变化

Before (两条并行派生链):
  GlobalModel.windowId (plain) → [WOS] → GlobalModel.windowDataAtom → [window.workspaceid] → GlobalModel.workspaceAtom (unused)
  applyWorkspaceContext()       → [set] → atoms.workspaceId          → [WOS] → atoms.workspace
  uiContextAtom                 → [closure] initOpts.windowId

After (单链,所有 lifecycle atom 统一显式设置):
  applyWorkspaceContext()       → [set] → atoms.windowId  → [WOS] → atoms.windowData (AppInner gate)
                                         → atoms.workspaceId → [WOS] → atoms.workspace
  uiContextAtom                 → [derive] get(atoms.windowId)

Bug Fixes

Builder 模式回归 (CR#1)

initBuilder() 路径不经过 applyWorkspaceContext()windowIdAtom 初始值设为 initOpts.windowId(而非 null),所有路径(tab/builder/preview)立即获得正确值。

Init 时序空窗 (CR#2)

atom(initOpts.windowId) 确保从 initGlobalAtoms() 完成到 applyWorkspaceContext() 被调用之间,callBackendService 等同步 RPC 调用不会发送 windowid: null

Mock preview uiContext 一致性 (CR#3)

mock 的 uiContext 从静态硬编码值改为派生 atom,订阅 windowIdAtomMock,与 production 行为一致。

测试 Note

  • 手动测试 workspace 切换
  • 手动测试 builder 模式初始化
  • 验证 mock preview 环境 uiContext 行为

@lyx-tec
lyx-tec merged commit 3a8012f into main Jul 16, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant