diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvents.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvent.kt similarity index 56% rename from features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvents.kt rename to features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvent.kt index 3d1c162dd3..b98ab899b9 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvents.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvent.kt @@ -10,15 +10,15 @@ package io.element.android.features.poll.impl.create import io.element.android.libraries.matrix.api.poll.PollKind -sealed interface CreatePollEvents { - data object Save : CreatePollEvents - data class Delete(val confirmed: Boolean) : CreatePollEvents - data class SetQuestion(val question: String) : CreatePollEvents - data class SetAnswer(val index: Int, val text: String) : CreatePollEvents - data object AddAnswer : CreatePollEvents - data class RemoveAnswer(val index: Int) : CreatePollEvents - data class SetPollKind(val pollKind: PollKind) : CreatePollEvents - data object NavBack : CreatePollEvents - data object ConfirmNavBack : CreatePollEvents - data object HideConfirmation : CreatePollEvents +sealed interface CreatePollEvent { + data object Save : CreatePollEvent + data class Delete(val confirmed: Boolean) : CreatePollEvent + data class SetQuestion(val question: String) : CreatePollEvent + data class SetAnswer(val index: Int, val text: String) : CreatePollEvent + data object AddAnswer : CreatePollEvent + data class RemoveAnswer(val index: Int) : CreatePollEvent + data class SetPollKind(val pollKind: PollKind) : CreatePollEvent + data object NavBack : CreatePollEvent + data object ConfirmNavBack : CreatePollEvent + data object HideConfirmation : CreatePollEvent } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt index 3da8c3dc53..6138bab2ae 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt @@ -97,9 +97,9 @@ class CreatePollPresenter( val scope = rememberCoroutineScope() - fun handleEvent(event: CreatePollEvents) { + fun handleEvent(event: CreatePollEvent) { when (event) { - is CreatePollEvents.Save -> scope.launch { + is CreatePollEvent.Save -> scope.launch { if (canSave) { repository.savePoll( existingPollId = when (mode) { @@ -123,7 +123,7 @@ class CreatePollPresenter( Timber.d("Cannot create poll") } } - is CreatePollEvents.Delete -> { + is CreatePollEvent.Delete -> { if (mode !is CreatePollMode.EditPoll) { return } @@ -139,25 +139,25 @@ class CreatePollPresenter( navigateUp() } } - is CreatePollEvents.AddAnswer -> { + is CreatePollEvent.AddAnswer -> { poll = poll.withNewAnswer() } - is CreatePollEvents.RemoveAnswer -> { + is CreatePollEvent.RemoveAnswer -> { poll = poll.withAnswerRemoved(event.index) } - is CreatePollEvents.SetAnswer -> { + is CreatePollEvent.SetAnswer -> { poll = poll.withAnswerChanged(event.index, event.text) } - is CreatePollEvents.SetPollKind -> { + is CreatePollEvent.SetPollKind -> { poll = poll.copy(isDisclosed = event.pollKind.isDisclosed) } - is CreatePollEvents.SetQuestion -> { + is CreatePollEvent.SetQuestion -> { poll = poll.copy(question = event.question) } - is CreatePollEvents.NavBack -> { + is CreatePollEvent.NavBack -> { navigateUp() } - CreatePollEvents.ConfirmNavBack -> { + CreatePollEvent.ConfirmNavBack -> { val shouldConfirm = isDirty if (shouldConfirm) { showBackConfirmation = true @@ -165,7 +165,7 @@ class CreatePollPresenter( navigateUp() } } - is CreatePollEvents.HideConfirmation -> { + is CreatePollEvent.HideConfirmation -> { showBackConfirmation = false showDeleteConfirmation = false } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt index 1046f25bd5..80aa7dc4b0 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt @@ -20,7 +20,7 @@ data class CreatePollState( val pollKind: PollKind, val showBackConfirmation: Boolean, val showDeleteConfirmation: Boolean, - val eventSink: (CreatePollEvents) -> Unit, + val eventSink: (CreatePollEvent) -> Unit, ) { enum class Mode { New, diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt index 3220aa1c5c..3abf3718af 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt @@ -62,21 +62,21 @@ fun CreatePollView( ) { val coroutineScope = rememberCoroutineScope() - val navBack = { state.eventSink(CreatePollEvents.ConfirmNavBack) } + val navBack = { state.eventSink(CreatePollEvent.ConfirmNavBack) } BackHandler(onBack = navBack) if (state.showBackConfirmation) { SaveChangesDialog( - onSaveClick = { state.eventSink(CreatePollEvents.Save) }, - onDiscardClick = { state.eventSink(CreatePollEvents.NavBack) }, - onDismiss = { state.eventSink(CreatePollEvents.HideConfirmation) }, + onSaveClick = { state.eventSink(CreatePollEvent.Save) }, + onDiscardClick = { state.eventSink(CreatePollEvent.NavBack) }, + onDismiss = { state.eventSink(CreatePollEvent.HideConfirmation) }, ) } if (state.showDeleteConfirmation) { ConfirmationDialog( title = stringResource(id = R.string.screen_edit_poll_delete_confirmation_title), content = stringResource(id = R.string.screen_edit_poll_delete_confirmation), - onSubmitClick = { state.eventSink(CreatePollEvents.Delete(confirmed = true)) }, - onDismiss = { state.eventSink(CreatePollEvents.HideConfirmation) } + onSubmitClick = { state.eventSink(CreatePollEvent.Delete(confirmed = true)) }, + onDismiss = { state.eventSink(CreatePollEvent.HideConfirmation) } ) } val questionFocusRequester = remember { FocusRequester() } @@ -91,7 +91,7 @@ fun CreatePollView( mode = state.mode, saveEnabled = state.canSave, onBackClick = navBack, - onSaveClick = { state.eventSink(CreatePollEvents.Save) } + onSaveClick = { state.eventSink(CreatePollEvent.Save) } ) }, ) { paddingValues -> @@ -112,7 +112,7 @@ fun CreatePollView( label = stringResource(id = R.string.screen_create_poll_question_desc), value = state.question, onValueChange = { - state.eventSink(CreatePollEvents.SetQuestion(it)) + state.eventSink(CreatePollEvent.SetQuestion(it)) }, modifier = Modifier .focusRequester(questionFocusRequester) @@ -131,7 +131,7 @@ fun CreatePollView( TextField( value = answer.text, onValueChange = { - state.eventSink(CreatePollEvents.SetAnswer(index, it)) + state.eventSink(CreatePollEvent.SetAnswer(index, it)) }, modifier = Modifier .then(if (isLastItem) Modifier.focusRequester(answerFocusRequester) else Modifier) @@ -145,7 +145,7 @@ fun CreatePollView( imageVector = CompoundIcons.Delete(), contentDescription = stringResource(R.string.screen_create_poll_delete_option_a11y, answer.text), modifier = Modifier.clickable(answer.canDelete) { - state.eventSink(CreatePollEvents.RemoveAnswer(index)) + state.eventSink(CreatePollEvent.RemoveAnswer(index)) }, ) }, @@ -161,7 +161,7 @@ fun CreatePollView( ), style = ListItemStyle.Primary, onClick = { - state.eventSink(CreatePollEvents.AddAnswer) + state.eventSink(CreatePollEvent.AddAnswer) coroutineScope.launch(Dispatchers.Main) { lazyListState.animateScrollToItem(state.answers.size + 1) answerFocusRequester.requestFocus() @@ -181,7 +181,7 @@ fun CreatePollView( ), onClick = { state.eventSink( - CreatePollEvents.SetPollKind( + CreatePollEvent.SetPollKind( if (state.pollKind == PollKind.Disclosed) PollKind.Undisclosed else PollKind.Disclosed ) ) @@ -191,7 +191,7 @@ fun CreatePollView( ListItem( headlineContent = { Text(text = stringResource(id = CommonStrings.action_delete_poll)) }, style = ListItemStyle.Destructive, - onClick = { state.eventSink(CreatePollEvents.Delete(confirmed = false)) }, + onClick = { state.eventSink(CreatePollEvent.Delete(confirmed = false)) }, ) } } diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt index 1f916eb670..dee0268c1c 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt @@ -104,15 +104,15 @@ class CreatePollPresenterTest { val initial = awaitItem() assertThat(initial.canSave).isFalse() - initial.eventSink(CreatePollEvents.SetQuestion("A question?")) + initial.eventSink(CreatePollEvent.SetQuestion("A question?")) val questionSet = awaitItem() assertThat(questionSet.canSave).isFalse() - questionSet.eventSink(CreatePollEvents.SetAnswer(0, "Answer 1")) + questionSet.eventSink(CreatePollEvent.SetAnswer(0, "Answer 1")) val answer1Set = awaitItem() assertThat(answer1Set.canSave).isFalse() - answer1Set.eventSink(CreatePollEvents.SetAnswer(1, "Answer 2")) + answer1Set.eventSink(CreatePollEvent.SetAnswer(1, "Answer 2")) val answer2Set = awaitItem() assertThat(answer2Set.canSave).isTrue() } @@ -133,11 +133,11 @@ class CreatePollPresenterTest { presenter.present() }.test { val initial = awaitItem() - initial.eventSink(CreatePollEvents.SetQuestion("A question?")) - initial.eventSink(CreatePollEvents.SetAnswer(0, "Answer 1")) - initial.eventSink(CreatePollEvents.SetAnswer(1, "Answer 2")) + initial.eventSink(CreatePollEvent.SetQuestion("A question?")) + initial.eventSink(CreatePollEvent.SetAnswer(0, "Answer 1")) + initial.eventSink(CreatePollEvent.SetAnswer(1, "Answer 2")) skipItems(3) - initial.eventSink(CreatePollEvents.Save) + initial.eventSink(CreatePollEvent.Save) delay(1) // Wait for the coroutine to finish createPollResult.assertions().isCalledOnce() .with( @@ -182,10 +182,10 @@ class CreatePollPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { - awaitDefaultItem().eventSink(CreatePollEvents.SetQuestion("A question?")) - awaitItem().eventSink(CreatePollEvents.SetAnswer(0, "Answer 1")) - awaitItem().eventSink(CreatePollEvents.SetAnswer(1, "Answer 2")) - awaitItem().eventSink(CreatePollEvents.Save) + awaitDefaultItem().eventSink(CreatePollEvent.SetQuestion("A question?")) + awaitItem().eventSink(CreatePollEvent.SetAnswer(0, "Answer 1")) + awaitItem().eventSink(CreatePollEvent.SetAnswer(1, "Answer 2")) + awaitItem().eventSink(CreatePollEvent.Save) delay(1) // Wait for the coroutine to finish createPollResult.assertions().isCalledOnce() assertThat(fakeAnalyticsService.capturedEvents).isEmpty() @@ -210,20 +210,20 @@ class CreatePollPresenterTest { }.test { awaitDefaultItem() awaitPollLoaded().apply { - eventSink(CreatePollEvents.SetQuestion("Changed question")) + eventSink(CreatePollEvent.SetQuestion("Changed question")) } awaitItem().apply { - eventSink(CreatePollEvents.SetAnswer(0, "Changed answer 1")) + eventSink(CreatePollEvent.SetAnswer(0, "Changed answer 1")) } awaitItem().apply { - eventSink(CreatePollEvents.SetAnswer(1, "Changed answer 2")) + eventSink(CreatePollEvent.SetAnswer(1, "Changed answer 2")) } awaitPollLoaded( newQuestion = "Changed question", newAnswer1 = "Changed answer 1", newAnswer2 = "Changed answer 2", ).apply { - eventSink(CreatePollEvents.Save) + eventSink(CreatePollEvent.Save) } advanceUntilIdle() // Wait for the coroutine to finish @@ -275,8 +275,8 @@ class CreatePollPresenterTest { presenter.present() }.test { awaitDefaultItem() - awaitPollLoaded().eventSink(CreatePollEvents.SetAnswer(0, "A")) - awaitPollLoaded(newAnswer1 = "A").eventSink(CreatePollEvents.Save) + awaitPollLoaded().eventSink(CreatePollEvent.SetAnswer(0, "A")) + awaitPollLoaded(newAnswer1 = "A").eventSink(CreatePollEvent.Save) advanceUntilIdle() // Wait for the coroutine to finish editPollLambda.assertions().isCalledOnce() assertThat(fakeAnalyticsService.capturedEvents).isEmpty() @@ -296,12 +296,12 @@ class CreatePollPresenterTest { val initial = awaitItem() assertThat(initial.answers.size).isEqualTo(2) - initial.eventSink(CreatePollEvents.AddAnswer) + initial.eventSink(CreatePollEvent.AddAnswer) val answerAdded = awaitItem() assertThat(answerAdded.answers.size).isEqualTo(3) assertThat(answerAdded.answers[2].text).isEmpty() - initial.eventSink(CreatePollEvents.RemoveAnswer(2)) + initial.eventSink(CreatePollEvent.RemoveAnswer(2)) val answerRemoved = awaitItem() assertThat(answerRemoved.answers.size).isEqualTo(2) } @@ -314,7 +314,7 @@ class CreatePollPresenterTest { presenter.present() }.test { val initial = awaitItem() - initial.eventSink(CreatePollEvents.SetQuestion("A question?")) + initial.eventSink(CreatePollEvent.SetQuestion("A question?")) val questionSet = awaitItem() assertThat(questionSet.question).isEqualTo("A question?") } @@ -327,7 +327,7 @@ class CreatePollPresenterTest { presenter.present() }.test { val initial = awaitItem() - initial.eventSink(CreatePollEvents.SetAnswer(0, "This is answer 1")) + initial.eventSink(CreatePollEvent.SetAnswer(0, "This is answer 1")) val answerSet = awaitItem() assertThat(answerSet.answers.first().text).isEqualTo("This is answer 1") } @@ -340,7 +340,7 @@ class CreatePollPresenterTest { presenter.present() }.test { val initial = awaitItem() - initial.eventSink(CreatePollEvents.SetPollKind(PollKind.Undisclosed)) + initial.eventSink(CreatePollEvent.SetPollKind(PollKind.Undisclosed)) val kindSet = awaitItem() assertThat(kindSet.pollKind).isEqualTo(PollKind.Undisclosed) } @@ -355,10 +355,10 @@ class CreatePollPresenterTest { val initial = awaitItem() assertThat(initial.canAddAnswer).isTrue() repeat(17) { - initial.eventSink(CreatePollEvents.AddAnswer) + initial.eventSink(CreatePollEvent.AddAnswer) assertThat(awaitItem().canAddAnswer).isTrue() } - initial.eventSink(CreatePollEvents.AddAnswer) + initial.eventSink(CreatePollEvent.AddAnswer) assertThat(awaitItem().canAddAnswer).isFalse() } } @@ -371,7 +371,7 @@ class CreatePollPresenterTest { }.test { val initial = awaitItem() assertThat(initial.answers.all { it.canDelete }).isFalse() - initial.eventSink(CreatePollEvents.AddAnswer) + initial.eventSink(CreatePollEvent.AddAnswer) assertThat(awaitItem().answers.all { it.canDelete }).isTrue() } } @@ -383,7 +383,7 @@ class CreatePollPresenterTest { presenter.present() }.test { val initial = awaitItem() - initial.eventSink(CreatePollEvents.SetAnswer(0, "A".repeat(241))) + initial.eventSink(CreatePollEvent.SetAnswer(0, "A".repeat(241))) assertThat(awaitItem().answers.first().text.length).isEqualTo(240) } } @@ -396,7 +396,7 @@ class CreatePollPresenterTest { }.test { val initial = awaitItem() assertThat(navUpInvocationsCount).isEqualTo(0) - initial.eventSink(CreatePollEvents.NavBack) + initial.eventSink(CreatePollEvent.NavBack) assertThat(navUpInvocationsCount).isEqualTo(1) } } @@ -410,7 +410,7 @@ class CreatePollPresenterTest { val initial = awaitItem() assertThat(navUpInvocationsCount).isEqualTo(0) assertThat(initial.showBackConfirmation).isFalse() - initial.eventSink(CreatePollEvents.ConfirmNavBack) + initial.eventSink(CreatePollEvent.ConfirmNavBack) assertThat(navUpInvocationsCount).isEqualTo(1) } } @@ -422,11 +422,11 @@ class CreatePollPresenterTest { presenter.present() }.test { val initial = awaitItem() - initial.eventSink(CreatePollEvents.SetQuestion("Non blank")) + initial.eventSink(CreatePollEvent.SetQuestion("Non blank")) assertThat(awaitItem().showBackConfirmation).isFalse() - initial.eventSink(CreatePollEvents.ConfirmNavBack) + initial.eventSink(CreatePollEvent.ConfirmNavBack) assertThat(awaitItem().showBackConfirmation).isTrue() - initial.eventSink(CreatePollEvents.HideConfirmation) + initial.eventSink(CreatePollEvent.HideConfirmation) assertThat(awaitItem().showBackConfirmation).isFalse() assertThat(navUpInvocationsCount).isEqualTo(0) } @@ -442,7 +442,7 @@ class CreatePollPresenterTest { val loaded = awaitPollLoaded() assertThat(navUpInvocationsCount).isEqualTo(0) assertThat(loaded.showBackConfirmation).isFalse() - loaded.eventSink(CreatePollEvents.ConfirmNavBack) + loaded.eventSink(CreatePollEvent.ConfirmNavBack) assertThat(navUpInvocationsCount).isEqualTo(1) } } @@ -455,11 +455,11 @@ class CreatePollPresenterTest { }.test { awaitDefaultItem() val loaded = awaitPollLoaded() - loaded.eventSink(CreatePollEvents.SetQuestion("CHANGED")) + loaded.eventSink(CreatePollEvent.SetQuestion("CHANGED")) assertThat(awaitItem().showBackConfirmation).isFalse() - loaded.eventSink(CreatePollEvents.ConfirmNavBack) + loaded.eventSink(CreatePollEvent.ConfirmNavBack) assertThat(awaitItem().showBackConfirmation).isTrue() - loaded.eventSink(CreatePollEvents.HideConfirmation) + loaded.eventSink(CreatePollEvent.HideConfirmation) assertThat(awaitItem().showBackConfirmation).isFalse() assertThat(navUpInvocationsCount).isEqualTo(0) } @@ -474,7 +474,7 @@ class CreatePollPresenterTest { presenter.present() }.test { awaitDefaultItem() - awaitPollLoaded().eventSink(CreatePollEvents.Delete(confirmed = false)) + awaitPollLoaded().eventSink(CreatePollEvent.Delete(confirmed = false)) awaitDeleteConfirmation() assert(redactEventLambda).isNeverCalled() } @@ -489,8 +489,8 @@ class CreatePollPresenterTest { presenter.present() }.test { awaitDefaultItem() - awaitPollLoaded().eventSink(CreatePollEvents.Delete(confirmed = false)) - awaitDeleteConfirmation().eventSink(CreatePollEvents.HideConfirmation) + awaitPollLoaded().eventSink(CreatePollEvent.Delete(confirmed = false)) + awaitDeleteConfirmation().eventSink(CreatePollEvent.HideConfirmation) awaitPollLoaded().apply { assertThat(showDeleteConfirmation).isFalse() } @@ -507,8 +507,8 @@ class CreatePollPresenterTest { presenter.present() }.test { awaitDefaultItem() - awaitPollLoaded().eventSink(CreatePollEvents.Delete(confirmed = false)) - awaitDeleteConfirmation().eventSink(CreatePollEvents.Delete(confirmed = true)) + awaitPollLoaded().eventSink(CreatePollEvent.Delete(confirmed = false)) + awaitDeleteConfirmation().eventSink(CreatePollEvent.Delete(confirmed = true)) awaitPollLoaded().apply { assertThat(showDeleteConfirmation).isFalse() }