Files
moreminimore-vibe/e2e-tests/chat_input.spec.ts
Mohamed Aziz Mejri 582793eba0 Disable send button while approval is pending (#1368)
Fixes #912 

This PR implements disabling send button while approval is pending and
addresses issue #912
    
<!-- This is an auto-generated description by cubic. -->
---

## Summary by cubic
Disable the chat send button while a proposal is awaiting approval, and
re-enable it after approve or reject. Prevents accidental messages
during pending changes. Addresses issue #912.

- **New Features**
- Track pending changes with isChangesPending based on the last
assistant message’s approvalState.
- Disable the send button when a proposal is pending (in addition to the
existing empty input check).
- Re-enable after approve/reject by refreshing the proposal and
messages.
  - Added Playwright e2e tests for both approve and reject flows.

<!-- End of auto-generated description by cubic. -->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Disable the chat send button when a code proposal is pending approval
and re-enable after approve/reject; add e2e coverage and update MCP
flow.
> 
> - **Frontend**
> - `ChatInput.tsx`: Read `messages` from `chatMessagesAtom` and derive
`disableSendButton` when the last assistant message (matching
`proposal.messageId`) has no `approvalState` and `proposal.type ===
"code-proposal"`.
> - Apply `disableSendButton` to the send button’s `disabled` condition
(in addition to empty input/attachments).
>   - Ensure proposal/messages refresh after approve/reject.
> - **Tests**
> - Add Playwright tests `e2e-tests/chat_input.spec.ts` to verify send
button disabled during pending proposal and re-enabled after approve or
reject.
> - Update `e2e-tests/mcp.spec.ts` to click "Approve" after granting
consent.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b9b47bd6f547449cc5cf1d39a00e4e7fb5de1bcd. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Will Chen <willchen90@gmail.com>
2025-09-29 16:19:49 -07:00

51 lines
1.7 KiB
TypeScript

import { test } from "./helpers/test_helper";
import { expect } from "@playwright/test";
test("send button disabled during pending proposal", async ({ po }) => {
await po.setUp();
// Send a prompt that generates a proposal
await po.sendPrompt("Create a simple React component");
// Wait for proposal buttons to appear (ensuring proposal is rendered)
await expect(po.page.getByTestId("approve-proposal-button")).toBeVisible();
// Type something in the input to ensure it's not disabled due to empty input
await po.getChatInput().fill("test message");
// Check send button is disabled due to pending changes
const sendButton = po.page.getByRole("button", { name: "Send message" });
await expect(sendButton).toBeDisabled();
// Approve the proposal
await po.approveProposal();
// Check send button is enabled again
await expect(sendButton).toBeEnabled();
});
test("send button disabled during pending proposal - reject", async ({
po,
}) => {
await po.setUp();
// Send a prompt that generates a proposal
await po.sendPrompt("Create a simple React component");
// Wait for proposal buttons to appear (ensuring proposal is rendered)
await expect(po.page.getByTestId("reject-proposal-button")).toBeVisible();
// Type something in the input to ensure it's not disabled due to empty input
await po.getChatInput().fill("test message");
// Check send button is disabled due to pending changes
const sendButton = po.page.getByRole("button", { name: "Send message" });
await expect(sendButton).toBeDisabled();
// Reject the proposal
await po.rejectProposal();
// Check send button is enabled again
await expect(sendButton).toBeEnabled();
});