From c34d0d3c48860a40a002b064a14cc78f63cdf50b Mon Sep 17 00:00:00 2001 From: Karan Sharma <55722391+ksharma-xyz@users.noreply.github.com> Date: Thu, 13 Feb 2025 01:12:59 +1100 Subject: [PATCH] UI: Add mode selection filter to TimeTableScreen (#608) --- .../ui/state/timetable/TimeTableUiEvent.kt | 2 ++ .../composeResources/drawable/ic_check.xml | 9 +++++ .../ui/timetable/TimeTableDestination.kt | 4 +++ .../planner/ui/timetable/TimeTableScreen.kt | 36 ++++++++++++++++--- .../ui/timetable/TimeTableViewModel.kt | 6 ++++ .../ksharma/krail/taj/components/Button.kt | 2 +- 6 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_check.xml diff --git a/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/TimeTableUiEvent.kt b/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/TimeTableUiEvent.kt index 7af2b8fa..77f2a0e0 100644 --- a/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/TimeTableUiEvent.kt +++ b/feature/trip-planner/state/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/TimeTableUiEvent.kt @@ -20,4 +20,6 @@ sealed interface TimeTableUiEvent { data object AnalyticsDateTimeSelectorClicked : TimeTableUiEvent data class JourneyLegClicked(val expanded: Boolean) : TimeTableUiEvent + + data class ModeSelectionChanged(val x: String) : TimeTableUiEvent } diff --git a/feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_check.xml b/feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_check.xml new file mode 100644 index 00000000..5e4f1832 --- /dev/null +++ b/feature/trip-planner/ui/src/commonMain/composeResources/drawable/ic_check.xml @@ -0,0 +1,9 @@ + + + diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableDestination.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableDestination.kt index 1d8e0bae..2e71d296 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableDestination.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableDestination.kt @@ -80,6 +80,10 @@ internal fun NavGraphBuilder.timeTableDestination(navController: NavHostControll onJourneyLegClick = { journeyId -> viewModel.onEvent(TimeTableUiEvent.JourneyLegClicked(journeyId)) }, + onModeSelectionChanged = { unselectedModes -> + log(unselectedModes.toString()) + viewModel.onEvent(TimeTableUiEvent.ModeSelectionChanged("")) + } ) } } diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableScreen.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableScreen.kt index 2470cce2..949f7be1 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableScreen.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableScreen.kt @@ -27,10 +27,8 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.listSaver import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -42,14 +40,15 @@ import androidx.compose.ui.unit.dp import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toPersistentList import krail.feature.trip_planner.ui.generated.resources.Res import krail.feature.trip_planner.ui.generated.resources.ic_filter import krail.feature.trip_planner.ui.generated.resources.ic_reverse import krail.feature.trip_planner.ui.generated.resources.ic_star +import krail.feature.trip_planner.ui.generated.resources.ic_check import krail.feature.trip_planner.ui.generated.resources.ic_star_filled import org.jetbrains.compose.resources.painterResource import xyz.ksharma.krail.taj.LocalThemeColor +import xyz.ksharma.krail.taj.components.Button import xyz.ksharma.krail.taj.components.ButtonDefaults import xyz.ksharma.krail.taj.components.SubtleButton import xyz.ksharma.krail.taj.components.Text @@ -83,6 +82,7 @@ fun TimeTableScreen( onJourneyLegClick: (Boolean) -> Unit, modifier: Modifier = Modifier, dateTimeSelectorClicked: () -> Unit = {}, + onModeSelectionChanged: (Set) -> Unit = {}, ) { val themeColorHex by LocalThemeColor.current val themeColor = themeColorHex.hexToComposeColor() @@ -191,6 +191,7 @@ fun TimeTableScreen( dimensions = ButtonDefaults.mediumButtonSize(), ) { Row( + //todo - handle in Button horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.CenterVertically, ) { @@ -223,6 +224,7 @@ fun TimeTableScreen( transportMode = it, selected = !unselectedModesProductClass.contains(it.productClass), onClick = { + // Toggle / Set behavior if (unselectedModesProductClass.contains(it.productClass)) { unselectedModesProductClass.remove(it.productClass) } else { @@ -233,6 +235,32 @@ fun TimeTableScreen( } } } + + item("mode-selection-confirm-button") { + Button( + dimensions = ButtonDefaults.largeButtonSize(), + onClick = { + displayModeSelectionRow = false + onModeSelectionChanged(unselectedModesProductClass.toSet()) + }, + modifier = Modifier + .padding(vertical = 8.dp, horizontal = 12.dp) + .animateItem() + ) { + //todo - handle in Button + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(Res.drawable.ic_check), + contentDescription = null, + modifier = Modifier.size(20.dp), + ) + Text("Done", modifier = Modifier.padding(start = 4.dp)) + } + } + } } item { @@ -240,7 +268,7 @@ fun TimeTableScreen( } if (timeTableState.isError) { - item { + item("error") { ErrorMessage( title = "Eh! That's not looking right mate!", message = "Let's try again.", diff --git a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt index bc94a5bd..9d5a0805 100644 --- a/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt +++ b/feature/trip-planner/ui/src/commonMain/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt @@ -148,9 +148,15 @@ class TimeTableViewModel( is TimeTableUiEvent.JourneyLegClicked -> { analytics.track(AnalyticsEvent.JourneyLegClickEvent(expanded = event.expanded)) } + + is TimeTableUiEvent.ModeSelectionChanged -> onModeSelectionChanged() } } + private fun onModeSelectionChanged() { + + } + private fun onDateTimeSelectionChanged(item: DateTimeSelectionItem?) { log("DateTimeSelectionChanged: $item") // Verify if date time selection has actually changed, otherwise, api will be called unnecessarily. diff --git a/taj/src/commonMain/kotlin/xyz/ksharma/krail/taj/components/Button.kt b/taj/src/commonMain/kotlin/xyz/ksharma/krail/taj/components/Button.kt index 5338a326..7e14830b 100644 --- a/taj/src/commonMain/kotlin/xyz/ksharma/krail/taj/components/Button.kt +++ b/taj/src/commonMain/kotlin/xyz/ksharma/krail/taj/components/Button.kt @@ -47,7 +47,7 @@ fun Button( colors: ButtonColors = ButtonDefaults.buttonColors(), dimensions: ButtonDimensions = ButtonDefaults.largeButtonSize(), enabled: Boolean = true, - content: @Composable () -> Unit, + content: @Composable () -> Unit, // RowScope and place ) { val contentAlphaProvider = rememberSaveable(enabled) { if (enabled) EnabledContentAlpha else DisabledContentAlpha }