fix: enforce a single open chat hover preview across sidebar chat items (#27549)

This commit is contained in:
G30
2026-07-26 17:26:49 -04:00
committed by GitHub
parent ef197de0d7
commit 65209b0235
@@ -3,6 +3,15 @@
const invisibleDragImage = new Image();
invisibleDragImage.src =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
/**
* At most one chat hover preview may be open across all ChatItem instances.
* bits-ui's safe-polygon close only re-evaluates on pointermove, so a
* preview can be left open when the pointer stops on a neighboring row
* while still inside the previous row's grace area; opening a preview
* therefore force-closes whichever one is still up.
*/
let closeActiveHoverPreview: (() => void) | null = null;
</script>
<script lang="ts">
@@ -94,6 +103,17 @@
let mouseOver = false;
let openPreview = false;
const closeHoverPreview = () => {
if (openPreview) {
openPreview = false;
}
};
$: if (openPreview && closeActiveHoverPreview !== closeHoverPreview) {
closeActiveHoverPreview?.();
closeActiveHoverPreview = closeHoverPreview;
}
// Local state: tracks the last updatedAt seen while the user was viewing
// this chat. Survives prop refreshes from sidebar data re-fetches that
// would overwrite the `lastReadAt` prop with a stale server value.
@@ -311,6 +331,10 @@
el.removeEventListener('dragstart', onDragStart);
el.removeEventListener('drag', onDrag);
el.removeEventListener('dragend', onDragEndHandler);
if (closeActiveHoverPreview === closeHoverPreview) {
closeActiveHoverPreview = null;
}
};
});