Skip to content

Commit 2734fca

Browse files
fix(sidebar): ChatItem document listener teardown and shared drag image (open-webui#23209)
1 parent 3d6e5ff commit 2734fca

1 file changed

Lines changed: 21 additions & 24 deletions

File tree

src/lib/components/layout/Sidebar/ChatItem.svelte

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1+
<script context="module" lang="ts">
2+
/** Shared 1×1 transparent drag preview; avoids one Image per sidebar row */
3+
const invisibleDragImage = new Image();
4+
invisibleDragImage.src =
5+
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
6+
</script>
7+
18
<script lang="ts">
29
import { toast } from 'svelte-sonner';
310
import { goto, invalidate, invalidateAll } from '$app/navigation';
4-
import { onMount, getContext, createEventDispatcher, tick, onDestroy } from 'svelte';
11+
import { onMount, getContext, createEventDispatcher, tick } from 'svelte';
512
const i18n = getContext('i18n');
613
714
const dispatch = createEventDispatcher();
@@ -224,14 +231,10 @@
224231
let x = 0;
225232
let y = 0;
226233
227-
const dragImage = new Image();
228-
dragImage.src =
229-
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
230-
231234
const onDragStart = (event) => {
232235
event.stopPropagation();
233236
234-
event.dataTransfer.setDragImage(dragImage, 0, 0);
237+
event.dataTransfer.setDragImage(invisibleDragImage, 0, 0);
235238
236239
// Set the data to be transferred
237240
event.dataTransfer.setData(
@@ -276,26 +279,20 @@
276279
};
277280
278281
onMount(() => {
279-
if (itemElement) {
280-
document.addEventListener('click', onClickOutside, true);
281-
282-
// Event listener for when dragging starts
283-
itemElement.addEventListener('dragstart', onDragStart);
284-
// Event listener for when dragging occurs (optional)
285-
itemElement.addEventListener('drag', onDrag);
286-
// Event listener for when dragging ends
287-
itemElement.addEventListener('dragend', onDragEndHandler);
288-
}
289-
});
282+
const el = itemElement;
283+
if (!el) return;
290284
291-
onDestroy(() => {
292-
if (itemElement) {
293-
document.removeEventListener('click', onClickOutside, true);
285+
document.addEventListener('click', onClickOutside, true);
286+
el.addEventListener('dragstart', onDragStart);
287+
el.addEventListener('drag', onDrag);
288+
el.addEventListener('dragend', onDragEndHandler);
294289
295-
itemElement.removeEventListener('dragstart', onDragStart);
296-
itemElement.removeEventListener('drag', onDrag);
297-
itemElement.removeEventListener('dragend', onDragEndHandler);
298-
}
290+
return () => {
291+
document.removeEventListener('click', onClickOutside, true);
292+
el.removeEventListener('dragstart', onDragStart);
293+
el.removeEventListener('drag', onDrag);
294+
el.removeEventListener('dragend', onDragEndHandler);
295+
};
299296
});
300297
301298
let showDeleteConfirm = false;

0 commit comments

Comments
 (0)