From 2b2e1c7386eecb5e138babe58559a848a23ab58e Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Tue, 24 Mar 2026 00:14:09 +0100 Subject: [PATCH] fix: remove preventDefault on touchstart that killed all mobile taps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calling e.preventDefault() on touchstart inside [data-context-menu] elements prevented the browser from synthesizing click events (touchstart → touchend → click chain). This broke tapping on spaces, channels, DMs, and every other surface with data-context-menu. Text selection prevention is already handled by CSS user-select: none on [data-context-menu] elements — the JS preventDefault was redundant and destructive. Reverted touchstart listener back to passive. --- packages/web/src/components/ui/ContextMenuRenderer.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/web/src/components/ui/ContextMenuRenderer.tsx b/packages/web/src/components/ui/ContextMenuRenderer.tsx index c3980a72..cc7b7123 100644 --- a/packages/web/src/components/ui/ContextMenuRenderer.tsx +++ b/packages/web/src/components/ui/ContextMenuRenderer.tsx @@ -550,10 +550,10 @@ function useGlobalLongPress(isMobile: boolean) { }; const onTouchStart = (e: TouchEvent) => { - const target = e.target as HTMLElement; - if (target.closest('[data-context-menu]')) { - e.preventDefault(); - } + // NOTE: Do NOT call e.preventDefault() here — it kills the synthesized + // click event on mobile (touchstart → touchend → click chain). + // Text selection prevention is handled by CSS user-select: none on + // [data-context-menu] elements (see globals.css). if (e.touches.length !== 1) { cancel(); return; } const touch = e.touches[0]!; originX = touch.clientX; @@ -604,7 +604,7 @@ function useGlobalLongPress(isMobile: boolean) { } }; - document.addEventListener('touchstart', onTouchStart, { passive: false }); + document.addEventListener('touchstart', onTouchStart, { passive: true }); document.addEventListener('touchmove', onTouchMove, { passive: true }); document.addEventListener('touchend', onTouchEnd, { passive: true }); document.addEventListener('touchcancel', onTouchEnd, { passive: true });