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.
This commit is contained in:
@@ -10,10 +10,13 @@ import { hasPermissionBit, PermissionBits } from '../../utils/permissions';
|
|||||||
* Called imperatively at right-click time (not during render).
|
* Called imperatively at right-click time (not during render).
|
||||||
*/
|
*/
|
||||||
export function buildVoiceModMenuItems(targetUserId: string, channelId: string): ContextMenuItem[] {
|
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 { 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 canMuteMembers = hasPermissionBit(myPerms, PermissionBits.MUTE_MEMBERS);
|
||||||
const canDeafenMembers = hasPermissionBit(myPerms, PermissionBits.DEAFEN_MEMBERS);
|
const canDeafenMembers = hasPermissionBit(myPerms, PermissionBits.DEAFEN_MEMBERS);
|
||||||
const canMoveMembers = hasPermissionBit(myPerms, PermissionBits.MOVE_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 [];
|
if (!canMuteMembers && !canDeafenMembers && !canMoveMembers && !canDisconnectMembers) return [];
|
||||||
|
|
||||||
const voiceOrigin = getChannelOrigin(channelId);
|
const voiceOrigin = getChannelOrigin(channelId);
|
||||||
const spaceId = channelToSpaceMap.get(channelId);
|
const spaceId = derivedSpaceId;
|
||||||
const isSpaceMuted = spaceMutedUserIds.has(`${spaceId}:${targetUserId}`);
|
const isSpaceMuted = spaceMutedUserIds.has(`${spaceId}:${targetUserId}`);
|
||||||
const isSpaceDeafened = spaceDeafenedUserIds.has(`${spaceId}:${targetUserId}`);
|
const isSpaceDeafened = spaceDeafenedUserIds.has(`${spaceId}:${targetUserId}`);
|
||||||
const otherVoiceChannels = channels.filter(c => c.type === 'voice' && c.id !== channelId);
|
const otherVoiceChannels = channels.filter(c => c.type === 'voice' && c.id !== channelId);
|
||||||
|
|||||||
Reference in New Issue
Block a user