@@ -38,15 +38,21 @@ import io.element.android.features.messages.impl.timeline.model.event.canReact
38
38
import io.element.android.libraries.architecture.Presenter
39
39
import io.element.android.libraries.featureflag.api.FeatureFlagService
40
40
import io.element.android.libraries.featureflag.api.FeatureFlags
41
+ import io.element.android.libraries.matrix.api.core.EventId
42
+ import io.element.android.libraries.matrix.api.room.MatrixRoom
41
43
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
44
+ import kotlinx.collections.immutable.ImmutableList
45
+ import kotlinx.collections.immutable.persistentListOf
42
46
import kotlinx.collections.immutable.toImmutableList
43
47
import kotlinx.coroutines.CoroutineScope
48
+ import kotlinx.coroutines.flow.map
44
49
import kotlinx.coroutines.launch
45
50
import javax.inject.Inject
46
51
47
52
class ActionListPresenter @Inject constructor(
48
53
private val appPreferencesStore : AppPreferencesStore ,
49
54
private val featureFlagsService : FeatureFlagService ,
55
+ private val room : MatrixRoom ,
50
56
) : Presenter<ActionListState> {
51
57
@Composable
52
58
override fun present (): ActionListState {
@@ -58,6 +64,9 @@ class ActionListPresenter @Inject constructor(
58
64
59
65
val isDeveloperModeEnabled by appPreferencesStore.isDeveloperModeEnabledFlow().collectAsState(initial = false )
60
66
val isPinnedEventsEnabled by featureFlagsService.isFeatureEnabledFlow(FeatureFlags .PinnedEvents ).collectAsState(initial = false )
67
+ val pinnedEventIds by remember {
68
+ room.roomInfoFlow.map { it.pinnedEventIds }
69
+ }.collectAsState(initial = persistentListOf())
61
70
62
71
fun handleEvents (event : ActionListEvents ) {
63
72
when (event) {
@@ -67,6 +76,7 @@ class ActionListPresenter @Inject constructor(
67
76
usersEventPermissions = event.userEventPermissions,
68
77
isDeveloperModeEnabled = isDeveloperModeEnabled,
69
78
isPinnedEventsEnabled = isPinnedEventsEnabled,
79
+ pinnedEventIds = pinnedEventIds,
70
80
target = target,
71
81
)
72
82
}
@@ -83,6 +93,7 @@ class ActionListPresenter @Inject constructor(
83
93
usersEventPermissions : UserEventPermissions ,
84
94
isDeveloperModeEnabled : Boolean ,
85
95
isPinnedEventsEnabled : Boolean ,
96
+ pinnedEventIds : ImmutableList <EventId >,
86
97
target : MutableState <ActionListState .Target >
87
98
) = launch {
88
99
target.value = ActionListState .Target .Loading (timelineItem)
@@ -92,6 +103,7 @@ class ActionListPresenter @Inject constructor(
92
103
usersEventPermissions = usersEventPermissions,
93
104
isDeveloperModeEnabled = isDeveloperModeEnabled,
94
105
isPinnedEventsEnabled = isPinnedEventsEnabled,
106
+ isEventPinned = pinnedEventIds.contains(timelineItem.eventId),
95
107
)
96
108
val displayEmojiReactions = usersEventPermissions.canSendReaction &&
97
109
timelineItem.isRemote &&
@@ -113,6 +125,7 @@ private fun buildActions(
113
125
usersEventPermissions : UserEventPermissions ,
114
126
isDeveloperModeEnabled : Boolean ,
115
127
isPinnedEventsEnabled : Boolean ,
128
+ isEventPinned : Boolean ,
116
129
): List <TimelineItemAction > {
117
130
val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || ! timelineItem.isMine && usersEventPermissions.canRedactOther
118
131
return buildList {
@@ -135,7 +148,11 @@ private fun buildActions(
135
148
// TODO: handle unpin
136
149
val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote
137
150
if (canPinUnpin) {
138
- add(TimelineItemAction .Pin )
151
+ if (isEventPinned) {
152
+ add(TimelineItemAction .Unpin )
153
+ } else {
154
+ add(TimelineItemAction .Pin )
155
+ }
139
156
}
140
157
if (timelineItem.content.canBeCopied()) {
141
158
add(TimelineItemAction .Copy )
0 commit comments