Pinned messages list : improve and fix code after PR review.
This commit is contained in:
parent
ec4aab0c12
commit
a37a6d249f
11 changed files with 80 additions and 29 deletions
|
|
@ -46,7 +46,7 @@ interface MessagesEntryPoint : FeatureEntryPoint {
|
|||
interface Callback : Plugin {
|
||||
fun onRoomDetailsClick()
|
||||
fun onUserDataClick(userId: UserId)
|
||||
fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean = true)
|
||||
fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean)
|
||||
fun onForwardedToSingleRoom(roomId: RoomId)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ class MessagesFlowNode @AssistedInject constructor(
|
|||
}
|
||||
|
||||
override fun onPermalinkClick(data: PermalinkData) {
|
||||
callbacks.forEach { it.onPermalinkClick(data) }
|
||||
callbacks.forEach { it.onPermalinkClick(data, pushToBackstack = true) }
|
||||
}
|
||||
|
||||
override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) {
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ class PinnedMessagesListPresenter @AssistedInject constructor(
|
|||
fun create(navigator: PinnedMessagesListNavigator): PinnedMessagesListPresenter
|
||||
}
|
||||
|
||||
private val actionListPresenter = actionListPresenterFactory.create(PinnedMessagesListTimelineActionPostProcessor)
|
||||
private val actionListPresenter = actionListPresenterFactory.create(PinnedMessagesListTimelineActionPostProcessor())
|
||||
|
||||
@Composable
|
||||
override fun present(): PinnedMessagesListState {
|
||||
|
|
|
|||
|
|
@ -21,10 +21,17 @@ import io.element.android.features.messages.impl.UserEventPermissions
|
|||
import io.element.android.features.messages.impl.actionlist.ActionListState
|
||||
import io.element.android.features.messages.impl.actionlist.anActionListState
|
||||
import io.element.android.features.messages.impl.timeline.TimelineRoomInfo
|
||||
import io.element.android.features.messages.impl.timeline.aTimelineItemList
|
||||
import io.element.android.features.messages.impl.timeline.aTimelineItemDaySeparator
|
||||
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
|
||||
import io.element.android.features.messages.impl.timeline.aTimelineItemReactions
|
||||
import io.element.android.features.messages.impl.timeline.aTimelineRoomInfo
|
||||
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
||||
import io.element.android.features.messages.impl.timeline.model.TimelineItemGroupPosition
|
||||
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemAudioContent
|
||||
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemFileContent
|
||||
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemPollContent
|
||||
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
|
||||
open class PinnedMessagesListStateProvider : PreviewParameterProvider<PinnedMessagesListState> {
|
||||
|
|
@ -34,7 +41,45 @@ open class PinnedMessagesListStateProvider : PreviewParameterProvider<PinnedMess
|
|||
aLoadingPinnedMessagesListState(),
|
||||
anEmptyPinnedMessagesListState(),
|
||||
aLoadedPinnedMessagesListState(
|
||||
timelineItems = aTimelineItemList(aTimelineItemTextContent())
|
||||
timelineItems = persistentListOf(
|
||||
aTimelineItemEvent(
|
||||
isMine = false,
|
||||
content = aTimelineItemTextContent("A pinned message"),
|
||||
groupPosition = TimelineItemGroupPosition.Last,
|
||||
timelineItemReactions = aTimelineItemReactions(0)
|
||||
),
|
||||
aTimelineItemEvent(
|
||||
isMine = false,
|
||||
content = aTimelineItemAudioContent("A pinned file"),
|
||||
groupPosition = TimelineItemGroupPosition.Middle,
|
||||
timelineItemReactions = aTimelineItemReactions(0)
|
||||
),
|
||||
aTimelineItemEvent(
|
||||
isMine = false,
|
||||
content = aTimelineItemPollContent("A pinned poll?"),
|
||||
groupPosition = TimelineItemGroupPosition.First,
|
||||
timelineItemReactions = aTimelineItemReactions(0)
|
||||
),
|
||||
aTimelineItemDaySeparator(),
|
||||
aTimelineItemEvent(
|
||||
isMine = true,
|
||||
content = aTimelineItemTextContent("A pinned message"),
|
||||
groupPosition = TimelineItemGroupPosition.Last,
|
||||
timelineItemReactions = aTimelineItemReactions(0)
|
||||
),
|
||||
aTimelineItemEvent(
|
||||
isMine = true,
|
||||
content = aTimelineItemFileContent("A pinned file?"),
|
||||
groupPosition = TimelineItemGroupPosition.Middle,
|
||||
timelineItemReactions = aTimelineItemReactions(0)
|
||||
),
|
||||
aTimelineItemEvent(
|
||||
isMine = true,
|
||||
content = aTimelineItemPollContent("A pinned poll?"),
|
||||
groupPosition = TimelineItemGroupPosition.First,
|
||||
timelineItemReactions = aTimelineItemReactions(0)
|
||||
),
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,21 +19,14 @@ package io.element.android.features.messages.impl.pinned.list
|
|||
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
||||
import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionPostProcessor
|
||||
|
||||
object PinnedMessagesListTimelineActionPostProcessor : TimelineItemActionPostProcessor {
|
||||
class PinnedMessagesListTimelineActionPostProcessor : TimelineItemActionPostProcessor {
|
||||
override fun process(actions: List<TimelineItemAction>): List<TimelineItemAction> {
|
||||
return buildList {
|
||||
add(TimelineItemAction.ViewInTimeline)
|
||||
addAll(actions.filter(::predicate))
|
||||
}
|
||||
}
|
||||
|
||||
private fun predicate(action: TimelineItemAction): Boolean {
|
||||
return when (action) {
|
||||
is TimelineItemAction.Unpin,
|
||||
is TimelineItemAction.Redact,
|
||||
is TimelineItemAction.Forward,
|
||||
is TimelineItemAction.ViewSource -> true
|
||||
else -> false
|
||||
actions.firstOrNull { it is TimelineItemAction.Unpin }?.let(::add)
|
||||
actions.firstOrNull { it is TimelineItemAction.Forward }?.let(::add)
|
||||
actions.firstOrNull { it is TimelineItemAction.ViewSource }?.let(::add)
|
||||
actions.firstOrNull { it is TimelineItemAction.Redact }?.let(::add)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
|
|||
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
||||
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
|
||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||
import io.element.android.libraries.matrix.test.A_THROWABLE
|
||||
import io.element.android.libraries.matrix.test.A_UNIQUE_ID
|
||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomInfo
|
||||
|
|
@ -172,10 +173,10 @@ class PinnedMessagesListPresenterTest {
|
|||
|
||||
@Test
|
||||
fun `present - unpin event`() = runTest {
|
||||
val unpinEventLambda = lambdaRecorder { _: EventId? -> Result.success(true) }
|
||||
val pinnedEventsTimeline = createPinnedMessagesTimeline().apply {
|
||||
this.unpinEventLambda = unpinEventLambda
|
||||
}
|
||||
val successUnpinEventLambda = lambdaRecorder { _: EventId? -> Result.success(true) }
|
||||
val failureUnpinEventLambda = lambdaRecorder { _: EventId? -> Result.failure<Boolean>(A_THROWABLE) }
|
||||
val pinnedEventsTimeline = createPinnedMessagesTimeline()
|
||||
|
||||
val room = FakeMatrixRoom(
|
||||
pinnedEventsTimelineResult = { Result.success(pinnedEventsTimeline) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
|
|
@ -189,9 +190,20 @@ class PinnedMessagesListPresenterTest {
|
|||
skipItems(3)
|
||||
val filledState = awaitItem() as PinnedMessagesListState.Filled
|
||||
val eventItem = filledState.timelineItems.first() as TimelineItem.Event
|
||||
|
||||
pinnedEventsTimeline.unpinEventLambda = successUnpinEventLambda
|
||||
filledState.eventSink(PinnedMessagesListEvents.HandleAction(TimelineItemAction.Unpin, eventItem))
|
||||
|
||||
pinnedEventsTimeline.unpinEventLambda = failureUnpinEventLambda
|
||||
filledState.eventSink(PinnedMessagesListEvents.HandleAction(TimelineItemAction.Unpin, eventItem))
|
||||
|
||||
cancelAndIgnoreRemainingEvents()
|
||||
assert(unpinEventLambda)
|
||||
|
||||
assert(successUnpinEventLambda)
|
||||
.isCalledOnce()
|
||||
.with(value(AN_EVENT_ID))
|
||||
|
||||
assert(failureUnpinEventLambda)
|
||||
.isCalledOnce()
|
||||
.with(value(AN_EVENT_ID))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue