From 9aeef413321a67e09c9bad2b811f1cb887076998 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Fri, 24 Jul 2026 13:42:08 +0200 Subject: [PATCH 1/2] fix(android): activate room context menu items on pointerup --- src/app/components/MobileMenuItem.tsx | 23 ++++++++++ src/app/features/room-nav/RoomNavItem.tsx | 53 ++++++++++++++++------- src/app/hooks/useMobileTapActivation.ts | 6 +-- 3 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 src/app/components/MobileMenuItem.tsx diff --git a/src/app/components/MobileMenuItem.tsx b/src/app/components/MobileMenuItem.tsx new file mode 100644 index 0000000000..ff729767fb --- /dev/null +++ b/src/app/components/MobileMenuItem.tsx @@ -0,0 +1,23 @@ +import type { ComponentProps, MouseEventHandler } from 'react'; +import { MenuItem } from 'folds'; +import { useMobileTapActivation } from '$hooks/useMobileTapActivation'; + +type MenuItemProps = ComponentProps; + +type MobileMenuItemProps = Omit & { + isMobile: boolean; + onClick?: MouseEventHandler; +}; + +/** + * Wraps folds' `MenuItem` with pointer-based tap activation for Android + * WebView, where click synthesis is suppressed after the long-press gesture + * that opens the mobile swipe-down modal. On mobile the `onClick` handler + * fires on `pointerup` instead of relying on the missing click event. + */ +export function MobileMenuItem({ isMobile, onClick, ...props }: MobileMenuItemProps) { + const activation = useMobileTapActivation(isMobile, (evt) => { + onClick?.(evt); + }); + return ; +} diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx index 99c14b70c3..f964414983 100644 --- a/src/app/features/room-nav/RoomNavItem.tsx +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -9,7 +9,6 @@ import { IconButton, Text, Menu, - MenuItem, config, PopOut, toRem, @@ -62,6 +61,7 @@ import { } from '$components/icons/phosphor'; import { Copy as CopyIcon } from '@phosphor-icons/react'; import { MobileSwipeDownModal } from '$components/MobileSwipeDownModal'; +import { MobileMenuItem } from '$components/MobileMenuItem'; import { type DragOptsProps } from '$components/message/modals/Options'; import * as messageCss from '$features/room/message/styles.css'; import { @@ -125,6 +125,7 @@ type RoomNavItemMenuProps = { const RoomNavItemMenu = forwardRef( ({ room, requestClose, notificationMode, dragOpts }, ref) => { const mx = useMatrixClient(); + const isMobile = useScreenSizeContext() === ScreenSize.Mobile; const [hideReads] = useSetting(settingsAtom, 'hideReads'); const unread = useRoomUnread(room.roomId, roomToUnreadAtom); const powerLevels = usePowerLevels(room); @@ -184,7 +185,8 @@ const RoomNavItemMenu = forwardRef( /> )} - ( Mark as Read - + {(handleOpen, opened, changing) => ( - ( Notifications - + )} - ( Invite - - + + Copy Link - - + + Copy Room Name - - + + Room Settings - + {(promptLeave, setPromptLeave) => ( <> - setPromptLeave(true)} variant="Critical" fill="None" @@ -266,7 +289,7 @@ const RoomNavItemMenu = forwardRef( Leave Room - + {promptLeave && ( ( enabled: boolean, - onActivate: () => void + onActivate: (evt: ReactPointerEvent) => void ): { onPointerDown: PointerEventHandler; onPointerMove: PointerEventHandler; @@ -70,7 +70,7 @@ export function useMobileTapActivation( } evt.preventDefault(); - onActivateRef.current(); + onActivateRef.current(evt); }; const onPointerCancel: PointerEventHandler = (evt) => { if (evt.pointerId !== pointerDownRef.current?.pointerId) return; From e4c58a7c3f2d5f98162667030b83708d13a14d25 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Fri, 24 Jul 2026 14:21:26 +0200 Subject: [PATCH 2/2] fix(android): activate room context menu items on pointerup --- .changeset/fix-android-room-context-menu.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix-android-room-context-menu.md diff --git a/.changeset/fix-android-room-context-menu.md b/.changeset/fix-android-room-context-menu.md new file mode 100644 index 0000000000..5a962d42ea --- /dev/null +++ b/.changeset/fix-android-room-context-menu.md @@ -0,0 +1,5 @@ +--- +default: patch +--- + +Activate room context menu items on pointerup on Android to work around WebView click synthesis being suppressed after the long-press gesture that opens the mobile menu.