Commit d4478719 by Aleksandr

Open a spot on the map from the job list

parent d7e060c1
......@@ -6,6 +6,7 @@ import java.util.Date
data class PrintJobListItem(
val id: String,
val spotName: String,
val spotCode: String?,
val cost: Float,
val paperInfo: String,
val isColor: Boolean,
......
package com.isidroid.c23.domain.use_case
import android.content.Context
import androidx.compose.ui.graphics.Color
import com.isidroid.c23.domain.dto.PrintJobListItem
import com.isidroid.c23.ext.getPrintJobStatus
import com.isidroid.c23.ext.getPrintJobStatusColor
import com.isidroid.core.FlowResult
import com.isidroid.job.constant.jobStatusName
import com.isidroid.job.repository.JobRepository
import com.isidroid.rendering.constant.printSizeName
import com.isidroid.spot.repository.SpotRepository
......@@ -37,6 +35,7 @@ class PrintJobsUseCase @Inject constructor(
PrintJobListItem(
id = job.id,
spotCode = richSpot?.spot?.code,
spotName = richSpot?.spot?.name ?: "Deleted spot",
cost = job.cost,
paperInfo = job.printSize.printSizeName,
......@@ -47,10 +46,16 @@ class PrintJobsUseCase @Inject constructor(
cover = job.sourceFiles?.firstOrNull()?.takeIf { File(it).exists() },
statusName = context.getString(getPrintJobStatus(job.status)),
accessCode = job.accessCode.orEmpty(),
createdAt = job.createdAt
createdAt = job.createdAt,
)
}
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
import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import com.isidroid.c23.ui.navigation.Home
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.PrintJobsScreen
import com.isidroid.c23.ui.screen.print_jobs.PrintJobsViewModel
import com.isidroid.core.ext.navigateSingleTopTo
@Composable
fun PrintJobsScreenDestination(navController: NavHostController) {
......@@ -20,6 +23,7 @@ fun PrintJobsScreenDestination(navController: NavHostController) {
when (effect) {
PrintJobsContract.Effect.Navigation.ToBack -> navController.popBackStack()
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 {
sealed interface Event : ViewEvent {
data object ToBack : Event
data class ToDetails(val id: String) : Event
data class ToSpot(val spotCode: String?) : Event
}
sealed interface Effect : ViewSideEffect {
sealed interface Navigation : Effect {
data object ToBack : Navigation
data class ToDetails(val id: String) : Navigation
data class ToMap(val lat: Double, val lng: Double) : Navigation
}
}
......
......@@ -43,7 +43,7 @@ fun PrintJobsScreen(
modifier = modifier.fillMaxSize(),
topBar = {
TopAppBarComponent(
text = stringResource(id = R.string.print_job_list),
text = stringResource(id = R.string.print_job_list),
colors = TopAppBarDefaults.topAppBarColors(),
onNavigationClick = { onEventSent(PrintJobsContract.Event.ToBack) }
)
......@@ -78,7 +78,8 @@ private fun ListComponent(
statusColor = item.statusColor,
createdAt = item.createdAt,
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
import com.isidroid.c23.ext.isDebug
import com.isidroid.core.FlowResult
import com.isidroid.core.vm.BaseViewModel
import com.isidroid.spot.model.Spot
import com.isidroid.utils.catchTimber
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
......@@ -26,6 +27,7 @@ class PrintJobsViewModel @Inject constructor(
when (event) {
PrintJobsContract.Event.ToBack -> setEffect { PrintJobsContract.Effect.Navigation.ToBack }
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(
}
}
}
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
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
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.count
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.onEach
import timber.log.Timber
......@@ -14,16 +12,18 @@ fun NavController.navigateSingleTopTo(
isSaveState: Boolean? = null,
isLaunchSingleTop: Boolean = true,
isRestoreState: Boolean? = null,
isInclusive: Boolean = true
isInclusive: Boolean = true,
popupToRoute: String? = null
) {
navigate(route) {
popUpTo(graph.findStartDestination().id) {
val node = popupToRoute?.let { graph.findNode(popupToRoute) } ?: graph.findStartDestination()
popUpTo(node.id) {
inclusive = isInclusive
if (isSaveState != null)
saveState = isSaveState
}
isLaunchSingleTop?.also { launchSingleTop = it }
isLaunchSingleTop.also { launchSingleTop = 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