feat(lanes): show Add Lane auto-setup summary before closing modal

The three setup calls (profile/agents/mcp) fired after worktree
creation but their outcome was only logged to the console. Keep the
modal open with a ✓/✗ summary for a few seconds (or until dismissed)
so the user actually sees what happened, matching the original F5 design.
This commit is contained in:
2026-08-06 13:31:56 +07:00
parent 77f3805083
commit 7fa39687fe
5 changed files with 92 additions and 8 deletions
@@ -158,7 +158,8 @@ describe("AddLaneModal", () => {
expect(onAdded).toHaveBeenCalledWith(
expect.objectContaining({ id: 9, status: "provisioning" })
);
expect(onClose).toHaveBeenCalled();
// The setup summary stays on screen for a few seconds before auto-closing.
await waitFor(() => expect(onClose).toHaveBeenCalled(), { timeout: 4000 });
});
it("shows a server error and leaves the modal open instead of closing silently", async () => {
@@ -228,6 +229,31 @@ describe("AddLaneModal", () => {
await user.click(screen.getByRole("button", { name: "Add lane" }));
await waitFor(() => expect(onAdded).toHaveBeenCalled());
await waitFor(() => expect(onClose).toHaveBeenCalled(), { timeout: 4000 });
});
it("shows the setup summary and lets the user dismiss it early instead of waiting out the auto-close timer", async () => {
vi.mocked(api.lanes.branches).mockResolvedValue({ branches: ["main"], current: "main" });
vi.mocked(api.lanes.worktree).mockResolvedValue({
lane: { id: 44, title: "demo3", cwd: "/lanes/demo3", status: "provisioning" } as Lane,
});
const onClose = vi.fn();
renderModal({ onClose });
const user = userEvent.setup();
const repoField = screen.getByLabelText("Source repository");
await focusField(user, repoField);
await user.type(repoField, "/Users/tester/projects/repo");
await screen.findByLabelText("Branch to fork from");
await user.type(screen.getByLabelText("Title"), "demo3");
await user.click(screen.getByRole("button", { name: "Add lane" }));
expect(await screen.findByText("Setup")).toBeInTheDocument();
expect(onClose).not.toHaveBeenCalled();
const [dismissButton] = screen.getAllByRole("button", { name: "Cancel" });
if (!dismissButton) throw new Error("Cancel button not found");
await user.click(dismissButton);
expect(onClose).toHaveBeenCalled();
});
});