From 2952799d00a1268e80122ff9c6c28efac32f62ac Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Fri, 20 Mar 2026 20:35:47 +0100 Subject: [PATCH] feat: add auto-scroll during drag near sidebar edges --- packages/web/src/hooks/useDragManager.ts | 40 ++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/web/src/hooks/useDragManager.ts b/packages/web/src/hooks/useDragManager.ts index a22fd09c..ce943586 100644 --- a/packages/web/src/hooks/useDragManager.ts +++ b/packages/web/src/hooks/useDragManager.ts @@ -178,8 +178,44 @@ export function useDragManager(opts: UseDragManagerOpts) { voiceHoverChannelId, activeDrag, ]); - // Suppress unused variable warnings for incremental build - void scrollContainerRef; + // --- Auto-scroll during drag (fixes bug 7) --- + + useEffect(() => { + if (!activeDrag || !scrollContainerRef.current) return; + const container = scrollContainerRef.current; + const EDGE_PX = 40; + let scrollSpeed = 0; + let rafId = 0; + + const onDragOver = (e: DragEvent) => { + const rect = container.getBoundingClientRect(); + const distFromTop = e.clientY - rect.top; + const distFromBottom = rect.bottom - e.clientY; + + if (distFromTop < EDGE_PX) { + scrollSpeed = -(1 + 7 * (1 - distFromTop / EDGE_PX)); + } else if (distFromBottom < EDGE_PX) { + scrollSpeed = 1 + 7 * (1 - distFromBottom / EDGE_PX); + } else { + scrollSpeed = 0; + } + }; + + const tick = () => { + if (scrollSpeed !== 0) { + container.scrollTop += scrollSpeed; + } + rafId = requestAnimationFrame(tick); + }; + + container.addEventListener('dragover', onDragOver); + rafId = requestAnimationFrame(tick); + + return () => { + container.removeEventListener('dragover', onDragOver); + cancelAnimationFrame(rafId); + }; + }, [activeDrag, scrollContainerRef]); return { activeDrag,