@@ -26,10 +26,9 @@ import androidx.compose.runtime.remember
26
26
import androidx.compose.runtime.rememberUpdatedState
27
27
import androidx.compose.runtime.saveable.rememberSaveable
28
28
import androidx.compose.runtime.setValue
29
+ import io.element.android.features.messages.impl.pinned.IsPinnedMessagesFeatureEnabled
29
30
import io.element.android.features.networkmonitor.api.NetworkMonitor
30
31
import io.element.android.libraries.architecture.Presenter
31
- import io.element.android.libraries.featureflag.api.FeatureFlagService
32
- import io.element.android.libraries.featureflag.api.FeatureFlags
33
32
import io.element.android.libraries.matrix.api.room.MatrixRoom
34
33
import kotlinx.collections.immutable.ImmutableList
35
34
import kotlinx.collections.immutable.persistentListOf
@@ -46,21 +45,20 @@ import kotlin.time.Duration.Companion.milliseconds
46
45
class PinnedMessagesBannerPresenter @Inject constructor(
47
46
private val room : MatrixRoom ,
48
47
private val itemFactory : PinnedMessagesBannerItemFactory ,
49
- private val featureFlagService : FeatureFlagService ,
48
+ private val isFeatureEnabled : IsPinnedMessagesFeatureEnabled ,
50
49
private val networkMonitor : NetworkMonitor ,
51
50
) : Presenter<PinnedMessagesBannerState> {
51
+ private val pinnedItems = mutableStateOf<ImmutableList <PinnedMessagesBannerItem >>(persistentListOf())
52
+
52
53
@Composable
53
54
override fun present (): PinnedMessagesBannerState {
54
- val isFeatureEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags .PinnedEvents ).collectAsState(initial = false )
55
- var hasTimelineFailedToLoad by rememberSaveable { mutableStateOf(false ) }
56
- var currentPinnedMessageIndex by rememberSaveable { mutableIntStateOf(- 1 ) }
55
+ val isFeatureEnabled = isFeatureEnabled()
57
56
val knownPinnedMessagesCount by remember {
58
57
room.roomInfoFlow.map { roomInfo -> roomInfo.pinnedEventIds.size }
59
58
}.collectAsState(initial = 0 )
60
59
61
- var pinnedItems by remember {
62
- mutableStateOf<ImmutableList <PinnedMessagesBannerItem >>(persistentListOf())
63
- }
60
+ var hasTimelineFailedToLoad by rememberSaveable { mutableStateOf(false ) }
61
+ var currentPinnedMessageIndex by rememberSaveable { mutableIntStateOf(- 1 ) }
64
62
65
63
PinnedMessagesBannerItemsEffect (
66
64
isFeatureEnabled = isFeatureEnabled,
@@ -69,7 +67,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
69
67
if (currentPinnedMessageIndex >= pinnedMessageCount || currentPinnedMessageIndex < 0 ) {
70
68
currentPinnedMessageIndex = pinnedMessageCount - 1
71
69
}
72
- pinnedItems = newItems
70
+ pinnedItems.value = newItems
73
71
},
74
72
onTimelineFail = { hasTimelineFailed ->
75
73
hasTimelineFailedToLoad = hasTimelineFailed
@@ -82,7 +80,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
82
80
if (currentPinnedMessageIndex > 0 ) {
83
81
currentPinnedMessageIndex--
84
82
} else {
85
- currentPinnedMessageIndex = pinnedItems.size - 1
83
+ currentPinnedMessageIndex = pinnedItems.value. size - 1
86
84
}
87
85
}
88
86
}
@@ -92,7 +90,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
92
90
isFeatureEnabled = isFeatureEnabled,
93
91
hasTimelineFailed = hasTimelineFailedToLoad,
94
92
realPinnedMessagesCount = knownPinnedMessagesCount,
95
- pinnedItems = pinnedItems,
93
+ pinnedItems = pinnedItems.value ,
96
94
currentPinnedMessageIndex = currentPinnedMessageIndex,
97
95
eventSink = ::handleEvent
98
96
)
@@ -111,16 +109,14 @@ class PinnedMessagesBannerPresenter @Inject constructor(
111
109
return when {
112
110
! isFeatureEnabled -> PinnedMessagesBannerState .Hidden
113
111
hasTimelineFailed -> PinnedMessagesBannerState .Hidden
112
+ currentPinnedMessage != null -> PinnedMessagesBannerState .Loaded (
113
+ currentPinnedMessage = currentPinnedMessage,
114
+ currentPinnedMessageIndex = currentPinnedMessageIndex,
115
+ knownPinnedMessagesCount = pinnedItems.size,
116
+ eventSink = eventSink
117
+ )
114
118
realPinnedMessagesCount == 0 -> PinnedMessagesBannerState .Hidden
115
- currentPinnedMessage == null -> PinnedMessagesBannerState .Loading (realPinnedMessagesCount = realPinnedMessagesCount)
116
- else -> {
117
- PinnedMessagesBannerState .Loaded (
118
- currentPinnedMessage = currentPinnedMessage,
119
- currentPinnedMessageIndex = currentPinnedMessageIndex,
120
- knownPinnedMessagesCount = pinnedItems.size,
121
- eventSink = eventSink
122
- )
123
- }
119
+ else -> PinnedMessagesBannerState .Loading (realPinnedMessagesCount = realPinnedMessagesCount)
124
120
}
125
121
}
126
122
@@ -136,8 +132,10 @@ class PinnedMessagesBannerPresenter @Inject constructor(
136
132
val networkStatus by networkMonitor.connectivity.collectAsState()
137
133
138
134
LaunchedEffect (isFeatureEnabled, networkStatus) {
139
- if (! isFeatureEnabled) return @LaunchedEffect
140
-
135
+ if (! isFeatureEnabled) {
136
+ updatedOnItemsChange(persistentListOf())
137
+ return @LaunchedEffect
138
+ }
141
139
val pinnedEventsTimeline = room.pinnedEventsTimeline()
142
140
.onFailure { updatedOnTimelineFail(true ) }
143
141
.onSuccess { updatedOnTimelineFail(false ) }
0 commit comments