feat(webui): track optimistic message delivery status (#5162)

This commit is contained in:
chengyongru
2026-07-29 23:15:45 +08:00
committed by GitHub
parent 5a28a6165c
commit 129b74b4cf
23 changed files with 431 additions and 21 deletions
+47
View File
@@ -113,6 +113,53 @@ describe("MessageBubble", () => {
expect(screen.queryByRole("button", { name: "Fork" })).not.toBeInTheDocument();
});
it("renders failed delivery details on focus without persistent accepted chrome", async () => {
const message: UIMessage = {
id: "u-delivery",
role: "user",
content: "hello",
createdAt: Date.now(),
deliveryStatus: "sending",
};
const { rerender } = render(<MessageBubble message={message} />);
expect(screen.getByRole("status")).toHaveTextContent("Sending…");
rerender(<MessageBubble message={{ ...message, deliveryStatus: "accepted" }} />);
expect(screen.queryByRole("status")).not.toBeInTheDocument();
rerender(
<MessageBubble
message={{
...message,
deliveryStatus: "failed",
deliveryErrorKind: "message_too_big",
}}
/>,
);
expect(screen.queryByRole("status")).not.toBeInTheDocument();
const failedStatus = screen.getByRole("button", {
name: "Not sent: Message too large",
});
expect(failedStatus).toHaveClass(
"text-destructive/80",
"dark:text-red-400/80",
);
expect(screen.getByText("hello")).not.toHaveClass("ring-1");
expect(screen.getByText("hello")).not.toHaveClass("ring-destructive/30");
expect(screen.queryByRole("tooltip")).not.toBeInTheDocument();
fireEvent.focus(failedStatus);
const tooltip = await screen.findByRole("tooltip");
expect(tooltip).toHaveTextContent("Message too large");
expect(tooltip).toHaveTextContent(
"The server rejected your last message because it exceeded the size limit.",
);
expect(screen.getByRole("alert")).toHaveClass("sr-only");
});
it("styles only generated quoted context in user messages", () => {
const message: UIMessage = {
id: "u-quote",