From 9ddf74dd3959dfcc61e00f0f351da3c3e5e24f43 Mon Sep 17 00:00:00 2001 From: Karan Sharma <55722391+ksharma-xyz@users.noreply.github.com> Date: Sat, 26 Oct 2024 21:31:53 +1100 Subject: [PATCH] Button click for save and delete trip --- .../ui/state/savedtrip/SavedTripUiEvent.kt | 9 ++-- .../trip/planner/ui/state/timetable/Trip.kt | 3 ++ .../planner/ui/components/SavedTripCard.kt | 49 +++++++++++++------ .../ui/savedtrips/SavedTripsDestination.kt | 14 +++++- .../planner/ui/savedtrips/SavedTripsScreen.kt | 25 +++++++--- .../ui/savedtrips/SavedTripsViewModel.kt | 42 ++++++---------- .../ui/timetable/TimeTableViewModel.kt | 4 +- 7 files changed, 89 insertions(+), 57 deletions(-) diff --git a/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/savedtrip/SavedTripUiEvent.kt b/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/savedtrip/SavedTripUiEvent.kt index 445e686f..a05379e7 100644 --- a/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/savedtrip/SavedTripUiEvent.kt +++ b/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/savedtrip/SavedTripUiEvent.kt @@ -1,11 +1,8 @@ package xyz.ksharma.krail.trip.planner.ui.state.savedtrip -import xyz.ksharma.krail.trip.planner.ui.state.searchstop.model.StopItem +import xyz.ksharma.krail.trip.planner.ui.state.timetable.Trip sealed interface SavedTripUiEvent { - data object LoadSavedTrips : SavedTripUiEvent - data class SavedTripClicked(val savedTrip: String) : SavedTripUiEvent - data class DeleteSavedTrip(val savedTrip: String) : SavedTripUiEvent - data class OnSearchButtonClicked(val fromStopItem: StopItem, val toStopItem: StopItem) : - SavedTripUiEvent + data class SavedTripClicked(val trip: Trip) : SavedTripUiEvent + data class DeleteSavedTrip(val trip: Trip) : SavedTripUiEvent } diff --git a/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/Trip.kt b/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/Trip.kt index c9419069..60ae0bb4 100644 --- a/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/Trip.kt +++ b/feature/trip-planner/state/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/state/timetable/Trip.kt @@ -10,6 +10,9 @@ data class Trip( val toStopId: String, val toStopName: String, ) { + val tripId: String + get() = "$fromStopId$toStopId" + fun toJsonString() = Json.encodeToString(serializer(), this) companion object { diff --git a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/components/SavedTripCard.kt b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/components/SavedTripCard.kt index 69d087e3..fbff2358 100644 --- a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/components/SavedTripCard.kt +++ b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/components/SavedTripCard.kt @@ -28,12 +28,12 @@ import xyz.ksharma.krail.design.system.components.Text import xyz.ksharma.krail.design.system.preview.PreviewComponent import xyz.ksharma.krail.design.system.theme.KrailTheme import xyz.ksharma.krail.trip.planner.ui.state.TransportMode +import xyz.ksharma.krail.trip.planner.ui.state.timetable.Trip import xyz.ksharma.krail.design.system.R as DSR @Composable fun SavedTripCard( - origin: String, - destination: String, + trip: Trip, onStarClick: () -> Unit, onCardClick: () -> Unit, modifier: Modifier = Modifier, @@ -67,9 +67,10 @@ fun SavedTripCard( modifier = Modifier .padding(horizontal = 16.dp) .weight(1f), + verticalArrangement = Arrangement.spacedBy(8.dp), ) { - Text(text = origin, style = KrailTheme.typography.bodyMedium) - Text(text = destination, style = KrailTheme.typography.bodyMedium) + Text(text = trip.fromStopName, style = KrailTheme.typography.bodyMedium) + Text(text = trip.toStopName, style = KrailTheme.typography.bodyMedium) } Box( @@ -105,8 +106,12 @@ fun SavedTripCard( private fun SavedTripCardPreview() { KrailTheme { SavedTripCard( - origin = "Edmondson Park Station", - destination = "Harris Park Station", + trip = Trip( + fromStopId = "1", + fromStopName = "Edmondson Park Station", + toStopId = "2", + toStopName = "Harris Park Station", + ), primaryTransportMode = TransportMode.Train(), onCardClick = {}, onStarClick = {}, @@ -126,32 +131,48 @@ private fun SavedTripCardListPreview() { verticalArrangement = Arrangement.spacedBy(16.dp), ) { SavedTripCard( - origin = "Edmondson Park Station", - destination = "Harris Park Station", + trip = Trip( + fromStopId = "1", + fromStopName = "Edmondson Park Station", + toStopId = "2", + toStopName = "Harris Park Station", + ), primaryTransportMode = TransportMode.Train(), onCardClick = {}, onStarClick = {}, ) SavedTripCard( - origin = "Harrington Street, Stand D", - destination = "Albert Rd, Stand A", + trip = Trip( + fromStopId = "1", + fromStopName = "Harrington Street, Stand D", + toStopId = "2", + toStopName = "Albert Rd, Stand A", + ), primaryTransportMode = TransportMode.Bus(), onCardClick = {}, onStarClick = {}, ) SavedTripCard( - origin = "Manly Wharf", - destination = "Circular Quay Wharf", + trip = Trip( + fromStopId = "1", + fromStopName = "Manly Wharf", + toStopId = "2", + toStopName = "Circular Quay Wharf", + ), primaryTransportMode = TransportMode.Ferry(), onCardClick = {}, onStarClick = {}, ) SavedTripCard( - origin = "Manly Wharf", - destination = "Circular Quay Wharf", + trip = Trip( + fromStopId = "1", + fromStopName = "Manly Wharf", + toStopId = "2", + toStopName = "Circular Quay Wharf", + ), primaryTransportMode = null, onCardClick = {}, onStarClick = {}, diff --git a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt index 39b63567..e937b1ac 100644 --- a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt +++ b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsDestination.kt @@ -73,8 +73,17 @@ internal fun NavGraphBuilder.savedTripsDestination(navController: NavHostControl fromStopItem = toStopItem toStopItem = bufferStop }, - onSearchButtonClick = { - if (fromStopItem != null && toStopItem != null) { + onSearchButtonClick = { fromStop, toStop -> + if (fromStop != null && toStop != null) { + navController.navigate( + TimeTableRoute( + fromStopId = fromStop.stopId, + fromStopName = fromStop.stopName, + toStopId = toStop.stopId, + toStopName = toStop.stopName, + ), + ) + } else if (fromStopItem != null && toStopItem != null) { navController.navigate( TimeTableRoute( fromStopId = fromStopItem?.stopId!!, @@ -88,6 +97,7 @@ internal fun NavGraphBuilder.savedTripsDestination(navController: NavHostControl Timber.e("Select both stops") } }, + onEvent = { event -> viewModel.onEvent(event) }, ) } } diff --git a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt index 6c5e1791..974061c1 100644 --- a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt +++ b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsScreen.kt @@ -21,6 +21,7 @@ import xyz.ksharma.krail.design.system.theme.KrailTheme import xyz.ksharma.krail.trip.planner.ui.R import xyz.ksharma.krail.trip.planner.ui.components.SavedTripCard import xyz.ksharma.krail.trip.planner.ui.components.SearchStopRow +import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripUiEvent import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripsState import xyz.ksharma.krail.trip.planner.ui.state.searchstop.model.StopItem @@ -33,8 +34,8 @@ fun SavedTripsScreen( fromButtonClick: () -> Unit = {}, toButtonClick: () -> Unit = {}, onReverseButtonClick: () -> Unit = {}, - onSearchButtonClick: () -> Unit = {}, -// onEvent: (SavedTripUiEvent) -> Unit = {}, + onSearchButtonClick: (StopItem?, StopItem?) -> Unit = { _, _ -> }, + onEvent: (SavedTripUiEvent) -> Unit = {}, ) { Box( modifier = modifier @@ -57,10 +58,20 @@ fun SavedTripsScreen( key = { it.fromStopId + it.toStopId }, ) { trip -> SavedTripCard( - origin = trip.fromStopName, - destination = trip.toStopName, - onStarClick = {}, - onCardClick = {}, + trip = trip, + onStarClick = { onEvent(SavedTripUiEvent.DeleteSavedTrip(trip)) }, + onCardClick = { + onSearchButtonClick( + StopItem( + stopId = trip.fromStopId, + stopName = trip.fromStopName, + ), + StopItem( + stopId = trip.toStopId, + stopName = trip.toStopName, + ), + ) + }, modifier = Modifier.padding(horizontal = 16.dp), ) Spacer(modifier = Modifier.height(12.dp)) @@ -74,7 +85,7 @@ fun SavedTripsScreen( fromButtonClick = fromButtonClick, toButtonClick = toButtonClick, onReverseButtonClick = onReverseButtonClick, - onSearchButtonClick = onSearchButtonClick, + onSearchButtonClick = { onSearchButtonClick(null, null) }, ) } } diff --git a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsViewModel.kt b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsViewModel.kt index 64333420..66a1dd3b 100644 --- a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsViewModel.kt +++ b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/savedtrips/SavedTripsViewModel.kt @@ -12,10 +12,12 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import timber.log.Timber import xyz.ksharma.krail.di.AppDispatchers import xyz.ksharma.krail.di.Dispatcher import xyz.ksharma.krail.sandook.Sandook import xyz.ksharma.krail.sandook.di.SandookFactory +import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripUiEvent import xyz.ksharma.krail.trip.planner.ui.state.savedtrip.SavedTripsState import xyz.ksharma.krail.trip.planner.ui.state.timetable.Trip import javax.inject.Inject @@ -55,37 +57,25 @@ class SavedTripsViewModel @Inject constructor( } } - /* - - fun onEvent(event: SavedTripUiEvent) { - when (event) { - is SavedTripUiEvent.DeleteSavedTrip -> onDeleteSavedTrip(event.savedTrip) - SavedTripUiEvent.LoadSavedTrips -> onLoadSavedTrips() - is SavedTripUiEvent.SavedTripClicked -> onSavedTripClicked(event.savedTrip) - is SavedTripUiEvent.OnSearchButtonClicked -> onSearchButtonClicked(event.fromStopItem, event.toStopItem) - } - } - - private fun onSearchButtonClicked(fromStopItem: StopItem, toStopItem: StopItem) { - Timber.d("onSearchButtonClicked") - } - - private fun onSavedTripClicked(savedTrip: String) { - Timber.d("onSavedTripClicked") + fun onEvent(event: SavedTripUiEvent) { + when (event) { + is SavedTripUiEvent.DeleteSavedTrip -> onDeleteSavedTrip(event.trip) + is SavedTripUiEvent.SavedTripClicked -> onSavedTripClicked(event.trip) } + } - private fun onLoadSavedTrips() { - Timber.d("onLoadSavedTrips") - updateUiState { - copy(trip = "Central to Town Hall") - } + private fun onDeleteSavedTrip(savedTrip: Trip) { + Timber.d("onDeleteSavedTrip: $savedTrip") + viewModelScope.launch(context = ioDispatcher) { + sandook.remove(key = savedTrip.tripId) + loadSavedTrips() } + } - private fun onDeleteSavedTrip(savedTrip: String) { - Timber.d("onDeleteSavedTrip") - } + private fun onSavedTripClicked(savedTrip: Trip) { + Timber.d("onSavedTripClicked: $savedTrip") + } -*/ private fun updateUiState(block: SavedTripsState.() -> SavedTripsState) { _uiState.update(block) } diff --git a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt index 845dcfd6..12c9a8e7 100644 --- a/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt +++ b/feature/trip-planner/ui/src/main/kotlin/xyz/ksharma/krail/trip/planner/ui/timetable/TimeTableViewModel.kt @@ -71,8 +71,8 @@ class TimeTableViewModel @Inject constructor( Timber.d("Save Trip Button Clicked") tripInfo?.let { trip -> Timber.d("Save Trip: $trip") - sandook.putString(key = trip.fromStopId + trip.toStopId, value = trip.toJsonString()) - sandook.getString(key = trip.fromStopId + trip.toStopId)?.let { savedTrip -> + sandook.putString(key = trip.tripId, value = trip.toJsonString()) + sandook.getString(key = trip.tripId)?.let { savedTrip -> Timber.d("Saved Trip (Pref): ${Trip.fromJsonString(savedTrip)}") } updateUiState { copy(isTripSaved = true) }