Merge pull request #4360 from element-hq/feature/fga/left_room_snackbar

change(left room snackbar) : manage cancel knock and decline invite
This commit is contained in:
ganfra 2025-03-05 10:19:10 +01:00 committed by GitHub
commit f820a210eb
4 changed files with 28 additions and 14 deletions

View file

@ -10,34 +10,33 @@ package io.element.android.appnav
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
class LoggedInEventProcessor @Inject constructor( class LoggedInEventProcessor @Inject constructor(
private val snackbarDispatcher: SnackbarDispatcher, private val snackbarDispatcher: SnackbarDispatcher,
roomMembershipObserver: RoomMembershipObserver, private val roomMembershipObserver: RoomMembershipObserver,
) { ) {
private var observingJob: Job? = null private var observingJob: Job? = null
private val displayLeftRoomMessage = roomMembershipObserver.updates
.map { !it.isUserInRoom }
fun observeEvents(coroutineScope: CoroutineScope) { fun observeEvents(coroutineScope: CoroutineScope) {
observingJob = coroutineScope.launch { observingJob = roomMembershipObserver.updates
displayLeftRoomMessage .filter { !it.isUserInRoom }
.filter { it } .onEach {
.onEach { when (it.change) {
displayMessage(CommonStrings.common_current_user_left_room) MembershipChange.LEFT -> displayMessage(CommonStrings.common_current_user_left_room)
MembershipChange.INVITATION_REJECTED -> displayMessage(CommonStrings.common_current_user_rejected_invite)
MembershipChange.KNOCK_RETRACTED -> displayMessage(CommonStrings.common_current_user_canceled_knock)
else -> Unit
} }
.launchIn(this) }
} .launchIn(coroutineScope)
} }
fun stopObserving() { fun stopObserving() {

View file

@ -25,4 +25,12 @@ class RoomMembershipObserver {
suspend fun notifyUserLeftRoom(roomId: RoomId) { suspend fun notifyUserLeftRoom(roomId: RoomId) {
_updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.LEFT)) _updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.LEFT))
} }
suspend fun notifyUserDeclinedInvite(roomId: RoomId) {
_updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.INVITATION_REJECTED))
}
suspend fun notifyUserCanceledKnock(roomId: RoomId) {
_updates.emit(RoomMembershipUpdate(roomId, false, MembershipChange.KNOCK_RETRACTED))
}
} }

View file

@ -9,6 +9,7 @@ package io.element.android.libraries.matrix.impl.room
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.RoomMembershipDetails import io.element.android.libraries.matrix.api.room.RoomMembershipDetails
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.room.RoomPreview import io.element.android.libraries.matrix.api.room.RoomPreview
@ -33,7 +34,11 @@ class RustRoomPreview(
override suspend fun leave(): Result<Unit> = runCatching { override suspend fun leave(): Result<Unit> = runCatching {
inner.leave() inner.leave()
}.onSuccess { }.onSuccess {
roomMembershipObserver?.notifyUserLeftRoom(info.roomId) when (info.membership) {
CurrentUserMembership.INVITED -> roomMembershipObserver?.notifyUserDeclinedInvite(info.roomId)
CurrentUserMembership.KNOCKED -> roomMembershipObserver?.notifyUserCanceledKnock(info.roomId)
else -> Unit
}
} }
override suspend fun forget(): Result<Unit> = runCatching { override suspend fun forget(): Result<Unit> = runCatching {

View file

@ -145,7 +145,9 @@
<string name="common_copied_to_clipboard">"Copied to clipboard"</string> <string name="common_copied_to_clipboard">"Copied to clipboard"</string>
<string name="common_copyright">"Copyright"</string> <string name="common_copyright">"Copyright"</string>
<string name="common_creating_room">"Creating room…"</string> <string name="common_creating_room">"Creating room…"</string>
<string name="common_current_user_canceled_knock">"Request canceled"</string>
<string name="common_current_user_left_room">"Left room"</string> <string name="common_current_user_left_room">"Left room"</string>
<string name="common_current_user_rejected_invite">"Invite declined"</string>
<string name="common_dark">"Dark"</string> <string name="common_dark">"Dark"</string>
<string name="common_decryption_error">"Decryption error"</string> <string name="common_decryption_error">"Decryption error"</string>
<string name="common_developer_options">"Developer options"</string> <string name="common_developer_options">"Developer options"</string>