|
|
@@ -315,17 +315,48 @@ interface ConversationRow {
|
|
|
@case ('empty') {
|
|
|
@if (!chat.currentSession()) {
|
|
|
<!--
|
|
|
- 还没有任何会话(2026-11-01 用户裁决):
|
|
|
- 不再凭空创建「临时会话」,提示用户先新建对话再开始。
|
|
|
+ 两种「没有当前会话」的情形,提示词必须分开(2026-11-01):
|
|
|
+
|
|
|
+ ① 待建态(用户刚点「新建对话」选了容器,还没发第一条消息)
|
|
|
+ → 这是**正常的输入状态**,右侧应显示欢迎区 + 可用输入框,
|
|
|
+ 而不是再让用户点一次「新建对话」(那是个死循环)。
|
|
|
+
|
|
|
+ ② 该容器确实一条会话都没有、也不是待建态
|
|
|
+ → 才提示「还没有对话 / 点击左侧新建」。
|
|
|
-->
|
|
|
- <div class="no-session">
|
|
|
- <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" size="sm" (click)="requestNewSession()">
|
|
|
- 新建对话
|
|
|
- </ui-button>
|
|
|
- </div>
|
|
|
+ @if (chat.pendingNewSession()) {
|
|
|
+ <div class="welcome">
|
|
|
+ <div class="welcome-inner">
|
|
|
+ <ui-avatar [icon]="'fa-solid fa-robot'" [size]="'lg'" />
|
|
|
+ <h2 class="welcome-title">
|
|
|
+ {{ greeting() }},我是 {{ chat.agent()?.name ?? '你的数字生命' }}
|
|
|
+ </h2>
|
|
|
+ <p class="welcome-sub">直接输入第一条消息,就会开始这段对话。</p>
|
|
|
+ <div class="suggests">
|
|
|
+ @for (s of suggests; track s.title) {
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ class="suggest"
|
|
|
+ (click)="chat.setDraft(s.text)"
|
|
|
+ >
|
|
|
+ <i class="fa-solid" [class]="s.icon" aria-hidden="true"></i>
|
|
|
+ <span class="suggest-title">{{ s.title }}</span>
|
|
|
+ <span class="suggest-text">{{ s.text }}</span>
|
|
|
+ </button>
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ } @else {
|
|
|
+ <div class="no-session">
|
|
|
+ <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" size="sm" (click)="requestNewSession()">
|
|
|
+ 新建对话
|
|
|
+ </ui-button>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
} @else {
|
|
|
<!--
|
|
|
空会话欢迎区(2026-10-29,参考 ChatGPT 落地页):
|
|
|
@@ -423,7 +454,7 @@ interface ConversationRow {
|
|
|
空态只保留说明 + 「新建对话」按钮,入口唯一。
|
|
|
例外:state 是 'ready'/'empty' 但有 currentSession(正常会话)→ 正常显示。
|
|
|
-->
|
|
|
- @if (chat.currentSession()) {
|
|
|
+ @if (chat.currentSession() || chat.pendingNewSession()) {
|
|
|
<div class="composer-hold">
|
|
|
<!--
|
|
|
暂存附件条:选文件后**先停在这里**,点发送才真正上传+发送。
|
|
|
@@ -2377,6 +2408,25 @@ export class DkChatPage {
|
|
|
if (list.length === 0) return;
|
|
|
void this.artifactSync.syncPending(list);
|
|
|
});
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 待建态建出会话后,把 URL 从 /chat/:id/new 换成真实会话地址(2026-11-01)。
|
|
|
+ *
|
|
|
+ * 🔴 不换的话 URL 一直停在 `new`:刷新页面会重新进入待建态,
|
|
|
+ * 用户看到刚发的会话「不见了」;分享/回退也会回到空白新建页。
|
|
|
+ * 这里用 replaceUrl,不产生历史记录堆积。
|
|
|
+ */
|
|
|
+ effect(() => {
|
|
|
+ const sid = this.chat.sessionId();
|
|
|
+ const aid = this.chat.agentId();
|
|
|
+ if (!sid || !aid) return;
|
|
|
+ // 只在当前路由仍是待建态的 `new` 时替换,正常切会话不干预
|
|
|
+ if (!this.router.url.includes(`/chat/${aid}/new`)) return;
|
|
|
+ void this.router.navigateByUrl(
|
|
|
+ `/${this.device.mode()}/chat/${aid}/${encodeURIComponent(sid)}`,
|
|
|
+ { replaceUrl: true },
|
|
|
+ );
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
private async onRouteChange(id: string | null, sessionId: string | null): Promise<void> {
|