Browse Source

tui: prevent project avatar popover flicker when switching projects (#18660)

Co-authored-by: LukeParkerDev <[email protected]>
David Hill 4 weeks ago
parent
commit
2b171828b0

+ 42 - 1
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)
+  }
+})

+ 7 - 2
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)}