Skip to content

Commit 8aa34d8

Browse files
committed
Use produceState
1 parent 4fefecd commit 8aa34d8

File tree

1 file changed

+11
-13
lines changed

1 file changed

+11
-13
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenter.kt

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ package io.element.android.features.messages.impl.typing
99

1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.runtime.LaunchedEffect
12-
import androidx.compose.runtime.MutableState
12+
import androidx.compose.runtime.ProduceStateScope
1313
import androidx.compose.runtime.collectAsState
1414
import androidx.compose.runtime.getValue
1515
import androidx.compose.runtime.mutableStateOf
16+
import androidx.compose.runtime.produceState
1617
import androidx.compose.runtime.remember
1718
import androidx.compose.runtime.setValue
1819
import io.element.android.libraries.architecture.Presenter
@@ -22,8 +23,9 @@ import io.element.android.libraries.matrix.api.room.RoomMember
2223
import io.element.android.libraries.matrix.api.room.RoomMembershipState
2324
import io.element.android.libraries.matrix.api.room.roomMembers
2425
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
26+
import kotlinx.collections.immutable.ImmutableList
27+
import kotlinx.collections.immutable.persistentListOf
2528
import kotlinx.collections.immutable.toImmutableList
26-
import kotlinx.coroutines.CoroutineScope
2729
import kotlinx.coroutines.flow.combine
2830
import kotlinx.coroutines.flow.distinctUntilChanged
2931
import 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

Comments
 (0)