summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2026-03-23 00:20:49 +0000
committerGitHub <[email protected]>2026-03-23 10:20:49 +1000
commit2b171828b0365e8a3cc25cc89de30a740132b947 (patch)
tree41ea7f3d98042e74aac707100e3527d06c804f70
parent8dd817023a2e5798fe977f25d18478995380d347 (diff)
downloadopencode-2b171828b0365e8a3cc25cc89de30a740132b947.tar.gz
opencode-2b171828b0365e8a3cc25cc89de30a740132b947.zip
tui: prevent project avatar popover flicker when switching projects (#18660)
Co-authored-by: LukeParkerDev <[email protected]>
-rw-r--r--packages/app/e2e/sidebar/sidebar-popover-actions.spec.ts43
-rw-r--r--packages/app/src/pages/layout/sidebar-project.tsx9
2 files changed, 49 insertions, 3 deletions
diff --git a/packages/app/e2e/sidebar/sidebar-popover-actions.spec.ts b/packages/app/e2e/sidebar/sidebar-popover-actions.spec.ts
index d10fca0e4..4dc5e6acd 100644
--- a/packages/app/e2e/sidebar/sidebar-popover-actions.spec.ts
+++ b/packages/app/e2e/sidebar/sidebar-popover-actions.spec.ts
@@ -1,6 +1,15 @@
import { test, expect } from "../fixtures"
-import { cleanupSession, closeSidebar, hoverSessionItem } from "../actions"
+import {
+ cleanupSession,
+ cleanupTestProject,
+ closeSidebar,
+ createTestProject,
+ hoverSessionItem,
+ openSidebar,
+ waitSession,
+} from "../actions"
import { projectSwitchSelector } from "../selectors"
+import { dirSlug } from "../utils"
test("collapsed sidebar popover stays open when archiving a session", async ({ page, slug, sdk, gotoSession }) => {
const stamp = Date.now()
@@ -37,3 +46,35 @@ test("collapsed sidebar popover stays open when archiving a session", async ({ p
await cleanupSession({ sdk, sessionID: two.id })
}
})
+
+test("open sidebar project popover stays closed after clicking avatar", async ({ page, withProject }) => {
+ await page.setViewportSize({ width: 1400, height: 800 })
+
+ const other = await createTestProject()
+ const slug = dirSlug(other)
+
+ try {
+ await withProject(
+ async () => {
+ await openSidebar(page)
+
+ const project = page.locator(projectSwitchSelector(slug)).first()
+ const card = page.locator('[data-component="hover-card-content"]')
+
+ await expect(project).toBeVisible()
+ await project.hover()
+ await expect(card.getByText(/recent sessions/i)).toBeVisible()
+
+ await page.mouse.down()
+ await expect(card).toHaveCount(0)
+ await page.mouse.up()
+
+ await waitSession(page, { directory: other })
+ await expect(card).toHaveCount(0)
+ },
+ { extra: [other] },
+ )
+ } finally {
+ await cleanupTestProject(other)
+ }
+})
diff --git a/packages/app/src/pages/layout/sidebar-project.tsx b/packages/app/src/pages/layout/sidebar-project.tsx
index 252826456..99f1edb74 100644
--- a/packages/app/src/pages/layout/sidebar-project.tsx
+++ b/packages/app/src/pages/layout/sidebar-project.tsx
@@ -109,8 +109,14 @@ const ProjectTile = (props: {
"bg-surface-base-hover border border-border-weak-base": !props.selected() && props.active(),
}}
onPointerDown={(event) => {
+ if (event.button === 0 && !event.ctrlKey) {
+ props.setOpen(false)
+ props.setSuppressHover(true)
+ return
+ }
if (!props.overlay()) return
if (event.button !== 2 && !(event.button === 0 && event.ctrlKey)) return
+ props.setOpen(false)
props.setSuppressHover(true)
event.preventDefault()
}}
@@ -130,12 +136,11 @@ const ProjectTile = (props: {
props.onProjectFocus(props.project.worktree)
}}
onClick={() => {
+ props.setOpen(false)
if (props.selected()) {
- props.setSuppressHover(true)
layout.sidebar.toggle()
return
}
- props.setSuppressHover(false)
props.navigateToProject(props.project.worktree)
}}
onBlur={() => props.setOpen(false)}