Make the room settings screen update automatically (#2197)
* Make the room settings screen update automatically
This commit is contained in:
parent
3c4c9fa92b
commit
854622b85f
4 changed files with 36 additions and 7 deletions
1
changelog.d/921.bugfix
Normal file
1
changelog.d/921.bugfix
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Make the room settings screen update automatically when new room info (name, avatar, topic) is available.
|
||||||
|
|
@ -63,6 +63,12 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val leaveRoomState = leaveRoomPresenter.present()
|
val leaveRoomState = leaveRoomPresenter.present()
|
||||||
val canShowNotificationSettings = remember { mutableStateOf(false) }
|
val canShowNotificationSettings = remember { mutableStateOf(false) }
|
||||||
|
val roomInfo = room.roomInfoFlow.collectAsState(initial = null).value
|
||||||
|
|
||||||
|
val roomAvatar by remember { derivedStateOf { roomInfo?.avatarUrl ?: room.avatarUrl } }
|
||||||
|
|
||||||
|
val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.name ?: room.displayName).trim() } }
|
||||||
|
val roomTopic by remember { derivedStateOf { roomInfo?.topic ?: room.topic } }
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
canShowNotificationSettings.value = featureFlagService.isFeatureEnabled(FeatureFlags.NotificationSettings)
|
canShowNotificationSettings.value = featureFlagService.isFeatureEnabled(FeatureFlags.NotificationSettings)
|
||||||
|
|
@ -82,8 +88,8 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
val roomMemberDetailsPresenter = roomMemberDetailsPresenter(dmMember)
|
val roomMemberDetailsPresenter = roomMemberDetailsPresenter(dmMember)
|
||||||
val roomType by getRoomType(dmMember)
|
val roomType by getRoomType(dmMember)
|
||||||
|
|
||||||
val topicState = remember(canEditTopic, room.topic, roomType) {
|
val topicState = remember(canEditTopic, roomTopic, roomType) {
|
||||||
val topic = room.topic
|
val topic = roomTopic
|
||||||
|
|
||||||
when {
|
when {
|
||||||
!topic.isNullOrBlank() -> RoomTopicState.ExistingTopic(topic)
|
!topic.isNullOrBlank() -> RoomTopicState.ExistingTopic(topic)
|
||||||
|
|
@ -115,9 +121,9 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
|
|
||||||
return RoomDetailsState(
|
return RoomDetailsState(
|
||||||
roomId = room.roomId.value,
|
roomId = room.roomId.value,
|
||||||
roomName = room.displayName,
|
roomName = roomName,
|
||||||
roomAlias = room.alias,
|
roomAlias = room.alias,
|
||||||
roomAvatarUrl = room.avatarUrl,
|
roomAvatarUrl = roomAvatar,
|
||||||
roomTopic = topicState,
|
roomTopic = topicState,
|
||||||
memberCount = room.joinedMemberCount,
|
memberCount = room.joinedMemberCount,
|
||||||
isEncrypted = room.isEncrypted,
|
isEncrypted = room.isEncrypted,
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ import io.element.android.libraries.matrix.test.A_USER_ID_2
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
|
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
|
||||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||||
|
import io.element.android.libraries.matrix.test.room.aRoomInfo
|
||||||
import io.element.android.tests.testutils.WarmUpRule
|
import io.element.android.tests.testutils.WarmUpRule
|
||||||
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
||||||
import io.element.android.tests.testutils.testCoroutineDispatchers
|
import io.element.android.tests.testutils.testCoroutineDispatchers
|
||||||
|
|
@ -89,7 +90,7 @@ class RoomDetailsPresenterTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - initial state is created from room info`() = runTest {
|
fun `present - initial state is created from room if roomInfo is null`() = runTest {
|
||||||
val room = aMatrixRoom()
|
val room = aMatrixRoom()
|
||||||
val presenter = createRoomDetailsPresenter(room)
|
val presenter = createRoomDetailsPresenter(room)
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
|
@ -97,7 +98,7 @@ class RoomDetailsPresenterTests {
|
||||||
}.test {
|
}.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.roomId).isEqualTo(room.roomId.value)
|
assertThat(initialState.roomId).isEqualTo(room.roomId.value)
|
||||||
assertThat(initialState.roomName).isEqualTo(room.displayName)
|
assertThat(initialState.roomName).isEqualTo(room.name)
|
||||||
assertThat(initialState.roomAvatarUrl).isEqualTo(room.avatarUrl)
|
assertThat(initialState.roomAvatarUrl).isEqualTo(room.avatarUrl)
|
||||||
assertThat(initialState.roomTopic).isEqualTo(RoomTopicState.ExistingTopic(room.topic!!))
|
assertThat(initialState.roomTopic).isEqualTo(RoomTopicState.ExistingTopic(room.topic!!))
|
||||||
assertThat(initialState.memberCount).isEqualTo(room.joinedMemberCount)
|
assertThat(initialState.memberCount).isEqualTo(room.joinedMemberCount)
|
||||||
|
|
@ -107,6 +108,26 @@ class RoomDetailsPresenterTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - initial state is updated with roomInfo if it exists`() = runTest {
|
||||||
|
val roomInfo = aRoomInfo(name = "A room name", topic = "A topic", avatarUrl = "https://matrix.org/avatar.jpg")
|
||||||
|
val room = aMatrixRoom().apply {
|
||||||
|
givenRoomInfo(roomInfo)
|
||||||
|
}
|
||||||
|
val presenter = createRoomDetailsPresenter(room)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
skipItems(1)
|
||||||
|
val updatedState = awaitItem()
|
||||||
|
assertThat(updatedState.roomName).isEqualTo(roomInfo.name)
|
||||||
|
assertThat(updatedState.roomAvatarUrl).isEqualTo(roomInfo.avatarUrl)
|
||||||
|
assertThat(updatedState.roomTopic).isEqualTo(RoomTopicState.ExistingTopic(roomInfo.topic!!))
|
||||||
|
|
||||||
|
cancelAndIgnoreRemainingEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - initial state with no room name`() = runTest {
|
fun `present - initial state with no room name`() = runTest {
|
||||||
val room = aMatrixRoom(name = null)
|
val room = aMatrixRoom(name = null)
|
||||||
|
|
@ -334,6 +355,7 @@ class RoomDetailsPresenterTests {
|
||||||
val room = aMatrixRoom(topic = null).apply {
|
val room = aMatrixRoom(topic = null).apply {
|
||||||
givenCanSendStateResult(StateEventType.ROOM_TOPIC, Result.success(true))
|
givenCanSendStateResult(StateEventType.ROOM_TOPIC, Result.success(true))
|
||||||
givenCanInviteResult(Result.success(false))
|
givenCanInviteResult(Result.success(false))
|
||||||
|
givenRoomInfo(aRoomInfo(topic = null))
|
||||||
}
|
}
|
||||||
|
|
||||||
val presenter = createRoomDetailsPresenter(room)
|
val presenter = createRoomDetailsPresenter(room)
|
||||||
|
|
|
||||||
|
|
@ -161,7 +161,7 @@ class FakeMatrixRoom(
|
||||||
|
|
||||||
private var leaveRoomError: Throwable? = null
|
private var leaveRoomError: Throwable? = null
|
||||||
|
|
||||||
private val _roomInfoFlow: MutableSharedFlow<MatrixRoomInfo> = MutableStateFlow(aRoomInfo())
|
private val _roomInfoFlow: MutableSharedFlow<MatrixRoomInfo> = MutableSharedFlow(replay = 1)
|
||||||
override val roomInfoFlow: Flow<MatrixRoomInfo> = _roomInfoFlow
|
override val roomInfoFlow: Flow<MatrixRoomInfo> = _roomInfoFlow
|
||||||
|
|
||||||
override val membersStateFlow: MutableStateFlow<MatrixRoomMembersState> = MutableStateFlow(MatrixRoomMembersState.Unknown)
|
override val membersStateFlow: MutableStateFlow<MatrixRoomMembersState> = MutableStateFlow(MatrixRoomMembersState.Unknown)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue