Skip to content

finding: AppShellBranding.logo 无任何读取方,注释「passed to sidebar/navbar via context」是假的(AppShell 不提供该 context) #4818

Description

@yinlianghui

发现于 #4793 的实施,回传立单。未认领。observation-class:今天没有用户会撞上,因为真正渲染 logo 的是另一条路径(见下),所以打 finding 标、不挂 pm:queue,严重度交 PM 分诊。

事实(基线 d44279598 实测)

packages/layout/src/AppShell.tsx:12-23 声明:

exportinterfaceAppShellBranding{primaryColor?: string;accentColor?: string;favicon?: string;/** Logo URL — passed to sidebar/navbar via context */logo?: string;title?: string;}

useAppShellBranding(:122-231)是唯一消费 AppShellBranding 的地方,它实际读的只有 primaryColor / accentColor / favicon / title —— 连 effect 的依赖数组(:230)都写成 [branding?.primaryColor, branding?.accentColor, branding?.favicon, title],logo 不在其中。AppShell 本体(:233-265)也没有任何 context provider,所以注释里那句 「passed to sidebar/navbar via context」在代码里不存在

且已经有调用方在喂它:apps/console/src/hooks/useBranding.ts:27 明确传了 logo: app.branding.logouseAppShellBranding —— 那个值今天被静默丢弃。

为什么说「今天没人撞上」

侧栏里那个 logo 确实会显示,但它走的是另一条完全独立的路:packages/app-shell/src/layout/AppSidebar.tsx:194 直接从 app schema 读 activeApp?.branding?.logo,不经过 AppShellBranding。所以现象上「logo 正常」,坏掉的只是 AppShellBranding.logo 这个声明面和它的注释 —— 典型的 declared-but-unenforced 漂移。

可选修法(不预设,两条都不是本单要做的)

  1. (ADR-0049 enforce-or-remove 的 remove 侧):AppShellBranding 去掉 logo,顺带清掉 useBranding.ts:27 那行喂值;真实入口是 app schema 的 branding.logo
  2. 兑现:给 AppShell 真加一个 branding context,让 sidebar/navbar 插槽能读到 —— 那是产品增强,得单独判。

无论走哪条,那行注释都必须跟着改:它现在描述的是一个不存在的机制,比缺注释更坏。

参考


Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions