Dodaj ekran startowy podczas sprawdzania sesji
This commit is contained in:
@@ -12,8 +12,8 @@ android {
|
|||||||
applicationId = "pl.firmatpp.kierowca"
|
applicationId = "pl.firmatpp.kierowca"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
versionCode = 13
|
versionCode = 14
|
||||||
versionName = "1.0.12"
|
versionName = "1.0.13"
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
buildConfigField("String", "API_BASE_URL", "\"https://api-intranet.firmatpp.pl/api/\"")
|
buildConfigField("String", "API_BASE_URL", "\"https://api-intranet.firmatpp.pl/api/\"")
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ fun DriverApp(viewModel: DriverViewModel) {
|
|||||||
val lifecycleOwner = LocalLifecycleOwner.current
|
val lifecycleOwner = LocalLifecycleOwner.current
|
||||||
var appInForeground by remember { mutableStateOf(true) }
|
var appInForeground by remember { mutableStateOf(true) }
|
||||||
|
|
||||||
BackHandler(enabled = state.screen != DriverScreen.Phone && state.screen != DriverScreen.Routes) {
|
BackHandler(enabled = state.screen != DriverScreen.Initializing && state.screen != DriverScreen.Phone && state.screen != DriverScreen.Routes) {
|
||||||
viewModel.back()
|
viewModel.back()
|
||||||
}
|
}
|
||||||
DisposableEffect(lifecycleOwner, state.screen) {
|
DisposableEffect(lifecycleOwner, state.screen) {
|
||||||
@@ -168,6 +168,7 @@ fun DriverApp(viewModel: DriverViewModel) {
|
|||||||
|
|
||||||
Box(Modifier.fillMaxSize().background(TppColors.Surface)) {
|
Box(Modifier.fillMaxSize().background(TppColors.Surface)) {
|
||||||
when (state.screen) {
|
when (state.screen) {
|
||||||
|
DriverScreen.Initializing -> StartupScreen()
|
||||||
DriverScreen.Phone -> PhoneScreen(state, viewModel::requestOtp)
|
DriverScreen.Phone -> PhoneScreen(state, viewModel::requestOtp)
|
||||||
DriverScreen.Otp -> OtpScreen(state, viewModel::updateOtpCode, viewModel::verifyOtp, viewModel::back)
|
DriverScreen.Otp -> OtpScreen(state, viewModel::updateOtpCode, viewModel::verifyOtp, viewModel::back)
|
||||||
DriverScreen.Routes -> RoutesScreen(
|
DriverScreen.Routes -> RoutesScreen(
|
||||||
@@ -182,7 +183,7 @@ fun DriverApp(viewModel: DriverViewModel) {
|
|||||||
DriverScreen.Photo -> PhotoScreen(state, viewModel::back)
|
DriverScreen.Photo -> PhotoScreen(state, viewModel::back)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.loading) {
|
if (state.loading && state.screen != DriverScreen.Initializing) {
|
||||||
Box(Modifier.fillMaxSize().background(Color.White.copy(alpha = 0.42f)), contentAlignment = Alignment.Center) {
|
Box(Modifier.fillMaxSize().background(Color.White.copy(alpha = 0.42f)), contentAlignment = Alignment.Center) {
|
||||||
CircularProgressIndicator(color = TppColors.Forest)
|
CircularProgressIndicator(color = TppColors.Forest)
|
||||||
}
|
}
|
||||||
@@ -190,6 +191,37 @@ fun DriverApp(viewModel: DriverViewModel) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun StartupScreen() {
|
||||||
|
Column(
|
||||||
|
Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.statusBarsPadding()
|
||||||
|
.navigationBarsPadding()
|
||||||
|
.padding(32.dp),
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
) {
|
||||||
|
Image(
|
||||||
|
painter = painterResource(R.drawable.tpp5),
|
||||||
|
contentDescription = "Firma TPP",
|
||||||
|
contentScale = ContentScale.Fit,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(120.dp),
|
||||||
|
)
|
||||||
|
Spacer(Modifier.height(32.dp))
|
||||||
|
CircularProgressIndicator(color = TppColors.Forest)
|
||||||
|
Spacer(Modifier.height(20.dp))
|
||||||
|
Text(
|
||||||
|
"Sprawdzanie sesji",
|
||||||
|
color = TppColors.Muted,
|
||||||
|
fontFamily = FontFamily.Monospace,
|
||||||
|
fontWeight = FontWeight.SemiBold,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun PhoneScreen(state: DriverUiState, onSubmit: (String) -> Unit) {
|
private fun PhoneScreen(state: DriverUiState, onSubmit: (String) -> Unit) {
|
||||||
var phoneDigits by remember(state.phone) { mutableStateOf(polishPhoneDigits(state.phone)) }
|
var phoneDigits by remember(state.phone) { mutableStateOf(polishPhoneDigits(state.phone)) }
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ import pl.firmatpp.kierowca.data.model.DriverDto
|
|||||||
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
||||||
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
||||||
|
|
||||||
enum class DriverScreen { Phone, Otp, Routes, Profile, Detail, Photo }
|
enum class DriverScreen { Initializing, Phone, Otp, Routes, Profile, Detail, Photo }
|
||||||
|
|
||||||
data class DriverUiState(
|
data class DriverUiState(
|
||||||
val screen: DriverScreen = DriverScreen.Phone,
|
val screen: DriverScreen = DriverScreen.Initializing,
|
||||||
val loading: Boolean = false,
|
val loading: Boolean = true,
|
||||||
val refreshing: Boolean = false,
|
val refreshing: Boolean = false,
|
||||||
val phone: String = "",
|
val phone: String = "",
|
||||||
val otpCode: String = "",
|
val otpCode: String = "",
|
||||||
@@ -45,7 +45,11 @@ class DriverViewModel(application: Application) : AndroidViewModel(application)
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
if (repository.hasToken()) refreshRoutes() else _state.update { it.copy(loading = false) }
|
if (repository.hasToken()) {
|
||||||
|
refreshRoutes()
|
||||||
|
} else {
|
||||||
|
_state.update { it.copy(screen = DriverScreen.Phone, loading = false) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +110,12 @@ class DriverViewModel(application: Application) : AndroidViewModel(application)
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}.onFailure { throwable ->
|
}.onFailure { throwable ->
|
||||||
_state.update { it.copy(error = throwable.message ?: "Wystapil blad.") }
|
_state.update {
|
||||||
|
it.copy(
|
||||||
|
screen = if (it.screen == DriverScreen.Initializing) DriverScreen.Phone else it.screen,
|
||||||
|
error = throwable.message ?: "Wystapil blad.",
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_state.update {
|
_state.update {
|
||||||
@@ -178,7 +187,7 @@ class DriverViewModel(application: Application) : AndroidViewModel(application)
|
|||||||
|
|
||||||
fun logout() = runLoading {
|
fun logout() = runLoading {
|
||||||
repository.logout()
|
repository.logout()
|
||||||
_state.update { DriverUiState(screen = DriverScreen.Phone) }
|
_state.update { DriverUiState(screen = DriverScreen.Phone, loading = false) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun runLoading(block: suspend () -> Unit) {
|
private fun runLoading(block: suspend () -> Unit) {
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package pl.firmatpp.kierowca.ui
|
||||||
|
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Assert.assertTrue
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class DriverUiStateTest {
|
||||||
|
@Test
|
||||||
|
fun startsOnInitializingScreenBeforeTokenCheckCompletes() {
|
||||||
|
val state = DriverUiState()
|
||||||
|
|
||||||
|
assertEquals(DriverScreen.Initializing, state.screen)
|
||||||
|
assertTrue(state.loading)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user