fix: fix memory leaking of SIdebar (#22082)
This commit is contained in:
@@ -414,9 +414,7 @@
|
|||||||
document.documentElement.style.setProperty('--sidebar-width', `${newSidebarWidth}px`);
|
document.documentElement.style.setProperty('--sidebar-width', `${newSidebarWidth}px`);
|
||||||
};
|
};
|
||||||
|
|
||||||
let unsubscribers = [];
|
onMount(() => {
|
||||||
|
|
||||||
onMount(async () => {
|
|
||||||
try {
|
try {
|
||||||
const width = Number(localStorage.getItem('sidebarWidth'));
|
const width = Number(localStorage.getItem('sidebarWidth'));
|
||||||
if (!Number.isNaN(width) && width >= MIN_WIDTH && width <= MAX_WIDTH) {
|
if (!Number.isNaN(width) && width >= MIN_WIDTH && width <= MAX_WIDTH) {
|
||||||
@@ -429,9 +427,9 @@
|
|||||||
document.documentElement.style.setProperty('--sidebar-width', `${w}px`);
|
document.documentElement.style.setProperty('--sidebar-width', `${w}px`);
|
||||||
});
|
});
|
||||||
|
|
||||||
await showSidebar.set(!$mobile ? localStorage.sidebar === 'true' : false);
|
showSidebar.set(!$mobile ? localStorage.sidebar === 'true' : false);
|
||||||
|
|
||||||
unsubscribers = [
|
const unsubscribers = [
|
||||||
mobile.subscribe((value) => {
|
mobile.subscribe((value) => {
|
||||||
if ($showSidebar && value) {
|
if ($showSidebar && value) {
|
||||||
showSidebar.set(false);
|
showSidebar.set(false);
|
||||||
@@ -502,14 +500,35 @@
|
|||||||
window.addEventListener('blur', onBlur);
|
window.addEventListener('blur', onBlur);
|
||||||
|
|
||||||
const dropZone = document.getElementById('sidebar');
|
const dropZone = document.getElementById('sidebar');
|
||||||
|
if (dropZone) {
|
||||||
|
dropZone.addEventListener('dragover', onDragOver);
|
||||||
|
dropZone.addEventListener('drop', onDrop);
|
||||||
|
dropZone.addEventListener('dragleave', onDragLeave);
|
||||||
|
}
|
||||||
|
|
||||||
dropZone?.addEventListener('dragover', onDragOver);
|
const socketInstance = $socket;
|
||||||
dropZone?.addEventListener('drop', onDrop);
|
socketInstance?.on('events', chatActiveEventHandler);
|
||||||
dropZone?.addEventListener('dragleave', onDragLeave);
|
|
||||||
|
|
||||||
// Listen for real-time chat:active events via the events channel
|
return () => {
|
||||||
$socket?.off('events', chatActiveEventHandler);
|
unsubscribers.forEach((unsubscriber) => unsubscriber());
|
||||||
$socket?.on('events', chatActiveEventHandler);
|
|
||||||
|
window.removeEventListener('keydown', onKeyDown);
|
||||||
|
window.removeEventListener('keyup', onKeyUp);
|
||||||
|
|
||||||
|
window.removeEventListener('touchstart', onTouchStart);
|
||||||
|
window.removeEventListener('touchend', onTouchEnd);
|
||||||
|
|
||||||
|
window.removeEventListener('focus', onFocus);
|
||||||
|
window.removeEventListener('blur', onBlur);
|
||||||
|
|
||||||
|
if (dropZone) {
|
||||||
|
dropZone.removeEventListener('dragover', onDragOver);
|
||||||
|
dropZone.removeEventListener('drop', onDrop);
|
||||||
|
dropZone.removeEventListener('dragleave', onDragLeave);
|
||||||
|
}
|
||||||
|
|
||||||
|
socketInstance?.off('events', chatActiveEventHandler);
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// Handler for chat:active events (defined outside onMount for proper cleanup)
|
// Handler for chat:active events (defined outside onMount for proper cleanup)
|
||||||
@@ -532,34 +551,6 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
if (unsubscribers && unsubscribers.length > 0) {
|
|
||||||
unsubscribers.forEach((unsubscriber) => {
|
|
||||||
if (unsubscriber) {
|
|
||||||
unsubscriber();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.removeEventListener('keydown', onKeyDown);
|
|
||||||
window.removeEventListener('keyup', onKeyUp);
|
|
||||||
|
|
||||||
window.removeEventListener('touchstart', onTouchStart);
|
|
||||||
window.removeEventListener('touchend', onTouchEnd);
|
|
||||||
|
|
||||||
window.removeEventListener('focus', onFocus);
|
|
||||||
window.removeEventListener('blur', onBlur);
|
|
||||||
|
|
||||||
const dropZone = document.getElementById('sidebar');
|
|
||||||
|
|
||||||
dropZone?.removeEventListener('dragover', onDragOver);
|
|
||||||
dropZone?.removeEventListener('drop', onDrop);
|
|
||||||
dropZone?.removeEventListener('dragleave', onDragLeave);
|
|
||||||
|
|
||||||
// Clean up socket listener
|
|
||||||
$socket?.off('events', chatActiveEventHandler);
|
|
||||||
});
|
|
||||||
|
|
||||||
const newChatHandler = async () => {
|
const newChatHandler = async () => {
|
||||||
selectedChatId = null;
|
selectedChatId = null;
|
||||||
selectedFolder.set(null);
|
selectedFolder.set(null);
|
||||||
|
|||||||
Reference in New Issue
Block a user