Skip to content

Commit 5ea9545

Browse files
authored
fix(app): prevent stale session hover preview on refocus (#18727)
1 parent 9239d87 commit 5ea9545

2 files changed

Lines changed: 54 additions & 29 deletions

File tree

packages/app/src/pages/layout.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,22 @@ export default function Layout(props: ParentProps) {
211211

212212
onMount(() => {
213213
const stop = () => setState("sizing", false)
214+
const blur = () => reset()
215+
const hide = () => {
216+
if (document.visibilityState !== "hidden") return
217+
reset()
218+
}
214219
window.addEventListener("pointerup", stop)
215220
window.addEventListener("pointercancel", stop)
216221
window.addEventListener("blur", stop)
222+
window.addEventListener("blur", blur)
223+
document.addEventListener("visibilitychange", hide)
217224
onCleanup(() => {
218225
window.removeEventListener("pointerup", stop)
219226
window.removeEventListener("pointercancel", stop)
220227
window.removeEventListener("blur", stop)
228+
window.removeEventListener("blur", blur)
229+
document.removeEventListener("visibilitychange", hide)
221230
})
222231
})
223232

@@ -237,6 +246,12 @@ export default function Layout(props: ParentProps) {
237246
navLeave.current = undefined
238247
}
239248

249+
const reset = () => {
250+
disarm()
251+
setState("hoverSession", undefined)
252+
setHoverProject(undefined)
253+
}
254+
240255
const arm = () => {
241256
if (layout.sidebar.opened()) return
242257
if (state.hoverProject === undefined) return
@@ -305,8 +320,7 @@ export default function Layout(props: ParentProps) {
305320

306321
const clearSidebarHoverState = () => {
307322
if (layout.sidebar.opened()) return
308-
setState("hoverSession", undefined)
309-
setHoverProject(undefined)
323+
reset()
310324
}
311325

312326
const navigateWithSidebarReset = (href: string) => {

packages/app/src/pages/layout/sidebar-items.tsx

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -157,34 +157,45 @@ const SessionHoverPreview = (props: {
157157
messageLabel: (message: Message) => string | undefined
158158
onMessageSelect: (message: Message) => void
159159
trigger: JSX.Element
160-
}): JSX.Element => (
161-
<HoverCard
162-
openDelay={1000}
163-
closeDelay={props.sidebarHovering() ? 600 : 0}
164-
placement="right-start"
165-
gutter={16}
166-
shift={-2}
167-
trigger={props.trigger}
168-
open={props.hoverSession() === props.session.id}
169-
onOpenChange={(open) => props.setHoverSession(open ? props.session.id : undefined)}
170-
>
171-
<Show
172-
when={props.hoverReady()}
173-
fallback={<div class="text-12-regular text-text-weak">{props.language.t("session.messages.loading")}</div>}
160+
}): JSX.Element => {
161+
let ref: HTMLDivElement | undefined
162+
163+
return (
164+
<HoverCard
165+
openDelay={1000}
166+
closeDelay={props.sidebarHovering() ? 600 : 0}
167+
placement="right-start"
168+
gutter={16}
169+
shift={-2}
170+
trigger={<div ref={ref}>{props.trigger}</div>}
171+
open={props.hoverSession() === props.session.id}
172+
onOpenChange={(open) => {
173+
if (!open) {
174+
props.setHoverSession(undefined)
175+
return
176+
}
177+
if (!ref?.matches(":hover")) return
178+
props.setHoverSession(props.session.id)
179+
}}
174180
>
175-
<div class="overflow-y-auto overflow-x-hidden max-h-72 h-full">
176-
<MessageNav
177-
messages={props.hoverMessages() ?? []}
178-
current={undefined}
179-
getLabel={props.messageLabel}
180-
onMessageSelect={props.onMessageSelect}
181-
size="normal"
182-
class="w-60"
183-
/>
184-
</div>
185-
</Show>
186-
</HoverCard>
187-
)
181+
<Show
182+
when={props.hoverReady()}
183+
fallback={<div class="text-12-regular text-text-weak">{props.language.t("session.messages.loading")}</div>}
184+
>
185+
<div class="overflow-y-auto overflow-x-hidden max-h-72 h-full">
186+
<MessageNav
187+
messages={props.hoverMessages() ?? []}
188+
current={undefined}
189+
getLabel={props.messageLabel}
190+
onMessageSelect={props.onMessageSelect}
191+
size="normal"
192+
class="w-60"
193+
/>
194+
</div>
195+
</Show>
196+
</HoverCard>
197+
)
198+
}
188199

189200
export const SessionItem = (props: SessionItemProps): JSX.Element => {
190201
const params = useParams()

0 commit comments

Comments
 (0)