Commit d4478719 by Aleksandr

Open a spot on the map from the job list

parent d7e060c1
...@@ -6,6 +6,7 @@ import java.util.Date ...@@ -6,6 +6,7 @@ import java.util.Date
data class PrintJobListItem( data class PrintJobListItem(
val id: String, val id: String,
val spotName: String, val spotName: String,
val spotCode: String?,
val cost: Float, val cost: Float,
val paperInfo: String, val paperInfo: String,
val isColor: Boolean, val isColor: Boolean,
......
package com.isidroid.c23.domain.use_case package com.isidroid.c23.domain.use_case
import android.content.Context import android.content.Context
import androidx.compose.ui.graphics.Color
import com.isidroid.c23.domain.dto.PrintJobListItem import com.isidroid.c23.domain.dto.PrintJobListItem
import com.isidroid.c23.ext.getPrintJobStatus import com.isidroid.c23.ext.getPrintJobStatus
import com.isidroid.c23.ext.getPrintJobStatusColor import com.isidroid.c23.ext.getPrintJobStatusColor
import com.isidroid.core.FlowResult import com.isidroid.core.FlowResult
import com.isidroid.job.constant.jobStatusName
import com.isidroid.job.repository.JobRepository import com.isidroid.job.repository.JobRepository
import com.isidroid.rendering.constant.printSizeName import com.isidroid.rendering.constant.printSizeName
import com.isidroid.spot.repository.SpotRepository import com.isidroid.spot.repository.SpotRepository
...@@ -37,6 +35,7 @@ class PrintJobsUseCase @Inject constructor( ...@@ -37,6 +35,7 @@ class PrintJobsUseCase @Inject constructor(
PrintJobListItem( PrintJobListItem(
id = job.id, id = job.id,
spotCode = richSpot?.spot?.code,
spotName = richSpot?.spot?.name ?: "Deleted spot", spotName = richSpot?.spot?.name ?: "Deleted spot",
cost = job.cost, cost = job.cost,
paperInfo = job.printSize.printSizeName, paperInfo = job.printSize.printSizeName,
...@@ -47,10 +46,16 @@ class PrintJobsUseCase @Inject constructor( ...@@ -47,10 +46,16 @@ class PrintJobsUseCase @Inject constructor(
cover = job.sourceFiles?.firstOrNull()?.takeIf { File(it).exists() }, cover = job.sourceFiles?.firstOrNull()?.takeIf { File(it).exists() },
statusName = context.getString(getPrintJobStatus(job.status)), statusName = context.getString(getPrintJobStatus(job.status)),
accessCode = job.accessCode.orEmpty(), accessCode = job.accessCode.orEmpty(),
createdAt = job.createdAt createdAt = job.createdAt,
) )
} }
emit(FlowResult.Success(result)) emit(FlowResult.Success(result))
} }
fun findSpot(spotCode: String) = flow {
emit(FlowResult.Loading)
val result = spotRepository.findRichSpot(spotCode)?.spot
emit(FlowResult.Success(result))
}
} }
\ No newline at end of file
...@@ -3,10 +3,13 @@ package com.isidroid.c23.ui.navigation.destinations ...@@ -3,10 +3,13 @@ package com.isidroid.c23.ui.navigation.destinations
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.isidroid.c23.ui.navigation.Home
import com.isidroid.c23.ui.navigation.routeJobDetails import com.isidroid.c23.ui.navigation.routeJobDetails
import com.isidroid.c23.ui.navigation.routeMap
import com.isidroid.c23.ui.screen.print_jobs.PrintJobsContract import com.isidroid.c23.ui.screen.print_jobs.PrintJobsContract
import com.isidroid.c23.ui.screen.print_jobs.PrintJobsScreen import com.isidroid.c23.ui.screen.print_jobs.PrintJobsScreen
import com.isidroid.c23.ui.screen.print_jobs.PrintJobsViewModel import com.isidroid.c23.ui.screen.print_jobs.PrintJobsViewModel
import com.isidroid.core.ext.navigateSingleTopTo
@Composable @Composable
fun PrintJobsScreenDestination(navController: NavHostController) { fun PrintJobsScreenDestination(navController: NavHostController) {
...@@ -20,6 +23,7 @@ fun PrintJobsScreenDestination(navController: NavHostController) { ...@@ -20,6 +23,7 @@ fun PrintJobsScreenDestination(navController: NavHostController) {
when (effect) { when (effect) {
PrintJobsContract.Effect.Navigation.ToBack -> navController.popBackStack() PrintJobsContract.Effect.Navigation.ToBack -> navController.popBackStack()
is PrintJobsContract.Effect.Navigation.ToDetails -> navController.navigate(routeJobDetails(id = effect.id)) is PrintJobsContract.Effect.Navigation.ToDetails -> navController.navigate(routeJobDetails(id = effect.id))
is PrintJobsContract.Effect.Navigation.ToMap -> navController.navigateSingleTopTo(routeMap(lat = effect.lat.toString(), lng = effect.lng.toString()), popupToRoute = Home.route)
} }
}, },
) )
......
...@@ -9,12 +9,14 @@ class PrintJobsContract { ...@@ -9,12 +9,14 @@ class PrintJobsContract {
sealed interface Event : ViewEvent { sealed interface Event : ViewEvent {
data object ToBack : Event data object ToBack : Event
data class ToDetails(val id: String) : Event data class ToDetails(val id: String) : Event
data class ToSpot(val spotCode: String?) : Event
} }
sealed interface Effect : ViewSideEffect { sealed interface Effect : ViewSideEffect {
sealed interface Navigation : Effect { sealed interface Navigation : Effect {
data object ToBack : Navigation data object ToBack : Navigation
data class ToDetails(val id: String) : Navigation data class ToDetails(val id: String) : Navigation
data class ToMap(val lat: Double, val lng: Double) : Navigation
} }
} }
......
...@@ -78,7 +78,8 @@ private fun ListComponent( ...@@ -78,7 +78,8 @@ private fun ListComponent(
statusColor = item.statusColor, statusColor = item.statusColor,
createdAt = item.createdAt, createdAt = item.createdAt,
modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp), modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp),
clickOnCard = { onEventSent(PrintJobsContract.Event.ToDetails(item.id)) } clickOnCard = { onEventSent(PrintJobsContract.Event.ToDetails(item.id)) },
clickOnSpot = { onEventSent(PrintJobsContract.Event.ToSpot(item.spotCode)) }
) )
} }
} }
......
...@@ -5,6 +5,7 @@ import com.isidroid.c23.domain.use_case.PrintJobsUseCase ...@@ -5,6 +5,7 @@ import com.isidroid.c23.domain.use_case.PrintJobsUseCase
import com.isidroid.c23.ext.isDebug import com.isidroid.c23.ext.isDebug
import com.isidroid.core.FlowResult import com.isidroid.core.FlowResult
import com.isidroid.core.vm.BaseViewModel import com.isidroid.core.vm.BaseViewModel
import com.isidroid.spot.model.Spot
import com.isidroid.utils.catchTimber import com.isidroid.utils.catchTimber
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -26,6 +27,7 @@ class PrintJobsViewModel @Inject constructor( ...@@ -26,6 +27,7 @@ class PrintJobsViewModel @Inject constructor(
when (event) { when (event) {
PrintJobsContract.Event.ToBack -> setEffect { PrintJobsContract.Effect.Navigation.ToBack } PrintJobsContract.Event.ToBack -> setEffect { PrintJobsContract.Effect.Navigation.ToBack }
is PrintJobsContract.Event.ToDetails -> setEffect { PrintJobsContract.Effect.Navigation.ToDetails(event.id) } is PrintJobsContract.Event.ToDetails -> setEffect { PrintJobsContract.Effect.Navigation.ToDetails(event.id) }
is PrintJobsContract.Event.ToSpot -> openSpot(event.spotCode)
} }
} }
...@@ -41,5 +43,24 @@ class PrintJobsViewModel @Inject constructor( ...@@ -41,5 +43,24 @@ class PrintJobsViewModel @Inject constructor(
} }
} }
} }
private suspend fun openSpot(spotCode: String?) {
spotCode ?: return
useCase.findSpot(spotCode)
.flowOn(Dispatchers.IO)
.catchTimber { }
.collect { res ->
when (res) {
FlowResult.Loading -> {}
is FlowResult.Success -> openSpotOnMap(res.result)
}
}
}
// handle callbacks // handle callbacks
private fun openSpotOnMap(spot: Spot?) {
spot ?: return
setEffect { PrintJobsContract.Effect.Navigation.ToMap(lat = spot.lat, lng = spot.lng) }
}
} }
\ No newline at end of file
...@@ -4,8 +4,6 @@ import androidx.navigation.NavController ...@@ -4,8 +4,6 @@ import androidx.navigation.NavController
import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.count
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import timber.log.Timber import timber.log.Timber
...@@ -14,16 +12,18 @@ fun NavController.navigateSingleTopTo( ...@@ -14,16 +12,18 @@ fun NavController.navigateSingleTopTo(
isSaveState: Boolean? = null, isSaveState: Boolean? = null,
isLaunchSingleTop: Boolean = true, isLaunchSingleTop: Boolean = true,
isRestoreState: Boolean? = null, isRestoreState: Boolean? = null,
isInclusive: Boolean = true isInclusive: Boolean = true,
popupToRoute: String? = null
) { ) {
navigate(route) { navigate(route) {
popUpTo(graph.findStartDestination().id) { val node = popupToRoute?.let { graph.findNode(popupToRoute) } ?: graph.findStartDestination()
popUpTo(node.id) {
inclusive = isInclusive inclusive = isInclusive
if (isSaveState != null) if (isSaveState != null)
saveState = isSaveState saveState = isSaveState
} }
isLaunchSingleTop?.also { launchSingleTop = it } isLaunchSingleTop.also { launchSingleTop = it }
isRestoreState?.also { restoreState = it } isRestoreState?.also { restoreState = it }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment