@@ -9,10 +9,11 @@ package io.element.android.features.messages.impl.typing
99
1010import androidx.compose.runtime.Composable
1111import androidx.compose.runtime.LaunchedEffect
12- import androidx.compose.runtime.MutableState
12+ import androidx.compose.runtime.ProduceStateScope
1313import androidx.compose.runtime.collectAsState
1414import androidx.compose.runtime.getValue
1515import androidx.compose.runtime.mutableStateOf
16+ import androidx.compose.runtime.produceState
1617import androidx.compose.runtime.remember
1718import androidx.compose.runtime.setValue
1819import io.element.android.libraries.architecture.Presenter
@@ -22,8 +23,9 @@ import io.element.android.libraries.matrix.api.room.RoomMember
2223import io.element.android.libraries.matrix.api.room.RoomMembershipState
2324import io.element.android.libraries.matrix.api.room.roomMembers
2425import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
26+ import kotlinx.collections.immutable.ImmutableList
27+ import kotlinx.collections.immutable.persistentListOf
2528import kotlinx.collections.immutable.toImmutableList
26- import kotlinx.coroutines.CoroutineScope
2729import kotlinx.coroutines.flow.combine
2830import kotlinx.coroutines.flow.distinctUntilChanged
2931import kotlinx.coroutines.flow.launchIn
@@ -36,33 +38,29 @@ class TypingNotificationPresenter @Inject constructor(
3638) : Presenter<TypingNotificationState> {
3739 @Composable
3840 override fun present (): TypingNotificationState {
39- val typingMembersState = remember { mutableStateOf(emptyList<RoomMember >()) }
4041 val renderTypingNotifications by sessionPreferencesStore.isRenderTypingNotificationsEnabled().collectAsState(initial = true )
41-
42- LaunchedEffect (renderTypingNotifications) {
42+ val typingMembersState by produceState(initialValue = persistentListOf(), key1 = renderTypingNotifications) {
4343 if (renderTypingNotifications) {
44- observeRoomTypingMembers(typingMembersState)
45- } else {
46- typingMembersState.value = emptyList()
44+ observeRoomTypingMembers()
4745 }
4846 }
4947
5048 // This will keep the space reserved for the typing notifications after the first one is displayed
5149 var reserveSpace by remember { mutableStateOf(false ) }
52- LaunchedEffect (renderTypingNotifications, typingMembersState.value ) {
53- if (renderTypingNotifications && typingMembersState.value. isNotEmpty()) {
50+ LaunchedEffect (renderTypingNotifications, typingMembersState) {
51+ if (renderTypingNotifications && typingMembersState.isNotEmpty()) {
5452 reserveSpace = true
5553 }
5654 }
5755
5856 return TypingNotificationState (
5957 renderTypingNotifications = renderTypingNotifications,
60- typingMembers = typingMembersState.value.toImmutableList() ,
58+ typingMembers = typingMembersState,
6159 reserveSpace = reserveSpace,
6260 )
6361 }
6462
65- private fun CoroutineScope. observeRoomTypingMembers ( typingMembersState : MutableState < List <RoomMember >>) {
63+ private fun ProduceStateScope<ImmutableList <RoomMember>>. observeRoomTypingMembers ( ) {
6664 combine(room.roomTypingMembersFlow, room.membersStateFlow) { typingMembers, membersState ->
6765 typingMembers
6866 .map { userId ->
@@ -73,7 +71,7 @@ class TypingNotificationPresenter @Inject constructor(
7371 }
7472 .distinctUntilChanged()
7573 .onEach { members ->
76- typingMembersState. value = members
74+ value = members.toImmutableList()
7775 }
7876 .launchIn(this )
7977 }
0 commit comments