Bladeren bron

feat(chat): 登录落地态改为「新建对话」引导页

登录后进入 /desktop/chat 时,右侧原本是「选择一个会话」的纯空态,
没有任何可点动作;且 onRouteChange 在无容器分支会自动打开
conversations()[0] 并 replaceUrl —— 用户没选容器就被带进某条对话。

- 无容器时渲染引导页:图标 + 「开始一段新对话」+ 说明 + 「新建对话」按钮,
  复用已有 .no-session 样式,新增 .landing 使整块主区垂直居中
- 删除 else 分支的自动打开首会话,无容器即停在落地页
- 新建按钮走 requestNewSession(),与左栏入口同一条链路

验证:tsc 0 错误;单测 1089/1089;冒烟 28/28;verify:ui 12/12;
截图确认落地页与点击后弹出的「选择数字生命」模态框

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct 7 uur geleden
bovenliggende
commit
2fa5eefab3
2 gewijzigde bestanden met toevoegingen van 48 en 4 verwijderingen
  1. 19 0
      docs/00-tracking/操作追踪.md
  2. 29 4
      src/app/desktop/pages/chat/chat.ts

+ 19 - 0
docs/00-tracking/操作追踪.md

@@ -3925,3 +3925,22 @@ CSS 模板字符串的注释里用反引号包标识符(如 `` `opacity: 0` ``
 (此前未配置,深链直接访问 404)。
 
 **未处理**:桶内 1000+ 个 nova-aigc 旧产物(2025-08)保留未删,仅 index.html 被覆盖。
+
+### 登录落地态改为「新建对话」引导页(2026-11-02)
+
+**原因**:登录后进入 `/desktop/chat`,右侧是「选择一个会话 / 从左侧选择数字生命开始对话」的纯空态,
+没有可点击的动作;且 `onRouteChange` 在无容器时会自动 `replaceUrl` 到第一条会话,
+用户没选容器就被带进了某条对话。
+
+**改动**(`src/app/desktop/pages/chat/chat.ts`)
+| 位置 | 改动 |
+|---|---|
+| 模板 `@if (!chat.agentId())` 分支 | 纯 `ui-empty` → 引导页:图标 + 「开始一段新对话」+ 说明 + 「新建对话」按钮,复用 `.no-session` 样式 |
+| 样式 | 新增 `.no-session.landing { flex: 1; place-content: center }`,整块主区垂直居中 |
+| `onRouteChange` 的 else 分支 | 删除「自动打开 `conversations()[0]`」—— 无容器时停在落地页 |
+
+新建按钮走 `requestNewSession()`,与左栏顶部入口同一条链路(弹「选择数字生命」模态框),
+不新增交互路径。
+
+**验证**:tsc 0 错误;构建通过;截图确认落地页与点击后模态框;
+单测 1089/1089;冒烟 28/28;verify:ui 12/12。

+ 29 - 4
src/app/desktop/pages/chat/chat.ts

@@ -146,8 +146,21 @@ interface ConversationRow {
       <!-- ===== 聊天区 ===== -->
       <section class="col main-col" aria-label="消息">
         @if (!chat.agentId()) {
-          <div class="center-fill">
-            <ui-empty title="选择一个会话" description="从左侧选择数字生命开始对话。" />
+          <!--
+            🔴 登录后的默认落地态(2026-11-02 用户要求)。
+               原来是「选择一个会话 / 从左侧选择数字生命开始对话」的纯空态 ——
+               登录后看到一个没有动作的提示,不知道下一步做什么。
+               现在是一个只含「新建对话」按钮的引导页:点它弹「选择数字生命」,
+               与左栏顶部「新建对话」入口走同一条链路(requestNewSession)。
+          -->
+          <div class="no-session landing">
+            <i class="fa-solid fa-comments" aria-hidden="true"></i>
+            <h2 class="no-session-title">开始一段新对话</h2>
+            <p class="no-session-sub">选择一个数字生命,告诉它你想做什么。</p>
+            <ui-button variant="primary" (click)="requestNewSession()">
+              <i class="fa-solid fa-plus" aria-hidden="true"></i>
+              新建对话
+            </ui-button>
           </div>
         } @else {
           <!--
@@ -1038,6 +1051,13 @@ interface ConversationRow {
         place-content: center;
       }
 
+      /* 登录落地页:整块主区垂直居中(无容器、无顶栏时的默认态) */
+      .no-session.landing {
+        flex: 1;
+        place-content: center;
+        gap: var(--sp-4);
+      }
+
       /* 会话行:与容器行缩进错开,一眼看出层级 */
       .session-row {
         display: flex;
@@ -2477,8 +2497,13 @@ export class DkChatPage {
       // 打开后内容不满一屏 → 自动补历史(懒加载的另一半)
       void this.fillViewportIfNeeded();
     } else {
-      const first = this.conversations()[0];
-      if (first) void this.openConversation(first.id, true);
+      /*
+       * 🔴 无容器时**停在落地页**,不自动进入第一条会话(2026-11-02 用户要求)。
+       *
+       * 原来这里会自动打开 `conversations()[0]` 并 replaceUrl 到
+       * `/chat/{id}` —— 登录后直接跳进某条对话,用户既没选容器也不知道自己
+       * 被带到了哪。现在落地页只放「新建对话」,进哪条由用户点。
+       */
     }
   }