MessagesEvents -> MessagesEvent

This commit is contained in:
Benoit Marty
2026-01-27 09:38:45 +01:00
parent f184562d8f
commit a1e5afcdd5
8 changed files with 79 additions and 79 deletions

View File

@@ -13,12 +13,12 @@ import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId
import io.element.android.libraries.matrix.api.user.MatrixUser
sealed interface MessagesEvents {
data class HandleAction(val action: TimelineItemAction, val event: TimelineItem.Event) : MessagesEvents
data class ToggleReaction(val emoji: String, val eventOrTransactionId: EventOrTransactionId) : MessagesEvents
data class InviteDialogDismissed(val action: InviteDialogAction) : MessagesEvents
data class OnUserClicked(val user: MatrixUser) : MessagesEvents
data object MarkAsFullyReadAndExit : MessagesEvents
sealed interface MessagesEvent {
data class HandleAction(val action: TimelineItemAction, val event: TimelineItem.Event) : MessagesEvent
data class ToggleReaction(val emoji: String, val eventOrTransactionId: EventOrTransactionId) : MessagesEvent
data class InviteDialogDismissed(val action: InviteDialogAction) : MessagesEvent
data class OnUserClicked(val user: MatrixUser) : MessagesEvent
data object MarkAsFullyReadAndExit : MessagesEvent
}
enum class InviteDialogAction {

View File

@@ -242,7 +242,7 @@ class MessagesNode(
val state = presenter.present()
BackHandler {
state.eventSink(MessagesEvents.MarkAsFullyReadAndExit)
state.eventSink(MessagesEvent.MarkAsFullyReadAndExit)
}
OnLifecycleEvent { _, event ->
@@ -253,7 +253,7 @@ class MessagesNode(
}
MessagesView(
state = state,
onBackClick = { state.eventSink(MessagesEvents.MarkAsFullyReadAndExit) },
onBackClick = { state.eventSink(MessagesEvent.MarkAsFullyReadAndExit) },
onRoomDetailsClick = callback::navigateToRoomDetails,
onEventContentClick = { isLive, event ->
if (isLive) {

View File

@@ -220,9 +220,9 @@ class MessagesPresenter(
onPauseOrDispose {}
}
fun handleEvent(event: MessagesEvents) {
fun handleEvent(event: MessagesEvent) {
when (event) {
is MessagesEvents.HandleAction -> {
is MessagesEvent.HandleAction -> {
localCoroutineScope.handleTimelineAction(
action = event.action,
targetEvent = event.event,
@@ -232,20 +232,20 @@ class MessagesPresenter(
timelineProtectionState = timelineProtectionState,
)
}
is MessagesEvents.ToggleReaction -> {
is MessagesEvent.ToggleReaction -> {
localCoroutineScope.toggleReaction(event.emoji, event.eventOrTransactionId)
}
is MessagesEvents.InviteDialogDismissed -> {
is MessagesEvent.InviteDialogDismissed -> {
hasDismissedInviteDialog = true
if (event.action == InviteDialogAction.Invite) {
localCoroutineScope.reinviteOtherUser(inviteProgress)
}
}
is MessagesEvents.OnUserClicked -> {
is MessagesEvent.OnUserClicked -> {
roomMemberModerationState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(event.user))
}
is MessagesEvents.MarkAsFullyReadAndExit -> coroutineScope.launch {
is MessagesEvent.MarkAsFullyReadAndExit -> coroutineScope.launch {
if (!markingAsReadAndExiting.getAndSet(true)) {
val latestEventId = room.liveTimeline.getLatestEventId().getOrElse {
Timber.w(it, "Failed to get latest event id to mark as fully read")

View File

@@ -57,7 +57,7 @@ data class MessagesState(
val dmUserVerificationState: IdentityState?,
val roomMemberModerationState: RoomMemberModerationState,
val successorRoom: SuccessorRoom?,
val eventSink: (MessagesEvents) -> Unit
val eventSink: (MessagesEvent) -> Unit
) {
val isTombstoned = successorRoom != null
}

View File

@@ -133,7 +133,7 @@ fun aMessagesState(
dmUserVerificationState: IdentityState? = null,
roomMemberModerationState: RoomMemberModerationState = aRoomMemberModerationState(),
successorRoom: SuccessorRoom? = null,
eventSink: (MessagesEvents) -> Unit = {},
eventSink: (MessagesEvent) -> Unit = {},
) = MessagesState(
roomId = RoomId("!id:domain"),
roomName = roomName,

View File

@@ -178,11 +178,11 @@ fun MessagesView(
}
fun onActionSelected(action: TimelineItemAction, event: TimelineItem.Event) {
state.eventSink(MessagesEvents.HandleAction(action, event))
state.eventSink(MessagesEvent.HandleAction(action, event))
}
fun onEmojiReactionClick(emoji: String, event: TimelineItem.Event) {
state.eventSink(MessagesEvents.ToggleReaction(emoji, event.eventOrTransactionId))
state.eventSink(MessagesEvent.ToggleReaction(emoji, event.eventOrTransactionId))
}
fun onEmojiReactionLongClick(emoji: String, event: TimelineItem.Event) {
@@ -244,7 +244,7 @@ fun MessagesView(
onMessageLongClick = ::onMessageLongClick,
onUserDataClick = {
hidingKeyboard {
state.eventSink(MessagesEvents.OnUserClicked(it))
state.eventSink(MessagesEvent.OnUserClicked(it))
}
},
onLinkClick = { link, customTab ->
@@ -264,7 +264,7 @@ fun MessagesView(
onSendLocationClick = onSendLocationClick,
onCreatePollClick = onCreatePollClick,
onSwipeToReply = { targetEvent ->
state.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, targetEvent))
state.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, targetEvent))
},
forceJumpToBottomVisibility = forceJumpToBottomVisibility,
onJoinCallClick = onJoinCallClick,
@@ -378,7 +378,7 @@ fun MessagesView(
CustomReactionBottomSheet(
state = state.customReactionState,
onSelectEmoji = { uniqueId, emoji ->
state.eventSink(MessagesEvents.ToggleReaction(emoji.unicode, uniqueId))
state.eventSink(MessagesEvent.ToggleReaction(emoji.unicode, uniqueId))
}
)
@@ -404,8 +404,8 @@ private fun ReinviteDialog(state: MessagesState) {
content = stringResource(id = R.string.screen_room_invite_again_alert_message),
cancelText = stringResource(id = CommonStrings.action_cancel),
submitText = stringResource(id = CommonStrings.action_invite),
onSubmitClick = { state.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite)) },
onDismiss = { state.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Cancel)) }
onSubmitClick = { state.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Invite)) },
onDismiss = { state.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Cancel)) }
)
}
}

View File

@@ -185,14 +185,14 @@ class MessagesPresenterTest {
presenter.testWithLifecycleOwner {
skipItems(1)
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
initialState.eventSink(MessagesEvent.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
advanceUntilIdle()
assert(toggleReactionSuccess)
.isCalledOnce()
.with(value("👍"), value(AN_EVENT_ID.toEventOrTransactionId()))
// No crashes when sending a reaction failed
timeline.toggleReactionLambda = toggleReactionFailure
initialState.eventSink(MessagesEvents.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
initialState.eventSink(MessagesEvent.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
advanceUntilIdle()
assert(toggleReactionFailure)
.isCalledOnce()
@@ -230,8 +230,8 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
initialState.eventSink(MessagesEvents.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
initialState.eventSink(MessagesEvent.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
initialState.eventSink(MessagesEvent.ToggleReaction("👍", AN_EVENT_ID.toEventOrTransactionId()))
advanceUntilIdle()
assert(toggleReactionSuccess)
.isCalledExactly(2)
@@ -253,7 +253,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(navigator = navigator)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Forward, aMessageEvent()))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Forward, aMessageEvent()))
assertThat(awaitItem().actionListState.target).isEqualTo(ActionListState.Target.None)
onForwardEventClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID))
}
@@ -266,7 +266,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(clipboardHelper = clipboardHelper)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.CopyText, event))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.CopyText, event))
skipItems(2)
assertThat(clipboardHelper.clipboardContents).isEqualTo((event.content as TimelineItemTextContent).body)
}
@@ -289,7 +289,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.CopyLink, event))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.CopyLink, event))
skipItems(2)
assertThat(clipboardHelper.clipboardContents).isEqualTo("a link")
}
@@ -303,7 +303,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, aMessageEvent()))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, aMessageEvent()))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -321,7 +321,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter()
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, aMessageEvent(eventId = null)))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, aMessageEvent(eventId = null)))
skipItems(1)
}
}
@@ -354,7 +354,7 @@ class MessagesPresenterTest {
formattedFileSize = "4MB"
)
)
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, mediaMessage))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, mediaMessage))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -396,7 +396,7 @@ class MessagesPresenterTest {
formattedFileSize = "50MB"
)
)
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, mediaMessage))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, mediaMessage))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -431,7 +431,7 @@ class MessagesPresenterTest {
fileExtension = "pdf",
)
)
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, mediaMessage))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, mediaMessage))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -452,7 +452,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Edit, aMessageEvent()))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Edit, aMessageEvent()))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -474,7 +474,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(navigator = navigator)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.EditPoll, aMessageEvent(content = aTimelineItemPollContent())))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.EditPoll, aMessageEvent(content = aTimelineItemPollContent())))
awaitItem()
onEditPollClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID))
}
@@ -486,7 +486,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(timelineEventSink = timelineEventSink)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.EndPoll, aMessageEvent(content = aTimelineItemPollContent())))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.EndPoll, aMessageEvent(content = aTimelineItemPollContent())))
delay(1)
timelineEventSink.assertSingle(TimelineEvents.EndPoll(AN_EVENT_ID))
cancelAndIgnoreRemainingEvents()
@@ -516,7 +516,7 @@ class MessagesPresenterTest {
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
val messageEvent = aMessageEvent()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Redact, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Redact, messageEvent))
awaitItem()
assert(redactEventLambda)
.isCalledOnce()
@@ -533,7 +533,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(navigator = navigator)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.ReportContent, aMessageEvent()))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.ReportContent, aMessageEvent()))
assertThat(awaitItem().actionListState.target).isEqualTo(ActionListState.Target.None)
onReportContentClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID), value(A_USER_ID))
}
@@ -548,7 +548,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(navigator = navigator)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.ViewSource, aMessageEvent()))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.ViewSource, aMessageEvent()))
assertThat(awaitItem().actionListState.target).isEqualTo(ActionListState.Target.None)
onShowEventDebugInfoClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID), value(aTimelineItemDebugInfo()))
}
@@ -576,7 +576,7 @@ class MessagesPresenterTest {
val focusedState = awaitItem()
assertThat(focusedState.showReinvitePrompt).isTrue()
// If it's dismissed then we stop showing the alert
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Cancel))
initialState.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Cancel))
skipItems(1)
val dismissedState = awaitItem()
assertThat(dismissedState.showReinvitePrompt).isFalse()
@@ -648,7 +648,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(joinedRoom = room)
presenter.testWithLifecycleOwner {
val initialState = consumeItemsUntilTimeout().last()
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
initialState.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Invite))
skipItems(1)
val loadingState = awaitItem()
assertThat(loadingState.inviteProgress.isLoading()).isTrue()
@@ -680,7 +680,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(joinedRoom = room)
presenter.testWithLifecycleOwner {
val initialState = consumeItemsUntilTimeout().last()
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
initialState.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Invite))
skipItems(1)
val loadingState = consumeItemsUntilPredicate { state ->
state.inviteProgress.isLoading()
@@ -704,7 +704,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(joinedRoom = room)
presenter.testWithLifecycleOwner {
val initialState = consumeItemsUntilTimeout().last()
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
initialState.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Invite))
skipItems(1)
val loadingState = awaitItem()
assertThat(loadingState.inviteProgress.isLoading()).isTrue()
@@ -733,7 +733,7 @@ class MessagesPresenterTest {
val presenter = createMessagesPresenter(joinedRoom = room)
presenter.testWithLifecycleOwner {
val initialState = consumeItemsUntilTimeout().last()
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
initialState.eventSink(MessagesEvent.InviteDialogDismissed(InviteDialogAction.Invite))
val loadingState = consumeItemsUntilPredicate { state ->
state.inviteProgress.isLoading()
@@ -830,7 +830,7 @@ class MessagesPresenterTest {
val poll = aMessageEvent(
content = aTimelineItemPollContent()
)
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, poll))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, poll))
skipItems(1)
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -868,11 +868,11 @@ class MessagesPresenterTest {
val initialState = awaitItem()
timeline.pinEventLambda = successPinEventLambda
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Pin, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Pin, messageEvent))
assert(successPinEventLambda).isCalledOnce().with(value(messageEvent.eventId))
timeline.pinEventLambda = failurePinEventLambda
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Pin, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Pin, messageEvent))
assert(failurePinEventLambda).isCalledOnce().with(value(messageEvent.eventId))
skipItems(1)
assertThat(awaitItem().snackbarMessage).isNotNull()
@@ -908,11 +908,11 @@ class MessagesPresenterTest {
val initialState = awaitItem()
timeline.unpinEventLambda = successUnpinEventLambda
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Unpin, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Unpin, messageEvent))
assert(successUnpinEventLambda).isCalledOnce().with(value(messageEvent.eventId))
timeline.unpinEventLambda = failureUnpinEventLambda
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Unpin, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Unpin, messageEvent))
assert(failureUnpinEventLambda).isCalledOnce().with(value(messageEvent.eventId))
skipItems(1)
assertThat(awaitItem().snackbarMessage).isNotNull()
@@ -936,7 +936,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.EditCaption, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.EditCaption, messageEvent))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -962,7 +962,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.AddCaption, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.AddCaption, messageEvent))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -1000,7 +1000,7 @@ class MessagesPresenterTest {
presenter.testWithLifecycleOwner {
skipItems(1)
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.RemoveCaption, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.RemoveCaption, messageEvent))
editCaptionLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID.toEventOrTransactionId()), value(null), value(null))
}
}
@@ -1014,7 +1014,7 @@ class MessagesPresenterTest {
presenter.testWithLifecycleOwner {
skipItems(1)
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.ViewInTimeline, messageEvent))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.ViewInTimeline, messageEvent))
// No op!
}
}
@@ -1108,7 +1108,7 @@ class MessagesPresenterTest {
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(
MessagesEvents.HandleAction(
MessagesEvent.HandleAction(
action = TimelineItemAction.ReplyInThread,
event = aMessageEvent(threadInfo = TimelineItemThreadInfo.ThreadResponse(A_THREAD_ID))
)
@@ -1130,7 +1130,7 @@ class MessagesPresenterTest {
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(
MessagesEvents.HandleAction(
MessagesEvent.HandleAction(
action = TimelineItemAction.ReplyInThread,
event = aMessageEvent(
// The event id will be used as the thread id instead
@@ -1155,7 +1155,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.ReplyInThread, aMessageEvent()))
initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.ReplyInThread, aMessageEvent()))
awaitItem()
composerRecorder.assertSingle(
MessageComposerEvent.SetMode(
@@ -1182,7 +1182,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.MarkAsFullyReadAndExit)
initialState.eventSink(MessagesEvent.MarkAsFullyReadAndExit)
runCurrent()
@@ -1206,7 +1206,7 @@ class MessagesPresenterTest {
)
presenter.testWithLifecycleOwner {
val initialState = awaitItem()
initialState.eventSink(MessagesEvents.MarkAsFullyReadAndExit)
initialState.eventSink(MessagesEvent.MarkAsFullyReadAndExit)
runCurrent()

View File

@@ -88,7 +88,7 @@ class MessagesViewTest {
@Test
fun `clicking on back invoke expected callback`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
eventSink = eventsRecorder
)
@@ -103,7 +103,7 @@ class MessagesViewTest {
@Test
fun `clicking on room name invoke expected callback`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
eventSink = eventsRecorder
)
@@ -118,7 +118,7 @@ class MessagesViewTest {
@Test
fun `clicking on join call invoke expected callback`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
eventSink = eventsRecorder
)
@@ -134,7 +134,7 @@ class MessagesViewTest {
@Test
fun `clicking on an Event invoke expected callback`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
timelineState = aTimelineState(
timelineItems = aTimelineItemList(aTimelineItemTextContent()),
@@ -253,7 +253,7 @@ class MessagesViewTest {
}
private fun swipeTest(userHasPermissionToSendMessage: Boolean) {
val eventsRecorder = EventsRecorder<MessagesEvents>()
val eventsRecorder = EventsRecorder<MessagesEvent>()
val canBeRepliedEvent = aTimelineItemEvent(canBeRepliedTo = true)
val cannotBeRepliedEvent = aTimelineItemEvent(canBeRepliedTo = false)
val state = aMessagesState(
@@ -273,7 +273,7 @@ class MessagesViewTest {
onLast().performTouchInput { swipeRight(endX = 200f) }
}
if (userHasPermissionToSendMessage) {
eventsRecorder.assertSingle(MessagesEvents.HandleAction(TimelineItemAction.Reply, canBeRepliedEvent))
eventsRecorder.assertSingle(MessagesEvent.HandleAction(TimelineItemAction.Reply, canBeRepliedEvent))
} else {
eventsRecorder.assertEmpty()
}
@@ -281,7 +281,7 @@ class MessagesViewTest {
@Test
fun `clicking on send location invoke expected callback`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
composerState = aMessageComposerState(
showAttachmentSourcePicker = true
@@ -299,7 +299,7 @@ class MessagesViewTest {
@Test
fun `clicking on create poll invoke expected callback`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
composerState = aMessageComposerState(
showAttachmentSourcePicker = true
@@ -319,7 +319,7 @@ class MessagesViewTest {
@Test
@Config(qualifiers = "h1024dp")
fun `clicking on the avatar of the sender of an Event emits the expected event`() {
val eventsRecorder = EventsRecorder<MessagesEvents>()
val eventsRecorder = EventsRecorder<MessagesEvent>()
val state = aMessagesState(
eventSink = eventsRecorder
)
@@ -327,7 +327,7 @@ class MessagesViewTest {
rule.setMessagesView(state = state)
rule.onNodeWithTag(TestTags.timelineItemSenderAvatar.value, useUnmergedTree = true).performClick()
eventsRecorder.assertSingle(
MessagesEvents.OnUserClicked(
MessagesEvent.OnUserClicked(
MatrixUser(
userId = timelineEvent.senderId,
displayName = timelineEvent.senderProfile.getDisplayName(),
@@ -340,13 +340,13 @@ class MessagesViewTest {
@Test
@Config(qualifiers = "h1024dp")
fun `clicking on the display name of the sender of an Event emits expected event`() {
val eventsRecorder = EventsRecorder<MessagesEvents>()
val eventsRecorder = EventsRecorder<MessagesEvent>()
val state = aMessagesState(eventSink = eventsRecorder)
val timelineEvent = state.timelineState.timelineItems.filterIsInstance<TimelineItem.Event>().first()
rule.setMessagesView(state = state)
rule.onNodeWithTag(TestTags.timelineItemSenderAvatar.value, useUnmergedTree = true).performClick()
eventsRecorder.assertSingle(
MessagesEvents.OnUserClicked(
MessagesEvent.OnUserClicked(
MatrixUser(
userId = timelineEvent.senderId,
displayName = timelineEvent.senderProfile.getDisplayName(),
@@ -358,7 +358,7 @@ class MessagesViewTest {
@Test
fun `selecting a action on a message emits the expected Event`() {
val eventsRecorder = EventsRecorder<MessagesEvents>()
val eventsRecorder = EventsRecorder<MessagesEvent>()
val state = aMessagesState(
eventSink = eventsRecorder
)
@@ -381,12 +381,12 @@ class MessagesViewTest {
rule.clickOn(CommonStrings.action_edit)
// Give time for the close animation to complete
rule.mainClock.advanceTimeBy(milliseconds = 1_000)
eventsRecorder.assertSingle(MessagesEvents.HandleAction(TimelineItemAction.Edit, timelineItem))
eventsRecorder.assertSingle(MessagesEvent.HandleAction(TimelineItemAction.Edit, timelineItem))
}
@Test
fun `clicking on a reaction emits the expected Event`() {
val eventsRecorder = EventsRecorder<MessagesEvents>()
val eventsRecorder = EventsRecorder<MessagesEvent>()
val state = aMessagesState(
timelineState = aTimelineState(
timelineItems = aTimelineItemList(aTimelineItemTextContent()),
@@ -401,7 +401,7 @@ class MessagesViewTest {
text = "👍️",
useUnmergedTree = true,
).onFirst().performClick()
eventsRecorder.assertSingle(MessagesEvents.ToggleReaction("👍️", timelineItem.eventOrTransactionId))
eventsRecorder.assertSingle(MessagesEvent.ToggleReaction("👍️", timelineItem.eventOrTransactionId))
}
@Test
@@ -513,7 +513,7 @@ class MessagesViewTest {
fun `clicking on a custom emoji emits the expected Events`() {
val aUnicode = "🙈"
val customReactionStateEventsRecorder = EventsRecorder<CustomReactionEvents>()
val eventsRecorder = EventsRecorder<MessagesEvents>()
val eventsRecorder = EventsRecorder<MessagesEvent>()
val state = aMessagesState(
eventSink = eventsRecorder,
)
@@ -547,7 +547,7 @@ class MessagesViewTest {
// Give time for the close animation to complete
rule.mainClock.advanceTimeBy(milliseconds = 1_000)
customReactionStateEventsRecorder.assertSingle(CustomReactionEvents.DismissCustomReactionSheet)
eventsRecorder.assertSingle(MessagesEvents.ToggleReaction(aUnicode, timelineItem.eventOrTransactionId))
eventsRecorder.assertSingle(MessagesEvent.ToggleReaction(aUnicode, timelineItem.eventOrTransactionId))
}
@Test
@@ -589,7 +589,7 @@ class MessagesViewTest {
@Test
fun `no banner shown when there is no successor room`() {
val eventsRecorder = EventsRecorder<MessagesEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<MessagesEvent>(expectEvents = false)
val state = aMessagesState(
successorRoom = null,
eventSink = eventsRecorder