fix: Fix memory leaking of MessageInput (#21968)
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
|
||||||
import { tick, getContext, onMount, onDestroy } from 'svelte';
|
import { tick, getContext, onMount } from 'svelte';
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
@@ -510,7 +510,7 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDragOver = (e) => {
|
const onDragOver = (e: DragEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
// Check if a file is being draggedOver.
|
// Check if a file is being draggedOver.
|
||||||
@@ -525,7 +525,7 @@
|
|||||||
draggedOver = false;
|
draggedOver = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDrop = async (e) => {
|
const onDrop = async (e: DragEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
if (e.dataTransfer?.files && acceptFiles) {
|
if (e.dataTransfer?.files && acceptFiles) {
|
||||||
@@ -567,7 +567,7 @@
|
|||||||
onChange();
|
onChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(() => {
|
||||||
suggestions = [
|
suggestions = [
|
||||||
{
|
{
|
||||||
char: '@',
|
char: '@',
|
||||||
@@ -633,24 +633,32 @@
|
|||||||
}, 100);
|
}, 100);
|
||||||
|
|
||||||
window.addEventListener('keydown', handleKeyDown);
|
window.addEventListener('keydown', handleKeyDown);
|
||||||
await tick();
|
|
||||||
|
|
||||||
const dropzoneElement = document.getElementById('channel-container');
|
let isDestroyed = false;
|
||||||
|
let dropzoneElement: HTMLElement | null = null;
|
||||||
|
const initialize = async () => {
|
||||||
|
await tick();
|
||||||
|
if (isDestroyed) return;
|
||||||
|
|
||||||
dropzoneElement?.addEventListener('dragover', onDragOver);
|
dropzoneElement = document.getElementById('channel-container');
|
||||||
dropzoneElement?.addEventListener('drop', onDrop);
|
if (dropzoneElement) {
|
||||||
dropzoneElement?.addEventListener('dragleave', onDragLeave);
|
dropzoneElement.addEventListener('dragover', onDragOver);
|
||||||
});
|
dropzoneElement.addEventListener('drop', onDrop);
|
||||||
|
dropzoneElement.addEventListener('dragleave', onDragLeave);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
initialize();
|
||||||
|
|
||||||
onDestroy(() => {
|
return () => {
|
||||||
window.removeEventListener('keydown', handleKeyDown);
|
isDestroyed = true;
|
||||||
|
|
||||||
const dropzoneElement = document.getElementById('channel-container');
|
window.removeEventListener('keydown', handleKeyDown);
|
||||||
|
|
||||||
if (dropzoneElement) {
|
if (dropzoneElement) {
|
||||||
dropzoneElement?.removeEventListener('dragover', onDragOver);
|
dropzoneElement.removeEventListener('dragover', onDragOver);
|
||||||
dropzoneElement?.removeEventListener('drop', onDrop);
|
dropzoneElement.removeEventListener('drop', onDrop);
|
||||||
dropzoneElement?.removeEventListener('dragleave', onDragLeave);
|
dropzoneElement.removeEventListener('dragleave', onDragLeave);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
dayjs.extend(duration);
|
dayjs.extend(duration);
|
||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
import { onMount, tick, getContext, createEventDispatcher, onDestroy } from 'svelte';
|
import { onMount, tick, getContext, createEventDispatcher } from 'svelte';
|
||||||
|
|
||||||
import { createPicker, getAuthToken } from '$lib/utils/google-drive-picker';
|
import { createPicker, getAuthToken } from '$lib/utils/google-drive-picker';
|
||||||
import { pickAndDownloadFile } from '$lib/utils/onedrive-file-picker';
|
import { pickAndDownloadFile } from '$lib/utils/onedrive-file-picker';
|
||||||
@@ -798,7 +798,7 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDragOver = (e) => {
|
const onDragOver = (e: DragEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
// Check if a file is being dragged.
|
// Check if a file is being dragged.
|
||||||
@@ -809,14 +809,14 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDragLeave = (e) => {
|
const onDragLeave = (e: DragEvent) => {
|
||||||
if (e.currentTarget.contains(e.relatedTarget)) {
|
if ((e.currentTarget as HTMLElement)?.contains(e.relatedTarget as Node)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dragged = false;
|
dragged = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDrop = async (e) => {
|
const onDrop = async (e: DragEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
|
||||||
@@ -831,7 +831,7 @@
|
|||||||
dragged = false;
|
dragged = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const onKeyDown = (e) => {
|
const onKeyDown = (e: KeyboardEvent) => {
|
||||||
if (e.key === 'Shift') {
|
if (e.key === 'Shift') {
|
||||||
shiftKey = true;
|
shiftKey = true;
|
||||||
}
|
}
|
||||||
@@ -855,7 +855,7 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onKeyUp = (e) => {
|
const onKeyUp = (e: KeyboardEvent) => {
|
||||||
if (e.key === 'Shift') {
|
if (e.key === 'Shift') {
|
||||||
shiftKey = false;
|
shiftKey = false;
|
||||||
}
|
}
|
||||||
@@ -867,7 +867,7 @@
|
|||||||
shiftKey = false;
|
shiftKey = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(() => {
|
||||||
suggestions = [
|
suggestions = [
|
||||||
{
|
{
|
||||||
char: '@',
|
char: '@',
|
||||||
@@ -1000,31 +1000,37 @@
|
|||||||
window.addEventListener('focus', onFocus);
|
window.addEventListener('focus', onFocus);
|
||||||
window.addEventListener('blur', onBlur);
|
window.addEventListener('blur', onBlur);
|
||||||
|
|
||||||
await tick();
|
let isDestroyed = false;
|
||||||
|
let dropzoneElement: HTMLElement | null = null;
|
||||||
|
const initialize = async () => {
|
||||||
|
await tick();
|
||||||
|
if (isDestroyed) return;
|
||||||
|
|
||||||
const dropzoneElement = document.getElementById('chat-pane');
|
dropzoneElement = document.getElementById('chat-pane');
|
||||||
|
if (dropzoneElement) {
|
||||||
|
dropzoneElement.addEventListener('dragover', onDragOver);
|
||||||
|
dropzoneElement.addEventListener('drop', onDrop);
|
||||||
|
dropzoneElement.addEventListener('dragleave', onDragLeave);
|
||||||
|
}
|
||||||
|
|
||||||
dropzoneElement?.addEventListener('dragover', onDragOver);
|
tools.set(await getTools(localStorage.token));
|
||||||
dropzoneElement?.addEventListener('drop', onDrop);
|
}
|
||||||
dropzoneElement?.addEventListener('dragleave', onDragLeave);
|
initialize();
|
||||||
|
|
||||||
await tools.set(await getTools(localStorage.token));
|
return () => {
|
||||||
});
|
isDestroyed = true;
|
||||||
|
|
||||||
onDestroy(() => {
|
window.removeEventListener('keydown', onKeyDown);
|
||||||
console.log('destroy');
|
window.removeEventListener('keyup', onKeyUp);
|
||||||
window.removeEventListener('keydown', onKeyDown);
|
|
||||||
window.removeEventListener('keyup', onKeyUp);
|
|
||||||
|
|
||||||
window.removeEventListener('focus', onFocus);
|
window.removeEventListener('focus', onFocus);
|
||||||
window.removeEventListener('blur', onBlur);
|
window.removeEventListener('blur', onBlur);
|
||||||
|
|
||||||
const dropzoneElement = document.getElementById('chat-pane');
|
if (dropzoneElement) {
|
||||||
|
dropzoneElement.removeEventListener('dragover', onDragOver);
|
||||||
if (dropzoneElement) {
|
dropzoneElement.removeEventListener('drop', onDrop);
|
||||||
dropzoneElement?.removeEventListener('dragover', onDragOver);
|
dropzoneElement.removeEventListener('dragleave', onDragLeave);
|
||||||
dropzoneElement?.removeEventListener('drop', onDrop);
|
}
|
||||||
dropzoneElement?.removeEventListener('dragleave', onDragLeave);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user