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 }