From 983b0a4066430f9c97c4da4081bebca8ee392487 Mon Sep 17 00:00:00 2001 From: thumb2086 Date: Sat, 31 Oct 2026 01:28:16 +0800 Subject: [PATCH] fix(jam): prevent self from showing in moderation menu Fixes race condition where guest taking over as host would see 'manage' button for themselves during presence propagation delay. - Add localClientId to UI state combine - Update canModerate logic: role == Host && !participant.isHost && participant.id != localClientId --- .../org/spotube/spotube/modules/jam/JamViewModel.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/org/spotube/spotube/modules/jam/JamViewModel.kt b/composeApp/src/commonMain/kotlin/org/spotube/spotube/modules/jam/JamViewModel.kt index 5041e371..939660f2 100644 --- a/composeApp/src/commonMain/kotlin/org/spotube/spotube/modules/jam/JamViewModel.kt +++ b/composeApp/src/commonMain/kotlin/org/spotube/spotube/modules/jam/JamViewModel.kt @@ -102,7 +102,9 @@ class JamViewModel( codeCopied, snapshotFlow { codeInput.text.toString() }, participantMenu, - isLeaving + isLeaving, + // Local client ID to exclude self from moderation menu + jamRoomService.participantClientId ) { values -> @Suppress("UNCHECKED_CAST") val role = values[0] as JamRole? @@ -116,6 +118,7 @@ class JamViewModel( val localError = values[6] as String? val busy = values[8] as Boolean val brokerConfigured = !settings?.jamBroker?.host.isNullOrBlank() + val localClientId = values[13] as String JamUiState( isActive = role != null, @@ -127,7 +130,8 @@ class JamViewModel( displayName = participant.displayName, initial = participant.displayName.firstOrNull()?.uppercase() ?: "?", isHost = participant.isHost, - canModerate = role == JamRole.Host && !participant.isHost, + // Host can moderate OTHER participants only (not self) + canModerate = role == JamRole.Host && !participant.isHost && participant.id != localClientId, menuExpanded = values[11] == participant.id ) },