From 6d7f21b57b5ebbd6b1f99b11cf5c2522c1dadcfe Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Mon, 2 Mar 2026 02:35:09 +0800 Subject: [PATCH] fix: fix memory leaking of SIdebar (#22082) --- src/lib/components/layout/Sidebar.svelte | 69 +++++++++++------------- 1 file changed, 30 insertions(+), 39 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index b19976053..27f9af905 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -414,9 +414,7 @@ document.documentElement.style.setProperty('--sidebar-width', `${newSidebarWidth}px`); }; - let unsubscribers = []; - - onMount(async () => { + onMount(() => { try { const width = Number(localStorage.getItem('sidebarWidth')); if (!Number.isNaN(width) && width >= MIN_WIDTH && width <= MAX_WIDTH) { @@ -429,9 +427,9 @@ 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) => { if ($showSidebar && value) { showSidebar.set(false); @@ -502,14 +500,35 @@ window.addEventListener('blur', onBlur); const dropZone = document.getElementById('sidebar'); + if (dropZone) { + dropZone.addEventListener('dragover', onDragOver); + dropZone.addEventListener('drop', onDrop); + dropZone.addEventListener('dragleave', onDragLeave); + } - dropZone?.addEventListener('dragover', onDragOver); - dropZone?.addEventListener('drop', onDrop); - dropZone?.addEventListener('dragleave', onDragLeave); + const socketInstance = $socket; + socketInstance?.on('events', chatActiveEventHandler); - // Listen for real-time chat:active events via the events channel - $socket?.off('events', chatActiveEventHandler); - $socket?.on('events', chatActiveEventHandler); + return () => { + unsubscribers.forEach((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); + + 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) @@ -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 () => { selectedChatId = null; selectedFolder.set(null);