feat(chat): 引入 @ant-design/x 组件 — Sender/Conversations/XMarkdown 替代手动拼装

- ConfigProvider → XProvider(ConsoleShell + test-utils)
- ChatSidebar → Conversations(menu dropdown + MoreOutlined trigger)
- ChatInputArea → Sender(footer 左右排版 + 模型 Select + 自动清空)
- Streamdown → XMarkdown(streaming hasNextChunk 映射 AI SDK 状态)
- CSS 清理 ~94 行废弃样式,新增统一布局规则
- 删除 streamdown 依赖
This commit is contained in:
2026-06-02 18:31:31 +08:00
parent 9c9afbd108
commit 26ecaadb26
13 changed files with 289 additions and 561 deletions

View File

@@ -51,8 +51,8 @@ void mock.module("ai", () => ({
},
}));
function getSendButton() {
return screen.getByRole("button", { name: /发.*送/ });
function getSenderTextarea() {
return screen.getByPlaceholderText("输入消息...");
}
function setupFetchMock() {
@@ -90,8 +90,7 @@ describe("ChatPanel", () => {
expect(screen.getByText("你好,我是阿福")).toBeTruthy();
expect(screen.getByText("有什么我可以帮助你的吗?")).toBeTruthy();
expect(screen.getByPlaceholderText("输入消息...")).toBeTruthy();
expect(getSendButton()).toBeTruthy();
expect(getSenderTextarea()).toBeTruthy();
});
});
@@ -108,9 +107,9 @@ describe("ChatPanel", () => {
}),
);
const input = screen.getByPlaceholderText("输入消息...");
fireEvent.change(input, { target: { value: "你好" } });
fireEvent.click(getSendButton());
const textarea = getSenderTextarea();
fireEvent.change(textarea, { target: { value: "你好" } });
fireEvent.keyDown(textarea, { key: "Enter" });
await waitFor(() => {
expect(onCreated).toHaveBeenCalledWith("conv-new");
@@ -139,12 +138,12 @@ describe("ChatPanel", () => {
}),
);
const input = screen.getByPlaceholderText("输入消息...");
fireEvent.change(input, { target: { value: "测试输入" } });
fireEvent.click(getSendButton());
const textarea = getSenderTextarea();
fireEvent.change(textarea, { target: { value: "测试输入" } });
fireEvent.keyDown(textarea, { key: "Enter" });
await waitFor(() => {
expect((input as HTMLTextAreaElement).value).toBe("测试输入");
expect((textarea as HTMLTextAreaElement).value).toBe("测试输入");
});
});
});
@@ -161,7 +160,7 @@ describe("ChatPanel", () => {
);
expect(screen.queryByText("你好,我是阿福")).toBeNull();
expect(screen.getByPlaceholderText("输入消息...")).toBeTruthy();
expect(getSenderTextarea()).toBeTruthy();
});
});
});