Skip to content

Commit 5e47c98

Browse files
committed
Pinned events: branch pin/unpin according to current state
1 parent 97cf00e commit 5e47c98

File tree

1 file changed

+18
-1
lines changed
  • features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist

1 file changed

+18
-1
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,21 @@ import io.element.android.features.messages.impl.timeline.model.event.canReact
3838
import io.element.android.libraries.architecture.Presenter
3939
import io.element.android.libraries.featureflag.api.FeatureFlagService
4040
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
4143
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
44+
import kotlinx.collections.immutable.ImmutableList
45+
import kotlinx.collections.immutable.persistentListOf
4246
import kotlinx.collections.immutable.toImmutableList
4347
import kotlinx.coroutines.CoroutineScope
48+
import kotlinx.coroutines.flow.map
4449
import kotlinx.coroutines.launch
4550
import javax.inject.Inject
4651

4752
class ActionListPresenter @Inject constructor(
4853
private val appPreferencesStore: AppPreferencesStore,
4954
private val featureFlagsService: FeatureFlagService,
55+
private val room: MatrixRoom,
5056
) : Presenter<ActionListState> {
5157
@Composable
5258
override fun present(): ActionListState {
@@ -58,6 +64,9 @@ class ActionListPresenter @Inject constructor(
5864

5965
val isDeveloperModeEnabled by appPreferencesStore.isDeveloperModeEnabledFlow().collectAsState(initial = false)
6066
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())
6170

6271
fun handleEvents(event: ActionListEvents) {
6372
when (event) {
@@ -67,6 +76,7 @@ class ActionListPresenter @Inject constructor(
6776
usersEventPermissions = event.userEventPermissions,
6877
isDeveloperModeEnabled = isDeveloperModeEnabled,
6978
isPinnedEventsEnabled = isPinnedEventsEnabled,
79+
pinnedEventIds = pinnedEventIds,
7080
target = target,
7181
)
7282
}
@@ -83,6 +93,7 @@ class ActionListPresenter @Inject constructor(
8393
usersEventPermissions: UserEventPermissions,
8494
isDeveloperModeEnabled: Boolean,
8595
isPinnedEventsEnabled: Boolean,
96+
pinnedEventIds: ImmutableList<EventId>,
8697
target: MutableState<ActionListState.Target>
8798
) = launch {
8899
target.value = ActionListState.Target.Loading(timelineItem)
@@ -92,6 +103,7 @@ class ActionListPresenter @Inject constructor(
92103
usersEventPermissions = usersEventPermissions,
93104
isDeveloperModeEnabled = isDeveloperModeEnabled,
94105
isPinnedEventsEnabled = isPinnedEventsEnabled,
106+
isEventPinned = pinnedEventIds.contains(timelineItem.eventId),
95107
)
96108
val displayEmojiReactions = usersEventPermissions.canSendReaction &&
97109
timelineItem.isRemote &&
@@ -113,6 +125,7 @@ private fun buildActions(
113125
usersEventPermissions: UserEventPermissions,
114126
isDeveloperModeEnabled: Boolean,
115127
isPinnedEventsEnabled: Boolean,
128+
isEventPinned: Boolean,
116129
): List<TimelineItemAction> {
117130
val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || !timelineItem.isMine && usersEventPermissions.canRedactOther
118131
return buildList {
@@ -135,7 +148,11 @@ private fun buildActions(
135148
// TODO: handle unpin
136149
val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote
137150
if (canPinUnpin) {
138-
add(TimelineItemAction.Pin)
151+
if (isEventPinned) {
152+
add(TimelineItemAction.Unpin)
153+
} else {
154+
add(TimelineItemAction.Pin)
155+
}
139156
}
140157
if (timelineItem.content.canBeCopied()) {
141158
add(TimelineItemAction.Copy)

0 commit comments

Comments
 (0)