ResolveVerifiedUserSendFailureEvent -> ResolveVerifiedUserSendFailureEven

This commit is contained in:
Benoit Marty 2026-01-27 09:58:44 +01:00
parent 56668377d4
commit 4d04808875
8 changed files with 40 additions and 40 deletions

View file

@ -10,12 +10,12 @@ package io.element.android.features.messages.impl.crypto.sendfailure.resolve
import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.TimelineItem
sealed interface ResolveVerifiedUserSendFailureEvents { sealed interface ResolveVerifiedUserSendFailureEvent {
data class ComputeForMessage( data class ComputeForMessage(
val messageEvent: TimelineItem.Event, val messageEvent: TimelineItem.Event,
) : ResolveVerifiedUserSendFailureEvents ) : ResolveVerifiedUserSendFailureEvent
data object ResolveAndResend : ResolveVerifiedUserSendFailureEvents data object ResolveAndResend : ResolveVerifiedUserSendFailureEvent
data object Retry : ResolveVerifiedUserSendFailureEvents data object Retry : ResolveVerifiedUserSendFailureEvent
data object Dismiss : ResolveVerifiedUserSendFailureEvents data object Dismiss : ResolveVerifiedUserSendFailureEvent
} }

View file

@ -48,9 +48,9 @@ class ResolveVerifiedUserSendFailurePresenter(
} }
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
fun handleEvent(event: ResolveVerifiedUserSendFailureEvents) { fun handleEvent(event: ResolveVerifiedUserSendFailureEvent) {
when (event) { when (event) {
is ResolveVerifiedUserSendFailureEvents.ComputeForMessage -> { is ResolveVerifiedUserSendFailureEvent.ComputeForMessage -> {
val sendState = event.messageEvent.localSendState as? LocalEventSendState.Failed.VerifiedUser val sendState = event.messageEvent.localSendState as? LocalEventSendState.Failed.VerifiedUser
val transactionId = event.messageEvent.transactionId val transactionId = event.messageEvent.transactionId
val sendHandle = event.messageEvent.sendhandle val sendHandle = event.messageEvent.sendhandle
@ -65,10 +65,10 @@ class ResolveVerifiedUserSendFailurePresenter(
null null
} }
} }
ResolveVerifiedUserSendFailureEvents.Dismiss -> { ResolveVerifiedUserSendFailureEvent.Dismiss -> {
resolver = null resolver = null
} }
ResolveVerifiedUserSendFailureEvents.Retry -> { ResolveVerifiedUserSendFailureEvent.Retry -> {
coroutineScope.launch { coroutineScope.launch {
resolver?.run { resolver?.run {
runUpdatingState(retryAction) { runUpdatingState(retryAction) {
@ -77,7 +77,7 @@ class ResolveVerifiedUserSendFailurePresenter(
} }
} }
} }
ResolveVerifiedUserSendFailureEvents.ResolveAndResend -> { ResolveVerifiedUserSendFailureEvent.ResolveAndResend -> {
coroutineScope.launch { coroutineScope.launch {
resolver?.run { resolver?.run {
runUpdatingState(resolveAction) { runUpdatingState(resolveAction) {

View file

@ -15,5 +15,5 @@ data class ResolveVerifiedUserSendFailureState(
val verifiedUserSendFailure: VerifiedUserSendFailure, val verifiedUserSendFailure: VerifiedUserSendFailure,
val resolveAction: AsyncAction<Unit>, val resolveAction: AsyncAction<Unit>,
val retryAction: AsyncAction<Unit>, val retryAction: AsyncAction<Unit>,
val eventSink: (ResolveVerifiedUserSendFailureEvents) -> Unit val eventSink: (ResolveVerifiedUserSendFailureEvent) -> Unit
) )

View file

@ -29,7 +29,7 @@ fun aResolveVerifiedUserSendFailureState(
verifiedUserSendFailure: VerifiedUserSendFailure = VerifiedUserSendFailure.None, verifiedUserSendFailure: VerifiedUserSendFailure = VerifiedUserSendFailure.None,
resolveAction: AsyncAction<Unit> = AsyncAction.Uninitialized, resolveAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
retryAction: AsyncAction<Unit> = AsyncAction.Uninitialized, retryAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (ResolveVerifiedUserSendFailureEvents) -> Unit = {} eventSink: (ResolveVerifiedUserSendFailureEvent) -> Unit = {}
) = ResolveVerifiedUserSendFailureState( ) = ResolveVerifiedUserSendFailureState(
verifiedUserSendFailure = verifiedUserSendFailure, verifiedUserSendFailure = verifiedUserSendFailure,
resolveAction = resolveAction, resolveAction = resolveAction,

View file

@ -47,15 +47,15 @@ fun ResolveVerifiedUserSendFailureView(
var showSheet by remember { mutableStateOf(false) } var showSheet by remember { mutableStateOf(false) }
fun dismiss() { fun dismiss() {
state.eventSink(ResolveVerifiedUserSendFailureEvents.Dismiss) state.eventSink(ResolveVerifiedUserSendFailureEvent.Dismiss)
} }
fun onRetryClick() { fun onRetryClick() {
state.eventSink(ResolveVerifiedUserSendFailureEvents.Retry) state.eventSink(ResolveVerifiedUserSendFailureEvent.Retry)
} }
fun onResolveAndResendClick() { fun onResolveAndResendClick() {
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
LaunchedEffect(state.verifiedUserSendFailure) { LaunchedEffect(state.verifiedUserSendFailure) {

View file

@ -25,7 +25,7 @@ import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.AssistedInject
import io.element.android.features.messages.impl.MessagesNavigator import io.element.android.features.messages.impl.MessagesNavigator
import io.element.android.features.messages.impl.UserEventPermissions import io.element.android.features.messages.impl.UserEventPermissions
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureEvents import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureEvent
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
import io.element.android.features.messages.impl.timeline.components.MessageShieldData import io.element.android.features.messages.impl.timeline.components.MessageShieldData
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory
@ -218,7 +218,7 @@ class TimelinePresenter(
TimelineEvent.HideShieldDialog -> messageShieldDialogData.value = null TimelineEvent.HideShieldDialog -> messageShieldDialogData.value = null
is TimelineEvent.ShowShieldDialog -> messageShieldDialogData.value = event.messageShieldData is TimelineEvent.ShowShieldDialog -> messageShieldDialogData.value = event.messageShieldData
is TimelineEvent.ComputeVerifiedUserSendFailure -> { is TimelineEvent.ComputeVerifiedUserSendFailure -> {
resolveVerifiedUserSendFailureState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(event.event)) resolveVerifiedUserSendFailureState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(event.event))
} }
is TimelineEvent.NavigateToPredecessorOrSuccessorRoom -> { is TimelineEvent.NavigateToPredecessorOrSuccessorRoom -> {
// Navigate to the predecessor or successor room // Navigate to the predecessor or successor room

View file

@ -47,7 +47,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val sentMessage = aMessageEvent() val sentMessage = aMessageEvent()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(sentMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(sentMessage))
ensureAllEventsConsumed() ensureAllEventsConsumed()
} }
} }
@ -61,7 +61,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
) )
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(sentMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(sentMessage))
ensureAllEventsConsumed() ensureAllEventsConsumed()
} }
} }
@ -75,7 +75,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
) )
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
ensureAllEventsConsumed() ensureAllEventsConsumed()
} }
} }
@ -94,11 +94,11 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage() val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.Dismiss) state.eventSink(ResolveVerifiedUserSendFailureEvent.Dismiss)
} }
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
@ -122,12 +122,12 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage() val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.Retry) state.eventSink(ResolveVerifiedUserSendFailureEvent.Retry)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.retryAction).isEqualTo(AsyncAction.Loading) assertThat(state.retryAction).isEqualTo(AsyncAction.Loading)
@ -158,12 +158,12 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage() val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading) assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading)
@ -173,7 +173,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromOther(A_USER_ID_2.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromOther(A_USER_ID_2.value))
assertThat(state.resolveAction).isEqualTo(AsyncAction.Success(Unit)) assertThat(state.resolveAction).isEqualTo(AsyncAction.Success(Unit))
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
skipItems(3) skipItems(3)
@ -201,12 +201,12 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage() val failedMessage = aVerifiedUserHasUnsignedDeviceFailedMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading) assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading)
@ -233,12 +233,12 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserChangedIdentityMessage() val failedMessage = aVerifiedUserChangedIdentityMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID.value))
state.eventSink(ResolveVerifiedUserSendFailureEvents.Retry) state.eventSink(ResolveVerifiedUserSendFailureEvent.Retry)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.retryAction).isEqualTo(AsyncAction.Loading) assertThat(state.retryAction).isEqualTo(AsyncAction.Loading)
@ -269,12 +269,12 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserChangedIdentityMessage() val failedMessage = aVerifiedUserChangedIdentityMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID.value))
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading) assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading)
@ -284,7 +284,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID_2.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID_2.value))
assertThat(state.resolveAction).isEqualTo(AsyncAction.Success(Unit)) assertThat(state.resolveAction).isEqualTo(AsyncAction.Success(Unit))
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
skipItems(3) skipItems(3)
@ -312,12 +312,12 @@ class ResolveVerifiedUserSendFailurePresenterTest {
val failedMessage = aVerifiedUserChangedIdentityMessage() val failedMessage = aVerifiedUserChangedIdentityMessage()
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None) assertThat(initialState.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.None)
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvent.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(A_USER_ID.value))
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading) assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading)

