Skip to content

observation: UnifiedSidebar 的 nav-order/pin 存储键在 home 上下文解析成「第一个 app」,|| 'home' 兜底实际不可达 #3631

Description

@yinlianghui

越界发现,记录于 #3609 / PR #3630(把 /home 的 Administration 组改由 NavigationRenderer 渲染)期间。按纪律只报不改,单独立单,未认领

观察类(observation-class):今天没有用户会碰到,是休眠代码 + 一处不可达兜底。标 finding,不入队,留给 PM 分诊定级。

实测基线:origin/main @ 8d5418e59

观察

packages/app-shell/src/layout/UnifiedSidebar.tsx

const activeApp = matchAppBySegment(apps.filter(a => a.active !== false), activeAppName || currentAppName) || activeApps[0];
…
const { applyOrder, handleReorder } = useNavOrder(activeApp?.name || 'home');

useNavOrder(appName) 把顺序存进 objectui-nav-order-${appName}。两点:

  1. || 'home' 这个兜底不可达(对结果的消费者而言)。 applyOrder/applyPins 的产物只经 processedNavigation 流向 app 分支NavigationRenderer。而 app 分支的渲染条件正是 context === 'app' && activeApp —— activeApp 为空时这条分支根本不渲染。所以凡是用到排序结果的时刻,activeApp?.name 必然有值,字面量 'home' 永远不会成为存储键。它读起来像「home 上下文有自己的一套排序」,其实没有。

  2. 真要用起来,键是错的。 home 上下文里 activeApp 会解析成 activeApps[0] —— 部署里第一个 app,而不是 home。所以一旦有人给 home 分支接上 enablePinning / enableReorder(PR fix(app-shell): /home 的 Administration 组改由 NavigationRenderer 渲染,9 个系统管理入口恢复可达 (#3609) #3630 特意没有接,理由写在调用点注释里),home 导航就会去吃那个 app 存下的 __root__ 根排序;换个 app 排到第一位,home 侧栏的顺序跟着变。

换句话说:当前是「不可达的兜底」,接通之后是「跨上下文串键」。两种状态都不对,只是前者没有症状。

为什么现在只记录

/home 的导航是内建的固定簇(Home / Documentation + 管理员的 9 项 Administration 组),不是用户可编排的元数据;要不要让它可拖排、可 pin,是独立的产品决定,不属于 #3609「把组展开」的范围。#3630 因此维持现状并把理由写进注释,避免下一个人以为是遗漏而顺手接上。

可能的方向(留给分诊)

  • 若结论是 home 导航不该可排序/可 pin:把 useNavOrder(...) 的调用挪进只有 app 分支才求值的位置,删掉误导性的 || 'home',让「app 专属」在代码里显形;
  • 若结论是可排序:存储键必须按上下文取(context === 'app' ? activeApp?.name : 'home'),而不是按 activeApp,否则就是上面第 2 条。

关联

已就关键词(useNavOrder / objectui-nav-order / UnifiedSidebar + storage key / sidebar nav order pin)搜过本仓开放 issue 与 PR,无同源单。


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions