Skip to content

Commit 6cc067d

Browse files
committed
use same args pattern in the step screen
1 parent f3d4440 commit 6cc067d

File tree

15 files changed

+144
-168
lines changed

15 files changed

+144
-168
lines changed

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/domain/entities/BudgetBuilderAction.kt

-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ sealed interface BudgetBuilderAction {
1414
/**
1515
* A specific step in the category builder.
1616
*/
17-
@Serializable
1817
sealed interface Step : BudgetBuilderAction {
1918
/**
2019
* The minimum number of inputs required to proceed to the next step.
@@ -42,7 +41,6 @@ sealed interface BudgetBuilderAction {
4241
* The first step in the category builder.
4342
* It is used to add fixed expenses.
4443
*/
45-
@Serializable
4644
data object FixedExpensesStep : BudgetBuilderAction.Step {
4745
private const val REQUIRED_INPUTS = 3
4846
override val minimumRequiredToProceed: Int = REQUIRED_INPUTS
@@ -55,7 +53,6 @@ data object FixedExpensesStep : BudgetBuilderAction.Step {
5553
* The second step in the category builder.
5654
* It is used to add variable expenses.
5755
*/
58-
@Serializable
5956
data object VariableExpensesStep : BudgetBuilderAction.Step {
6057
private const val REQUIRED_INPUTS = 2
6158
override val minimumRequiredToProceed: Int = REQUIRED_INPUTS
@@ -68,7 +65,6 @@ data object VariableExpensesStep : BudgetBuilderAction.Step {
6865
* The third step in the category builder.
6966
* It is used to add seasonal expenses.
7067
*/
71-
@Serializable
7268
data object SeasonalExpensesStep : BudgetBuilderAction.Step {
7369
override val minimumRequiredToProceed: Int = 0
7470
override val next: BudgetBuilderAction = FixedIncomesStep

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/domain/events/ScreenViewEvents.kt

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package br.com.mob1st.features.finances.impl.domain.events
22

33
import br.com.mob1st.core.observability.events.AnalyticsEvent
4-
import br.com.mob1st.features.finances.impl.domain.entities.BudgetBuilderAction
5-
import br.com.mob1st.features.finances.impl.domain.entities.FixedExpensesStep
6-
import br.com.mob1st.features.finances.impl.domain.entities.FixedIncomesStep
7-
import br.com.mob1st.features.finances.impl.domain.entities.SeasonalExpensesStep
8-
import br.com.mob1st.features.finances.impl.domain.entities.VariableExpensesStep
4+
import br.com.mob1st.features.finances.impl.ui.builder.navigation.BuilderStepNavArgs
95
import br.com.mob1st.features.finances.impl.ui.category.navigation.CategoryDetailArgs
106

117
/**
@@ -14,12 +10,12 @@ import br.com.mob1st.features.finances.impl.ui.category.navigation.CategoryDetai
1410
* @return the screen view event.
1511
*/
1612
internal fun AnalyticsEvent.Companion.builderStepScreenView(
17-
step: BudgetBuilderAction.Step,
18-
) = when (step) {
19-
FixedExpensesStep -> screenView("builder_fixed_expenses")
20-
VariableExpensesStep -> screenView("builder_variable_expenses")
21-
FixedIncomesStep -> screenView("builder_fixed_incomes")
22-
SeasonalExpensesStep -> screenView("builder_seasonal_expenses")
13+
args: BuilderStepNavArgs,
14+
) = when (args) {
15+
BuilderStepNavArgs.FixedExpensesStepArgs -> screenView("builder_fixed_expenses")
16+
BuilderStepNavArgs.VariableExpensesStepArgs -> screenView("builder_variable_expenses")
17+
BuilderStepNavArgs.FixedIncomesStepArgs -> screenView("builder_fixed_incomes")
18+
BuilderStepNavArgs.SeasonalExpensesStepArgs -> screenView("builder_seasonal_expenses")
2319
}
2420

2521
/**

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/intro/BuilderIntroConsumables.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ data class BuilderIntroConsumables(
1717
* @return The next consumable state.
1818
*/
1919
fun navigateToStep(step: BudgetBuilderAction.Step) =
20-
copy(navEvent = BuilderIntroNextStepNavEvent(step))
20+
copy(
21+
navEvent = BuilderIntroNextStepNavEvent(step),
22+
)
2123

2224
/**
2325
* Navigation event triggered from the intro screen

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/navigation/BudgetBuilderNavGraphImpl.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal class BudgetBuilderNavGraphImpl(
3030
typeMap = BuilderNavRoute.navType,
3131
) { navEntry ->
3232
BudgetBuilderStepPage(
33-
step = navEntry.toRoute<BuilderNavRoute.Step>().id,
33+
args = navEntry.toRoute<BuilderNavRoute.Step>().args,
3434
onNext = coordinator::navigate,
3535
onBack = coordinator::back,
3636
)

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/navigation/BuilderCoordinator.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ internal class BuilderCoordinator(
2626
fun navigate(event: BuilderIntroConsumables.NavEvent) {
2727
when (event) {
2828
is BuilderIntroNextStepNavEvent -> {
29-
navigate(BuilderNavRoute.Step(event.step))
29+
navigate(
30+
BuilderNavRoute.Step(
31+
args = BuilderStepNavArgs.map.getRightValue(event.step),
32+
),
33+
)
3034
}
3135
}
3236
}
@@ -49,7 +53,10 @@ internal class BuilderCoordinator(
4953

5054
private fun actionRoute(builderAction: BudgetBuilderAction): BuilderNavRoute {
5155
return when (builderAction) {
52-
is BudgetBuilderAction.Step -> BuilderNavRoute.Step(builderAction)
56+
is BudgetBuilderAction.Step -> BuilderNavRoute.Step(
57+
args = BuilderStepNavArgs.map.getRightValue(builderAction),
58+
)
59+
5360
BudgetBuilderAction.Complete -> BuilderNavRoute.Completion()
5461
}
5562
}

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/navigation/BuilderNavRoute.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package br.com.mob1st.features.finances.impl.ui.builder.navigation
22

3+
import androidx.navigation.NavType
34
import br.com.mob1st.core.design.molecules.transitions.NavRoute
45
import br.com.mob1st.core.design.molecules.transitions.PatternKey
5-
import br.com.mob1st.features.finances.impl.domain.entities.BudgetBuilderAction
66
import kotlinx.serialization.Serializable
77
import kotlin.reflect.typeOf
88

@@ -21,11 +21,11 @@ internal sealed interface BuilderNavRoute : NavRoute {
2121

2222
/**
2323
* All the screen steps during the builder flow.
24-
* @property id Indicates which step is the specific screen.
24+
* @property args The arguments to pass to the step
2525
*/
2626
@Serializable
2727
data class Step(
28-
val id: BudgetBuilderAction.Step,
28+
val args: BuilderStepNavArgs,
2929
override val enteringPatternKey: PatternKey = PatternKey.BackAndForward,
3030
) : BuilderNavRoute
3131

@@ -39,7 +39,7 @@ internal sealed interface BuilderNavRoute : NavRoute {
3939

4040
companion object {
4141
val navType = mapOf(
42-
typeOf<BudgetBuilderAction.Step>() to BuilderStepNavType,
42+
typeOf<BuilderStepNavArgs>() to NavType.EnumType(BuilderStepNavArgs::class.java),
4343
)
4444
}
4545
}

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/navigation/BuilderRouter.kt

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package br.com.mob1st.features.finances.impl.ui.builder.navigation
2+
3+
import br.com.mob1st.core.kotlinx.structures.biMapOf
4+
import br.com.mob1st.features.finances.impl.domain.entities.FixedExpensesStep
5+
import br.com.mob1st.features.finances.impl.domain.entities.FixedIncomesStep
6+
import br.com.mob1st.features.finances.impl.domain.entities.SeasonalExpensesStep
7+
import br.com.mob1st.features.finances.impl.domain.entities.VariableExpensesStep
8+
9+
/**
10+
* Defines which step will be navigated to based on the arguments.
11+
*/
12+
enum class BuilderStepNavArgs {
13+
FixedExpensesStepArgs,
14+
VariableExpensesStepArgs,
15+
SeasonalExpensesStepArgs,
16+
FixedIncomesStepArgs,
17+
;
18+
19+
companion object {
20+
/**
21+
* Maps the step to the arguments and vice versa.
22+
*/
23+
val map = biMapOf(
24+
FixedExpensesStepArgs to FixedExpensesStep,
25+
VariableExpensesStepArgs to VariableExpensesStep,
26+
SeasonalExpensesStepArgs to SeasonalExpensesStep,
27+
FixedIncomesStepArgs to FixedIncomesStep,
28+
)
29+
}
30+
}

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/navigation/BuilderStepNavType.kt

-41
This file was deleted.

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/steps/BudgetBuilderStepPage.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import br.com.mob1st.core.design.utils.PreviewTheme
2222
import br.com.mob1st.core.design.utils.ThemedPreview
2323
import br.com.mob1st.core.observability.events.AnalyticsEvent
2424
import br.com.mob1st.features.finances.impl.R
25-
import br.com.mob1st.features.finances.impl.domain.entities.BudgetBuilderAction
2625
import br.com.mob1st.features.finances.impl.domain.events.builderStepScreenView
26+
import br.com.mob1st.features.finances.impl.ui.builder.navigation.BuilderStepNavArgs
2727
import br.com.mob1st.features.finances.impl.ui.category.components.dialog.CategoryNameDialog
2828
import br.com.mob1st.features.finances.impl.ui.category.components.item.CategorySectionItem
2929
import br.com.mob1st.features.utils.observability.TrackEventSideEffect
@@ -32,7 +32,7 @@ import org.koin.core.parameter.parametersOf
3232

3333
@Composable
3434
internal fun BudgetBuilderStepPage(
35-
step: BudgetBuilderAction.Step,
35+
args: BuilderStepNavArgs,
3636
onNext: (BuilderStepConsumables.NavEvent) -> Unit,
3737
onBack: () -> Unit,
3838
) {
@@ -41,7 +41,7 @@ internal fun BudgetBuilderStepPage(
4141
SnackbarHostState()
4242
}
4343
val viewModel = koinViewModel<BudgetBuilderStepViewModel> {
44-
parametersOf(step)
44+
parametersOf(BuilderStepNavArgs.map.getLeftValue(args))
4545
}
4646
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
4747
val consumables by viewModel.consumableUiState.collectAsStateWithLifecycle()
@@ -59,7 +59,7 @@ internal fun BudgetBuilderStepPage(
5959
)
6060

6161
BuilderStepsSideEffects(
62-
step = step,
62+
args = args,
6363
consumables = consumables,
6464
snackbarHostState = snackbarHostState,
6565
onDismissSnackbar = { viewModel.consume(BuilderStepConsumables.nullableSnackbar) },
@@ -157,13 +157,13 @@ private fun BudgetBuilderScreenContent(
157157

158158
@Composable
159159
private fun BuilderStepsSideEffects(
160-
step: BudgetBuilderAction.Step,
160+
args: BuilderStepNavArgs,
161161
consumables: BuilderStepConsumables,
162162
snackbarHostState: SnackbarHostState,
163163
onDismissSnackbar: () -> Unit,
164164
onNavigate: (BuilderStepConsumables.NavEvent) -> Unit,
165165
) {
166-
TrackEventSideEffect(event = AnalyticsEvent.builderStepScreenView(step))
166+
TrackEventSideEffect(event = AnalyticsEvent.builderStepScreenView(args))
167167
SnackbarSideEffect(
168168
snackbarHostState = snackbarHostState,
169169
snackbarVisuals = consumables.snackbar?.resolve(),

Diff for: features/finances/impl/src/main/kotlin/br/com/mob1st/features/finances/impl/ui/builder/steps/BuilderStepConsumables.kt

-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import br.com.mob1st.features.utils.errors.CommonErrorSnackbarState
2424
* All the properties should be consumed by the UI layer to trigger the corresponding actions, setting them to null.
2525
* @property dialog The dialog that can be shown.
2626
* @property navEvent The navigation target that can be triggered.
27-
* @property sheet The sheet that can be shown.
2827
* @property snackbar The snackbar that can be shown.
2928
*/
3029
@optics

Diff for: features/finances/impl/src/test/kotlin/br/com/mob1st/features/finances/impl/domain/events/ScreenViewEventsTest.kt

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package br.com.mob1st.features.finances.impl.domain.events
22

33
import br.com.mob1st.core.observability.events.AnalyticsEvent
4-
import br.com.mob1st.features.finances.impl.domain.entities.BudgetBuilderAction
5-
import br.com.mob1st.features.finances.impl.domain.entities.FixedExpensesStep
6-
import br.com.mob1st.features.finances.impl.domain.entities.FixedIncomesStep
7-
import br.com.mob1st.features.finances.impl.domain.entities.SeasonalExpensesStep
8-
import br.com.mob1st.features.finances.impl.domain.entities.VariableExpensesStep
4+
import br.com.mob1st.features.finances.impl.ui.builder.navigation.BuilderStepNavArgs
95
import br.com.mob1st.features.finances.impl.ui.category.navigation.CategoryDetailArgs
106
import io.kotest.property.Arb
117
import io.kotest.property.arbitrary.bind
@@ -22,10 +18,10 @@ internal class ScreenViewEventsTest {
2218
@ParameterizedTest
2319
@MethodSource("builderStepToEventSource")
2420
fun `GIVEN a step WHEN create screen view event THEN return the correct event key`(
25-
step: BudgetBuilderAction.Step,
21+
args: BuilderStepNavArgs,
2622
expectedEventKey: String,
2723
) {
28-
val actual = AnalyticsEvent.builderStepScreenView(step)
24+
val actual = AnalyticsEvent.builderStepScreenView(args)
2925
assertEquals(
3026
AnalyticsEvent(
3127
name = "screen_view",
@@ -71,19 +67,19 @@ internal class ScreenViewEventsTest {
7167
@JvmStatic
7268
fun builderStepToEventSource() = listOf(
7369
arguments(
74-
FixedExpensesStep,
70+
BuilderStepNavArgs.FixedExpensesStepArgs,
7571
"builder_fixed_expenses",
7672
),
7773
arguments(
78-
VariableExpensesStep,
74+
BuilderStepNavArgs.VariableExpensesStepArgs,
7975
"builder_variable_expenses",
8076
),
8177
arguments(
82-
FixedIncomesStep,
78+
BuilderStepNavArgs.FixedIncomesStepArgs,
8379
"builder_fixed_incomes",
8480
),
8581
arguments(
86-
SeasonalExpensesStep,
82+
BuilderStepNavArgs.SeasonalExpensesStepArgs,
8783
"builder_seasonal_expenses",
8884
),
8985
)

Diff for: features/finances/impl/src/test/kotlin/br/com/mob1st/features/finances/impl/ui/builder/navigation/BuilderCoordinatorTest.kt

+16-2
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,30 @@ class BuilderCoordinatorTest {
2828
@Test
2929
fun `GIVEN a next step WHEN navigate from intro THEN assert it goes to next step route`() {
3030
val event = Arb.bind<BuilderIntroNextStepNavEvent>().next()
31+
val args = BuilderStepNavArgs.map.getRightValue(event.step)
3132
coordinator.navigate(event)
32-
assertEquals(BuilderNavRoute.Step(event.step), navigationApi.routes.first())
33+
assertEquals(
34+
BuilderNavRoute.Step(args),
35+
navigationApi.routes.first(),
36+
)
3337
}
3438

3539
@Test
3640
fun `GIVEN a next step WHEN navigate from step THEN assert it goes to the next step route`() {
3741
val next = Arb.bind<BudgetBuilderAction.Step>().next()
42+
val args = BuilderStepNavArgs.map.getRightValue(next)
3843
coordinator.navigate(BuilderStepNextNavEvent(next))
3944
assertEquals(
40-
BuilderNavRoute.Step(next),
45+
BuilderNavRoute.Step(args),
46+
navigationApi.routes.first(),
47+
)
48+
}
49+
50+
@Test
51+
fun `GIVEN a complete builder action WHEN navigate from step THEN assert it goes to the completion route`() {
52+
coordinator.navigate(BuilderStepNextNavEvent(BudgetBuilderAction.Complete))
53+
assertEquals(
54+
BuilderNavRoute.Completion(),
4155
navigationApi.routes.first(),
4256
)
4357
}

0 commit comments

Comments
 (0)