fix(desktop): prevent menu-to-dialog UI lockups (#1839)

Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
This commit is contained in:
Wes
2026-07-14 10:03:39 -06:00
committed by GitHub
parent 2b15a72675
commit 7f81d93eb1
7 changed files with 42 additions and 6 deletions

View File

@@ -22,7 +22,7 @@ export function DeleteActionMenu({ label, onConfirm }: DeleteActionMenuProps) {
return (
<div className="ml-auto opacity-0 transition-opacity group-hover:opacity-100">
<DropdownMenu>
<DropdownMenu modal={false}>
<DropdownMenuTrigger asChild>
<button
className="rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-foreground"

View File

@@ -116,7 +116,7 @@ function MoreActionsMenu({
return (
<>
<DropdownMenu open={open} onOpenChange={onOpenChange}>
<DropdownMenu modal={false} open={open} onOpenChange={onOpenChange}>
<Tooltip>
<TooltipTrigger asChild>
<DropdownMenuTrigger asChild>

View File

@@ -116,7 +116,7 @@ function MemberRow({
</div>
{showActions ? (
<DropdownMenu>
<DropdownMenu modal={false}>
<DropdownMenuTrigger asChild>
<Button
data-testid={`relay-member-actions-${member.pubkey}`}

View File

@@ -234,7 +234,7 @@ function TemplateRow({
</div>
</div>
<DropdownMenu>
<DropdownMenu modal={false}>
<DropdownMenuTrigger asChild>
<Button
className="h-7 w-7 shrink-0 opacity-0 group-hover:opacity-100"

View File

@@ -99,7 +99,7 @@ function WorkspaceButton({
: workspace.name;
return (
<ContextMenu>
<ContextMenu modal={false}>
<Tooltip>
<TooltipTrigger asChild>
<ContextMenuTrigger asChild>

View File

@@ -281,7 +281,11 @@ export function WorkspaceSwitcher({
) : null;
const switcherDropdown = (
<DropdownMenu open={dropdownOpen} onOpenChange={setDropdownOpen}>
<DropdownMenu
modal={false}
open={dropdownOpen}
onOpenChange={setDropdownOpen}
>
<DropdownMenuTrigger asChild>
{variant === "profile" ? (
<button

View File

@@ -55,6 +55,38 @@ test.describe("workspace rail", () => {
await expect(page.getByTestId("workspace-rail-add")).toBeVisible();
});
test("restores pointer events after dismissing workspace settings", async ({
page,
}) => {
await installMockBridge(page, undefined, { skipWorkspaceSeed: true });
await seedWorkspaces(page, [WORKSPACE_A, WORKSPACE_B], WORKSPACE_A.id);
await page.goto("/");
const workspaceButton = page.getByTestId(
`workspace-rail-button-${WORKSPACE_A.id}`,
);
await workspaceButton.click({ button: "right" });
await page.getByRole("menuitem", { name: "Workspace settings" }).click();
await expect(
page.getByRole("dialog", { name: "Edit Workspace" }),
).toBeVisible();
await page.mouse.click(0, 0);
await expect(
page.getByRole("dialog", { name: "Edit Workspace" }),
).toHaveCount(0);
await expect(page.locator("body")).not.toHaveCSS("pointer-events", "none");
await page.getByTestId(`workspace-rail-button-${WORKSPACE_B.id}`).click();
await expect
.poll(() =>
page.evaluate(() =>
window.localStorage.getItem("buzz-active-workspace-id"),
),
)
.toBe(WORKSPACE_B.id);
});
test("switches the active workspace on click", async ({ page }) => {
await installMockBridge(page, undefined, { skipWorkspaceSeed: true });
await seedWorkspaces(page, [WORKSPACE_A, WORKSPACE_B], WORKSPACE_A.id);