View file

@ -27,7 +27,7 @@ class ResolveVerifiedUserSendFailureViewTest {
@Test @Test
fun `clicking on resolve and resend emit the expected event`() { fun `clicking on resolve and resend emit the expected event`() {
val eventsRecorder = EventsRecorder<ResolveVerifiedUserSendFailureEvents>() val eventsRecorder = EventsRecorder<ResolveVerifiedUserSendFailureEvent>()
rule.setResolveVerifiedUserSendFailureView( rule.setResolveVerifiedUserSendFailureView(
state = aResolveVerifiedUserSendFailureState( state = aResolveVerifiedUserSendFailureState(
verifiedUserSendFailure = aChangedIdentitySendFailure(), verifiedUserSendFailure = aChangedIdentitySendFailure(),
@ -36,12 +36,12 @@ class ResolveVerifiedUserSendFailureViewTest {
) )
rule.clickOn(res = CommonStrings.screen_resolve_send_failure_changed_identity_primary_button_title) rule.clickOn(res = CommonStrings.screen_resolve_send_failure_changed_identity_primary_button_title)
eventsRecorder.assertSingle(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) eventsRecorder.assertSingle(ResolveVerifiedUserSendFailureEvent.ResolveAndResend)
} }
@Test @Test
fun `clicking on retry emit the expected event`() { fun `clicking on retry emit the expected event`() {
val eventsRecorder = EventsRecorder<ResolveVerifiedUserSendFailureEvents>() val eventsRecorder = EventsRecorder<ResolveVerifiedUserSendFailureEvent>()
rule.setResolveVerifiedUserSendFailureView( rule.setResolveVerifiedUserSendFailureView(
state = aResolveVerifiedUserSendFailureState( state = aResolveVerifiedUserSendFailureState(
verifiedUserSendFailure = aChangedIdentitySendFailure(), verifiedUserSendFailure = aChangedIdentitySendFailure(),
@ -50,7 +50,7 @@ class ResolveVerifiedUserSendFailureViewTest {
) )
rule.clickOn(res = CommonStrings.action_retry) rule.clickOn(res = CommonStrings.action_retry)
eventsRecorder.assertSingle(ResolveVerifiedUserSendFailureEvents.Retry) eventsRecorder.assertSingle(ResolveVerifiedUserSendFailureEvent.Retry)
} }
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setResolveVerifiedUserSendFailureView( private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setResolveVerifiedUserSendFailureView(