From 8f104e1c5b05d24e1ae5277feebffc7e1de5517c Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:32:47 +0100 Subject: [PATCH] fix: derive spaceId from voice channel in buildVoiceModMenuItems Use channelToSpaceMap.get(channelId) for permission checks instead of currentSpaceId from the navigation store. On mobile, UI navigation decouples from the active voice session. --- packages/web/src/components/voice/voiceMenuItems.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/web/src/components/voice/voiceMenuItems.tsx b/packages/web/src/components/voice/voiceMenuItems.tsx index 633f185e..d93e2ce8 100644 --- a/packages/web/src/components/voice/voiceMenuItems.tsx +++ b/packages/web/src/components/voice/voiceMenuItems.tsx @@ -10,10 +10,13 @@ import { hasPermissionBit, PermissionBits } from '../../utils/permissions'; * Called imperatively at right-click time (not during render). */ export function buildVoiceModMenuItems(targetUserId: string, channelId: string): ContextMenuItem[] { - const { spacePermissions, currentSpaceId, channels, channelToSpaceMap } = useSpaceStore.getState(); + const { spacePermissions, channels, channelToSpaceMap } = useSpaceStore.getState(); const { spaceMutedUserIds, spaceDeafenedUserIds } = useVoiceStore.getState(); - const myPerms = currentSpaceId ? spacePermissions.get(currentSpaceId) : undefined; + // Derive spaceId from the voice channel, NOT from UI navigation state. + // On mobile, the user can navigate away from the space while still in voice. + const derivedSpaceId = channelToSpaceMap.get(channelId); + const myPerms = derivedSpaceId ? spacePermissions.get(derivedSpaceId) : undefined; const canMuteMembers = hasPermissionBit(myPerms, PermissionBits.MUTE_MEMBERS); const canDeafenMembers = hasPermissionBit(myPerms, PermissionBits.DEAFEN_MEMBERS); const canMoveMembers = hasPermissionBit(myPerms, PermissionBits.MOVE_MEMBERS); @@ -22,7 +25,7 @@ export function buildVoiceModMenuItems(targetUserId: string, channelId: string): if (!canMuteMembers && !canDeafenMembers && !canMoveMembers && !canDisconnectMembers) return []; const voiceOrigin = getChannelOrigin(channelId); - const spaceId = channelToSpaceMap.get(channelId); + const spaceId = derivedSpaceId; const isSpaceMuted = spaceMutedUserIds.has(`${spaceId}:${targetUserId}`); const isSpaceDeafened = spaceDeafenedUserIds.has(`${spaceId}:${targetUserId}`); const otherVoiceChannels = channels.filter(c => c.type === 'voice' && c.id !== channelId);