Pinned events: branch pin/unpin according to current state
This commit is contained in:
parent
56b8b377e4
commit
ed3593f35a
1 changed files with 18 additions and 1 deletions
|
|
@ -38,15 +38,21 @@ import io.element.android.features.messages.impl.timeline.model.event.canReact
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
||||||
import io.element.android.libraries.featureflag.api.FeatureFlags
|
import io.element.android.libraries.featureflag.api.FeatureFlags
|
||||||
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
|
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ActionListPresenter @Inject constructor(
|
class ActionListPresenter @Inject constructor(
|
||||||
private val appPreferencesStore: AppPreferencesStore,
|
private val appPreferencesStore: AppPreferencesStore,
|
||||||
private val featureFlagsService: FeatureFlagService,
|
private val featureFlagsService: FeatureFlagService,
|
||||||
|
private val room: MatrixRoom,
|
||||||
) : Presenter<ActionListState> {
|
) : Presenter<ActionListState> {
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): ActionListState {
|
override fun present(): ActionListState {
|
||||||
|
|
@ -58,6 +64,9 @@ class ActionListPresenter @Inject constructor(
|
||||||
|
|
||||||
val isDeveloperModeEnabled by appPreferencesStore.isDeveloperModeEnabledFlow().collectAsState(initial = false)
|
val isDeveloperModeEnabled by appPreferencesStore.isDeveloperModeEnabledFlow().collectAsState(initial = false)
|
||||||
val isPinnedEventsEnabled by featureFlagsService.isFeatureEnabledFlow(FeatureFlags.PinnedEvents).collectAsState(initial = false)
|
val isPinnedEventsEnabled by featureFlagsService.isFeatureEnabledFlow(FeatureFlags.PinnedEvents).collectAsState(initial = false)
|
||||||
|
val pinnedEventIds by remember {
|
||||||
|
room.roomInfoFlow.map { it.pinnedEventIds }
|
||||||
|
}.collectAsState(initial = persistentListOf())
|
||||||
|
|
||||||
fun handleEvents(event: ActionListEvents) {
|
fun handleEvents(event: ActionListEvents) {
|
||||||
when (event) {
|
when (event) {
|
||||||
|
|
@ -67,6 +76,7 @@ class ActionListPresenter @Inject constructor(
|
||||||
usersEventPermissions = event.userEventPermissions,
|
usersEventPermissions = event.userEventPermissions,
|
||||||
isDeveloperModeEnabled = isDeveloperModeEnabled,
|
isDeveloperModeEnabled = isDeveloperModeEnabled,
|
||||||
isPinnedEventsEnabled = isPinnedEventsEnabled,
|
isPinnedEventsEnabled = isPinnedEventsEnabled,
|
||||||
|
pinnedEventIds = pinnedEventIds,
|
||||||
target = target,
|
target = target,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -83,6 +93,7 @@ class ActionListPresenter @Inject constructor(
|
||||||
usersEventPermissions: UserEventPermissions,
|
usersEventPermissions: UserEventPermissions,
|
||||||
isDeveloperModeEnabled: Boolean,
|
isDeveloperModeEnabled: Boolean,
|
||||||
isPinnedEventsEnabled: Boolean,
|
isPinnedEventsEnabled: Boolean,
|
||||||
|
pinnedEventIds: ImmutableList<EventId>,
|
||||||
target: MutableState<ActionListState.Target>
|
target: MutableState<ActionListState.Target>
|
||||||
) = launch {
|
) = launch {
|
||||||
target.value = ActionListState.Target.Loading(timelineItem)
|
target.value = ActionListState.Target.Loading(timelineItem)
|
||||||
|
|
@ -92,6 +103,7 @@ class ActionListPresenter @Inject constructor(
|
||||||
usersEventPermissions = usersEventPermissions,
|
usersEventPermissions = usersEventPermissions,
|
||||||
isDeveloperModeEnabled = isDeveloperModeEnabled,
|
isDeveloperModeEnabled = isDeveloperModeEnabled,
|
||||||
isPinnedEventsEnabled = isPinnedEventsEnabled,
|
isPinnedEventsEnabled = isPinnedEventsEnabled,
|
||||||
|
isEventPinned = pinnedEventIds.contains(timelineItem.eventId),
|
||||||
)
|
)
|
||||||
val displayEmojiReactions = usersEventPermissions.canSendReaction &&
|
val displayEmojiReactions = usersEventPermissions.canSendReaction &&
|
||||||
timelineItem.isRemote &&
|
timelineItem.isRemote &&
|
||||||
|
|
@ -113,6 +125,7 @@ private fun buildActions(
|
||||||
usersEventPermissions: UserEventPermissions,
|
usersEventPermissions: UserEventPermissions,
|
||||||
isDeveloperModeEnabled: Boolean,
|
isDeveloperModeEnabled: Boolean,
|
||||||
isPinnedEventsEnabled: Boolean,
|
isPinnedEventsEnabled: Boolean,
|
||||||
|
isEventPinned: Boolean,
|
||||||
): List<TimelineItemAction> {
|
): List<TimelineItemAction> {
|
||||||
val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || !timelineItem.isMine && usersEventPermissions.canRedactOther
|
val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || !timelineItem.isMine && usersEventPermissions.canRedactOther
|
||||||
return buildList {
|
return buildList {
|
||||||
|
|
@ -135,7 +148,11 @@ private fun buildActions(
|
||||||
// TODO: handle unpin
|
// TODO: handle unpin
|
||||||
val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote
|
val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote
|
||||||
if (canPinUnpin) {
|
if (canPinUnpin) {
|
||||||
add(TimelineItemAction.Pin)
|
if (isEventPinned) {
|
||||||
|
add(TimelineItemAction.Unpin)
|
||||||
|
} else {
|
||||||
|
add(TimelineItemAction.Pin)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (timelineItem.content.canBeCopied()) {
|
if (timelineItem.content.canBeCopied()) {
|
||||||
add(TimelineItemAction.Copy)
|
add(TimelineItemAction.Copy)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue