From d0d2e1f8498975aee2cbe245e85b9e148c216005 Mon Sep 17 00:00:00 2001 From: drnal Date: Wed, 3 Dec 2025 19:09:08 +0700 Subject: [PATCH] Autorization screen --- .../work/ui/screen/NavigationGraph.kt | 2 +- .../work/ui/screen/auth/AuthScreen.kt | 41 ++++++++++++++----- .../work/ui/screen/auth/AuthState.kt | 3 +- .../work/ui/screen/auth/AuthViewModel.kt | 25 +++++++++-- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt index 01b0f32..1d26087 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt @@ -35,7 +35,7 @@ fun AppNavHost( Box( contentAlignment = Alignment.Center ) { - Text(text = "Hello") + Text(text = "MainScreen") } } composable { diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt index f99978e..1e85042 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthScreen.kt @@ -45,6 +45,9 @@ fun AuthScreen( } } + + + Column( modifier = Modifier .fillMaxSize() @@ -52,11 +55,7 @@ fun AuthScreen( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - Text( - text = stringResource(R.string.auth_title), - style = MaterialTheme.typography.headlineSmall, - textAlign = TextAlign.Center - ) + when (val currentState = state) { is AuthState.Data -> Content(viewModel, currentState) is AuthState.Loading -> { @@ -64,6 +63,7 @@ fun AuthScreen( modifier = Modifier.size(64.dp) ) } + is AuthState.Error -> Content(viewModel, currentState) } } } @@ -71,15 +71,23 @@ fun AuthScreen( @Composable private fun Content( viewModel: AuthViewModel, - state: AuthState.Data + state: AuthState ) { - var inputText by remember { mutableStateOf("") } + val inputText = when (state) { + is AuthState.Data -> state.text + is AuthState.Error -> state.text + else -> "" } + + Text( + text = stringResource(R.string.auth_title), + style = MaterialTheme.typography.headlineSmall, + textAlign = TextAlign.Center + ) Spacer(modifier = Modifier.size(16.dp)) TextField( modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), value = inputText, onValueChange = { - inputText = it viewModel.onIntent(AuthIntent.TextInput(it)) }, label = { Text(stringResource(R.string.auth_label)) } @@ -89,9 +97,20 @@ private fun Content( modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(), onClick = { viewModel.onIntent(AuthIntent.Send(inputText)) + }, - enabled = true - ) { + enabled = inputText.length == 4 && !inputText.isNullOrEmpty() && inputText.matches("[a-zA-Z0-9]+".toRegex()), + ) { Text(stringResource(R.string.auth_sign_in)) } -} \ No newline at end of file + Spacer(modifier = Modifier.size(24.dp)) + if (state is AuthState.Error) { + Text( + modifier = Modifier.testTag(TestIds.Auth.ERROR), + text = state.message, + style = MaterialTheme.typography.labelMedium, + textAlign = TextAlign.Center, + color = Color.Red + ) + } + } diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthState.kt b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthState.kt index a06ba76..169c0d9 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthState.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthState.kt @@ -2,5 +2,6 @@ package ru.myitschool.work.ui.screen.auth sealed interface AuthState { object Loading: AuthState - object Data: AuthState + class Data(val text: String = ""): AuthState + data class Error(val text: String, val message: String) : AuthState } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt index 3153640..dee0cbc 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt @@ -1,5 +1,8 @@ package ru.myitschool.work.ui.screen.auth +import android.content.Context +import android.content.Context.MODE_PRIVATE +import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers @@ -15,29 +18,43 @@ import ru.myitschool.work.domain.auth.CheckAndSaveAuthCodeUseCase class AuthViewModel : ViewModel() { private val checkAndSaveAuthCodeUseCase by lazy { CheckAndSaveAuthCodeUseCase(AuthRepository) } - private val _uiState = MutableStateFlow(AuthState.Data) + private val _uiState = MutableStateFlow(AuthState.Data()) val uiState: StateFlow = _uiState.asStateFlow() private val _actionFlow: MutableSharedFlow = MutableSharedFlow() val actionFlow: SharedFlow = _actionFlow + fun onIntent(intent: AuthIntent) { when (intent) { is AuthIntent.Send -> { viewModelScope.launch(Dispatchers.Default) { + val currentText = when (val s = _uiState.value) { + is AuthState.Data -> s.text + is AuthState.Error -> s.text + else -> "" + } _uiState.update { AuthState.Loading } - checkAndSaveAuthCodeUseCase.invoke("9999").fold( + checkAndSaveAuthCodeUseCase.invoke(intent.text).fold( onSuccess = { + _actionFlow.emit(Unit) }, onFailure = { error -> error.printStackTrace() - _actionFlow.emit(Unit) + _uiState.value = AuthState.Error(text = currentText,error.message ?: "Ошибка") } ) } } - is AuthIntent.TextInput -> Unit + is AuthIntent.TextInput -> { + when (val stateValue = _uiState.value) { + is AuthState.Data -> _uiState.value = AuthState.Data(text = intent.text) + is AuthState.Error -> _uiState.value = AuthState.Data(intent.text) + is AuthState.Loading -> Unit + } + } } } + } \ No newline at end of file