From acb65d63cb08e2d2817f5c807c3a4f2758d5082c Mon Sep 17 00:00:00 2001 From: nicktun Date: Sun, 30 Nov 2025 16:55:10 +0300 Subject: [PATCH] Login screen implemented (without saving data) --- .../java/ru/myitschool/work/core/TestIds.kt | 1 + .../work/data/repo/AuthRepository.kt | 1 + .../myitschool/work/ui/root/RootActivity.kt | 1 + .../work/ui/screen/NavigationGraph.kt | 4 +-- .../work/ui/screen/auth/AuthScreen.kt | 28 +++++++++++++++---- .../work/ui/screen/auth/AuthState.kt | 2 ++ .../work/ui/screen/auth/AuthViewModel.kt | 21 ++++++++++++-- .../java/ru/myitschool/work/ui/theme/Theme.kt | 2 +- 8 files changed, 48 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/ru/myitschool/work/core/TestIds.kt b/app/src/main/java/ru/myitschool/work/core/TestIds.kt index d67b884..748f7b2 100644 --- a/app/src/main/java/ru/myitschool/work/core/TestIds.kt +++ b/app/src/main/java/ru/myitschool/work/core/TestIds.kt @@ -6,6 +6,7 @@ object TestIds { const val SIGN_BUTTON = "auth_sign_button" const val CODE_INPUT = "auth_code_input" } + object Main { const val ERROR = "main_error" const val ADD_BUTTON = "main_add_button" diff --git a/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt index 3ef28f1..db1293e 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.data.repo +import android.util.Log import ru.myitschool.work.data.source.NetworkDataSource object AuthRepository { diff --git a/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt index 54b156d..d373d0c 100644 --- a/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt @@ -15,6 +15,7 @@ class RootActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() + actionBar?.hide() setContent { WorkTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> 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..c83595e 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,14 +35,14 @@ fun AppNavHost( Box( contentAlignment = Alignment.Center ) { - Text(text = "Hello") + Text(text = "MAIN") } } composable { Box( contentAlignment = Alignment.Center ) { - Text(text = "Hello") + Text(text = "BOOK") } } } 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..de6661d 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 @@ -1,5 +1,6 @@ package ru.myitschool.work.ui.screen.auth +import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -10,6 +11,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.Composable @@ -22,6 +24,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -54,16 +57,16 @@ fun AuthScreen( ) { Text( text = stringResource(R.string.auth_title), - style = MaterialTheme.typography.headlineSmall, + style = MaterialTheme.typography.headlineMedium, textAlign = TextAlign.Center ) when (val currentState = state) { - is AuthState.Data -> Content(viewModel, currentState) is AuthState.Loading -> { CircularProgressIndicator( modifier = Modifier.size(64.dp) ) } + else -> Content(viewModel, currentState) } } } @@ -71,11 +74,14 @@ fun AuthScreen( @Composable private fun Content( viewModel: AuthViewModel, - state: AuthState.Data + state: AuthState, ) { var inputText by remember { mutableStateOf("") } + val err by viewModel.errorFlow.collectAsState() + val isButtonEnabled by viewModel.isButtonEnabled.collectAsState() + Spacer(modifier = Modifier.size(16.dp)) - TextField( + OutlinedTextField( modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), value = inputText, onValueChange = { @@ -85,12 +91,22 @@ private fun Content( label = { Text(stringResource(R.string.auth_label)) } ) Spacer(modifier = Modifier.size(16.dp)) + if (state == AuthState.Error) { + Text( + text = err, + color = MaterialTheme.colorScheme.error, + modifier = Modifier.testTag(TestIds.Auth.ERROR) + ) + Spacer(modifier = Modifier.size(16.dp)) + } Button( - modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(), + modifier = Modifier + .testTag(TestIds.Auth.SIGN_BUTTON) + .fillMaxWidth(), onClick = { viewModel.onIntent(AuthIntent.Send(inputText)) }, - enabled = true + enabled = isButtonEnabled ) { Text(stringResource(R.string.auth_sign_in)) } 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..6770dc1 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 @@ -3,4 +3,6 @@ package ru.myitschool.work.ui.screen.auth sealed interface AuthState { object Loading: AuthState object Data: AuthState + + object Error: 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..9896bd9 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,6 @@ package ru.myitschool.work.ui.screen.auth +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers @@ -18,26 +19,40 @@ class AuthViewModel : ViewModel() { private val _uiState = MutableStateFlow(AuthState.Data) val uiState: StateFlow = _uiState.asStateFlow() + private val _errorFlow = MutableStateFlow("") + val errorFlow: StateFlow = _errorFlow.asStateFlow() + + private val _isButtonEnabled = MutableStateFlow(false) + val isButtonEnabled: StateFlow = _isButtonEnabled.asStateFlow() + private val _actionFlow: MutableSharedFlow = MutableSharedFlow() val actionFlow: SharedFlow = _actionFlow fun onIntent(intent: AuthIntent) { when (intent) { is AuthIntent.Send -> { + onIntent(AuthIntent.TextInput("")) viewModelScope.launch(Dispatchers.Default) { _uiState.update { AuthState.Loading } - checkAndSaveAuthCodeUseCase.invoke("9999").fold( + checkAndSaveAuthCodeUseCase.invoke(intent.text).fold( onSuccess = { _actionFlow.emit(Unit) }, onFailure = { error -> error.printStackTrace() - _actionFlow.emit(Unit) + _errorFlow.update { error.message.toString() } + _uiState.update { AuthState.Error } } ) } } - is AuthIntent.TextInput -> Unit + + is AuthIntent.TextInput -> { + if (_uiState.value == AuthState.Error) _uiState.update { AuthState.Data } + if (intent.text.matches("[a-zA-Z0-9]{4}".toRegex())) { + _isButtonEnabled.update { true } + } else _isButtonEnabled.update { false } + } } } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/theme/Theme.kt b/app/src/main/java/ru/myitschool/work/ui/theme/Theme.kt index d9cc58f..86ede1e 100644 --- a/app/src/main/java/ru/myitschool/work/ui/theme/Theme.kt +++ b/app/src/main/java/ru/myitschool/work/ui/theme/Theme.kt @@ -52,6 +52,6 @@ fun WorkTheme( MaterialTheme( colorScheme = colorScheme, typography = Typography, - content = content + content = content, ) } \ No newline at end of file