Skip to content

面板:引导请求在飞时关掉侧边栏标签页,结果与忙碌状态无处显示 #558

Closed

Description

@modusensus

从 PR #556 的评审里分出来的一条已知缺口,不进那个 PR 的改动范围,单独跟踪。

现象

面板「⋯ → 从目录引导」的请求在飞时,如果用户关掉整个 better-sidebar 标签页(不是切视图、也不是关记忆库弹层——那两条已经拦住了),MemoryExplorer 与 BootstrapDialog 会随标签页体一起卸载:

  • 请求仍然会跑完,行也照样落库;
  • 但成功/失败提示没有地方显示;
  • 重开标签页时忙碌状态已丢,用户可以再提交一次。

已核过的事实

  • 关 tab 确实卸载 body:better-sidebar 的 closeTab(src/client/state.ts:340)从 pane 的 tabs 里删项;它自己的设计文档 docs/plans/2026-09-25-native-tab-state-retention-keepmounted.md 写明「记录的寿命只由『原生 tab 关闭』与『会话消失』回收」。keepMounted 覆盖隐藏与切 tab,不含关闭。
  • 不是 React 元素身份的问题:component: () => h(MemoryExplorer, { t }) 每次新建的是 element;React 按 type 复用实例,父级重渲染只 update、不 remount。所以「重开后状态丢失」的成因是卸载,不是元素每次新建。

为什么危害有限(所以本轮没修)

  1. 不会写坏数据:�ootstrapFromDirectory 走 saveWithDedupe 的 (type, title, scope) 三元组去重 + _overwrite 刷新,同一目录跑两次得到同一批行。
  2. 结果不会丢:行已落库,重开面板时搜索 effect 在挂载时跑一遍,新行就在列表里。
  3. 失败提示会再出现:用户下次提交会撞上同一个错误并看到它。

要修的话方向是明确的

把 in-flight 状态与结果搬到标签页体之外(模块级 pub/sub,lib/client.js 里 overlayListeners / setOverlayOpen 就是现成形状),标签页重开时恢复;或者退一步:只在结果到达时用一个宿主级 toast。代价是为一条「用户主动关掉面板」的罕见路径引入常驻状态与清理责任。

不做

不改 better-sidebar 的行为(keepMounted 不含关闭是它的既定契约),也不把这条塞回已经改了五轮评审的 PR #556。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions