KnockRequestsListEvents -> KnockRequestsListEvent

This commit is contained in:
Benoit Marty
2026-08-25 09:58:53 +02:00
parent 7da820464f
commit ee30d6aa41
7 changed files with 57 additions and 57 deletions
@@ -10,12 +10,12 @@ package io.element.android.features.knockrequests.impl.list
import io.element.android.features.knockrequests.impl.data.KnockRequestPresentable
sealed interface KnockRequestsListEvents {
data class Accept(val knockRequest: KnockRequestPresentable) : KnockRequestsListEvents
data class Decline(val knockRequest: KnockRequestPresentable) : KnockRequestsListEvents
data class DeclineAndBan(val knockRequest: KnockRequestPresentable) : KnockRequestsListEvents
data object AcceptAll : KnockRequestsListEvents
data object ResetCurrentAction : KnockRequestsListEvents
data object RetryCurrentAction : KnockRequestsListEvents
data object ConfirmCurrentAction : KnockRequestsListEvents
sealed interface KnockRequestsListEvent {
data class Accept(val knockRequest: KnockRequestPresentable) : KnockRequestsListEvent
data class Decline(val knockRequest: KnockRequestPresentable) : KnockRequestsListEvent
data class DeclineAndBan(val knockRequest: KnockRequestPresentable) : KnockRequestsListEvent
data object AcceptAll : KnockRequestsListEvent
data object ResetCurrentAction : KnockRequestsListEvent
data object RetryCurrentAction : KnockRequestsListEvent
data object ConfirmCurrentAction : KnockRequestsListEvent
}
@@ -39,28 +39,28 @@ class KnockRequestsListPresenter(
val coroutineScope = rememberCoroutineScope()
fun handleEvent(event: KnockRequestsListEvents) {
fun handleEvent(event: KnockRequestsListEvent) {
when (event) {
KnockRequestsListEvents.AcceptAll -> {
KnockRequestsListEvent.AcceptAll -> {
currentAction = KnockRequestsAction.AcceptAll
}
is KnockRequestsListEvents.Accept -> {
is KnockRequestsListEvent.Accept -> {
currentAction = KnockRequestsAction.Accept(event.knockRequest)
}
is KnockRequestsListEvents.Decline -> {
is KnockRequestsListEvent.Decline -> {
currentAction = KnockRequestsAction.Decline(event.knockRequest)
}
is KnockRequestsListEvents.DeclineAndBan -> {
is KnockRequestsListEvent.DeclineAndBan -> {
currentAction = KnockRequestsAction.DeclineAndBan(event.knockRequest)
}
KnockRequestsListEvents.ResetCurrentAction -> {
KnockRequestsListEvent.ResetCurrentAction -> {
asyncAction.value = AsyncAction.Uninitialized
currentAction = KnockRequestsAction.None
}
KnockRequestsListEvents.RetryCurrentAction -> {
KnockRequestsListEvent.RetryCurrentAction -> {
coroutineScope.executeAction(currentAction, asyncAction, isActionConfirmed = true)
}
KnockRequestsListEvents.ConfirmCurrentAction -> {
KnockRequestsListEvent.ConfirmCurrentAction -> {
coroutineScope.executeAction(currentAction, asyncAction, isActionConfirmed = true)
}
}
@@ -20,7 +20,7 @@ data class KnockRequestsListState(
val currentAction: KnockRequestsAction,
val asyncAction: AsyncAction<Unit>,
val permissions: KnockRequestPermissions,
val eventSink: (KnockRequestsListEvents) -> Unit,
val eventSink: (KnockRequestsListEvent) -> Unit,
) {
val canAcceptAll = permissions.canAccept && knockRequests is AsyncData.Success && knockRequests.data.size > 1
}
@@ -140,7 +140,7 @@ fun aKnockRequestsListState(
canDecline = true,
canBan = true,
),
eventSink: (KnockRequestsListEvents) -> Unit = {},
eventSink: (KnockRequestsListEvent) -> Unit = {},
) = KnockRequestsListState(
knockRequests = knockRequests,
currentAction = currentAction,
@@ -108,15 +108,15 @@ private fun KnockRequestsListContent(
modifier: Modifier = Modifier,
) {
fun onAcceptClick(knockRequest: KnockRequestPresentable) {
state.eventSink(KnockRequestsListEvents.Accept(knockRequest))
state.eventSink(KnockRequestsListEvent.Accept(knockRequest))
}
fun onDeclineClick(knockRequest: KnockRequestPresentable) {
state.eventSink(KnockRequestsListEvents.Decline(knockRequest))
state.eventSink(KnockRequestsListEvent.Decline(knockRequest))
}
fun onBanClick(knockRequest: KnockRequestPresentable) {
state.eventSink(KnockRequestsListEvents.DeclineAndBan(knockRequest))
state.eventSink(KnockRequestsListEvent.DeclineAndBan(knockRequest))
}
var bottomPaddingInPixels by remember { mutableIntStateOf(0) }
@@ -160,19 +160,19 @@ private fun KnockRequestsListContent(
currentAction = state.currentAction,
asyncAction = state.asyncAction,
onConfirm = {
state.eventSink(KnockRequestsListEvents.ConfirmCurrentAction)
state.eventSink(KnockRequestsListEvent.ConfirmCurrentAction)
},
onRetry = {
state.eventSink(KnockRequestsListEvents.RetryCurrentAction)
state.eventSink(KnockRequestsListEvent.RetryCurrentAction)
},
onDismiss = {
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
},
)
if (state.canAcceptAll) {
KnockRequestsAcceptAll(
onClick = {
state.eventSink(KnockRequestsListEvents.AcceptAll)
state.eventSink(KnockRequestsListEvent.AcceptAll)
},
onHeightChange = { height ->
bottomPaddingInPixels = height
@@ -65,7 +65,7 @@ class KnockRequestsListPresenterTest {
skipItems(2)
awaitItem().also { state ->
val knockRequestPresentable = state.knockRequests.dataOrNull()?.first()!!
state.eventSink(KnockRequestsListEvents.Accept(knockRequestPresentable))
state.eventSink(KnockRequestsListEvent.Accept(knockRequestPresentable))
}
skipItems(1)
awaitItem().also { state ->
@@ -75,7 +75,7 @@ class KnockRequestsListPresenterTest {
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Success::class.java)
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
}
skipItems(2)
awaitItem().also { state ->
@@ -99,7 +99,7 @@ class KnockRequestsListPresenterTest {
skipItems(2)
awaitItem().also { state ->
val knockRequestPresentable = state.knockRequests.dataOrNull()?.first()!!
state.eventSink(KnockRequestsListEvents.Accept(knockRequestPresentable))
state.eventSink(KnockRequestsListEvent.Accept(knockRequestPresentable))
}
skipItems(1)
awaitItem().also { state ->
@@ -109,14 +109,14 @@ class KnockRequestsListPresenterTest {
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Failure::class.java)
state.eventSink(KnockRequestsListEvents.RetryCurrentAction)
state.eventSink(KnockRequestsListEvent.RetryCurrentAction)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Loading::class.java)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Failure::class.java)
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
}
skipItems(1)
awaitItem().also { state ->
@@ -140,21 +140,21 @@ class KnockRequestsListPresenterTest {
skipItems(2)
awaitItem().also { state ->
val knockRequestPresentable = state.knockRequests.dataOrNull()?.first()!!
state.eventSink(KnockRequestsListEvents.Decline(knockRequestPresentable))
state.eventSink(KnockRequestsListEvent.Decline(knockRequestPresentable))
}
skipItems(1)
awaitItem().also { state ->
val knockRequestPresentable = state.knockRequests.dataOrNull()?.first()!!
assertThat(state.currentAction).isEqualTo(KnockRequestsAction.Decline(knockRequestPresentable))
assertThat(state.asyncAction).isInstanceOf(AsyncAction.ConfirmingNoParams::class.java)
state.eventSink(KnockRequestsListEvents.ConfirmCurrentAction)
state.eventSink(KnockRequestsListEvent.ConfirmCurrentAction)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Loading::class.java)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Success::class.java)
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
}
skipItems(2)
awaitItem().also { state ->
@@ -178,21 +178,21 @@ class KnockRequestsListPresenterTest {
skipItems(2)
awaitItem().also { state ->
val knockRequestPresentable = state.knockRequests.dataOrNull()?.first()!!
state.eventSink(KnockRequestsListEvents.DeclineAndBan(knockRequestPresentable))
state.eventSink(KnockRequestsListEvent.DeclineAndBan(knockRequestPresentable))
}
skipItems(1)
awaitItem().also { state ->
val knockRequestPresentable = state.knockRequests.dataOrNull()?.first()!!
assertThat(state.currentAction).isEqualTo(KnockRequestsAction.DeclineAndBan(knockRequestPresentable))
assertThat(state.asyncAction).isInstanceOf(AsyncAction.ConfirmingNoParams::class.java)
state.eventSink(KnockRequestsListEvents.ConfirmCurrentAction)
state.eventSink(KnockRequestsListEvent.ConfirmCurrentAction)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Loading::class.java)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Success::class.java)
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
}
skipItems(2)
awaitItem().also { state ->
@@ -220,20 +220,20 @@ class KnockRequestsListPresenterTest {
skipItems(2)
awaitItem().also { state ->
assertThat(state.canAcceptAll).isTrue()
state.eventSink(KnockRequestsListEvents.AcceptAll)
state.eventSink(KnockRequestsListEvent.AcceptAll)
}
skipItems(1)
awaitItem().also { state ->
assertThat(state.currentAction).isEqualTo(KnockRequestsAction.AcceptAll)
assertThat(state.asyncAction).isInstanceOf(AsyncAction.ConfirmingNoParams::class.java)
state.eventSink(KnockRequestsListEvents.ConfirmCurrentAction)
state.eventSink(KnockRequestsListEvent.ConfirmCurrentAction)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Loading::class.java)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Success::class.java)
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
}
skipItems(2)
awaitItem().also { state ->
@@ -262,20 +262,20 @@ class KnockRequestsListPresenterTest {
skipItems(2)
awaitItem().also { state ->
assertThat(state.canAcceptAll).isTrue()
state.eventSink(KnockRequestsListEvents.AcceptAll)
state.eventSink(KnockRequestsListEvent.AcceptAll)
}
skipItems(1)
awaitItem().also { state ->
assertThat(state.currentAction).isEqualTo(KnockRequestsAction.AcceptAll)
assertThat(state.asyncAction).isInstanceOf(AsyncAction.ConfirmingNoParams::class.java)
state.eventSink(KnockRequestsListEvents.ConfirmCurrentAction)
state.eventSink(KnockRequestsListEvent.ConfirmCurrentAction)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Loading::class.java)
}
awaitItem().also { state ->
assertThat(state.asyncAction).isInstanceOf(AsyncAction.Failure::class.java)
state.eventSink(KnockRequestsListEvents.ResetCurrentAction)
state.eventSink(KnockRequestsListEvent.ResetCurrentAction)
}
skipItems(2)
awaitItem().also { state ->
@@ -31,7 +31,7 @@ import org.junit.Test
class KnockRequestsListViewTest : RobolectricTest() {
@Test
fun `clicking on back invoke the expected callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>(expectEvents = false)
ensureCalledOnce {
setKnockRequestsListView(
aKnockRequestsListState(
@@ -45,7 +45,7 @@ class KnockRequestsListViewTest : RobolectricTest() {
@Test
fun `clicking on accept emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequest = aKnockRequestPresentable()
setKnockRequestsListView(
aKnockRequestsListState(
@@ -54,12 +54,12 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(CommonStrings.action_accept)
eventsRecorder.assertSingle(KnockRequestsListEvents.Accept(knockRequest))
eventsRecorder.assertSingle(KnockRequestsListEvent.Accept(knockRequest))
}
@Test
fun `clicking on decline emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequest = aKnockRequestPresentable()
setKnockRequestsListView(
aKnockRequestsListState(
@@ -68,12 +68,12 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(CommonStrings.action_decline)
eventsRecorder.assertSingle(KnockRequestsListEvents.Decline(knockRequest))
eventsRecorder.assertSingle(KnockRequestsListEvent.Decline(knockRequest))
}
@Test
fun `clicking on decline and ban emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequest = aKnockRequestPresentable()
setKnockRequestsListView(
aKnockRequestsListState(
@@ -82,12 +82,12 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(R.string.screen_knock_requests_list_decline_and_ban_action_title)
eventsRecorder.assertSingle(KnockRequestsListEvents.DeclineAndBan(knockRequest))
eventsRecorder.assertSingle(KnockRequestsListEvent.DeclineAndBan(knockRequest))
}
@Test
fun `clicking on accept all emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequests = persistentListOf(aKnockRequestPresentable(), aKnockRequestPresentable())
setKnockRequestsListView(
aKnockRequestsListState(
@@ -96,12 +96,12 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(R.string.screen_knock_requests_list_accept_all_button_title)
eventsRecorder.assertSingle(KnockRequestsListEvents.AcceptAll)
eventsRecorder.assertSingle(KnockRequestsListEvent.AcceptAll)
}
@Test
fun `retry on async view retry emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequests = persistentListOf(aKnockRequestPresentable(), aKnockRequestPresentable())
setKnockRequestsListView(
aKnockRequestsListState(
@@ -112,12 +112,12 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(CommonStrings.action_retry)
eventsRecorder.assertSingle(KnockRequestsListEvents.RetryCurrentAction)
eventsRecorder.assertSingle(KnockRequestsListEvent.RetryCurrentAction)
}
@Test
fun `canceling async view emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequests = persistentListOf(aKnockRequestPresentable(), aKnockRequestPresentable())
setKnockRequestsListView(
aKnockRequestsListState(
@@ -128,12 +128,12 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(KnockRequestsListEvents.ResetCurrentAction)
eventsRecorder.assertSingle(KnockRequestsListEvent.ResetCurrentAction)
}
@Test
fun `confirming async view emit the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<KnockRequestsListEvents>()
val eventsRecorder = EventsRecorder<KnockRequestsListEvent>()
val knockRequests = persistentListOf(aKnockRequestPresentable(), aKnockRequestPresentable())
setKnockRequestsListView(
aKnockRequestsListState(
@@ -144,7 +144,7 @@ class KnockRequestsListViewTest : RobolectricTest() {
),
)
clickOn(R.string.screen_knock_requests_list_accept_all_alert_confirm_button_title)
eventsRecorder.assertSingle(KnockRequestsListEvents.ConfirmCurrentAction)
eventsRecorder.assertSingle(KnockRequestsListEvent.ConfirmCurrentAction)
}
}