From b98c7f410f7d29db2d1abf3037a65fdbffd604ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9A=D0=BE=D1=81=D0=B0=D1=80=D0=B5=D0=B2?= Date: Sat, 29 Nov 2025 13:03:50 +0000 Subject: [PATCH 1/2] add auth interface logical --- .../work/ui/screen/auth/AuthScreen.kt | 26 ++++++++++++++++--- .../work/ui/screen/auth/AuthState.kt | 8 +++--- .../work/ui/screen/auth/AuthViewModel.kt | 22 +++++++++++----- .../work/ui/screen/main/MainState.kt | 19 ++++++++++++++ 4 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/ui/screen/main/MainState.kt 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..db2982e 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 @@ -21,7 +21,6 @@ import androidx.compose.runtime.remember 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.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -32,6 +31,7 @@ import ru.myitschool.work.R import ru.myitschool.work.core.TestIds import ru.myitschool.work.ui.nav.MainScreenDestination + @Composable fun AuthScreen( viewModel: AuthViewModel = viewModel(), @@ -74,6 +74,10 @@ private fun Content( state: AuthState.Data ) { var inputText by remember { mutableStateOf("") } + + val isCodeValid = inputText.length == 4 && inputText.all { it.isLetterOrDigit() } + val isButtonEnabled = isCodeValid + Spacer(modifier = Modifier.size(16.dp)) TextField( modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), @@ -82,16 +86,30 @@ private fun Content( inputText = it viewModel.onIntent(AuthIntent.TextInput(it)) }, - label = { Text(stringResource(R.string.auth_label)) } + label = { Text(stringResource(R.string.auth_label)) }, + placeholder = { Text("Код") }, + isError = state.error != null ) + + if (state.error != null) { + Spacer(modifier = Modifier.size(8.dp)) + Text( + text = state.error, + 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(), onClick = { viewModel.onIntent(AuthIntent.Send(inputText)) }, - enabled = true + enabled = isButtonEnabled ) { Text(stringResource(R.string.auth_sign_in)) } -} \ No newline at end of file +} + 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..ff2f5f7 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 @@ -1,6 +1,8 @@ package ru.myitschool.work.ui.screen.auth -sealed interface AuthState { - object Loading: AuthState - object Data: AuthState +sealed class AuthState { + object Loading : AuthState() + data class Data( + val error: String? = null + ) : 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..b00a078 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 @@ -15,7 +15,7 @@ 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() @@ -24,20 +24,30 @@ class AuthViewModel : ViewModel() { fun onIntent(intent: AuthIntent) { when (intent) { is AuthIntent.Send -> { + val code = intent.text viewModelScope.launch(Dispatchers.Default) { - _uiState.update { AuthState.Loading } - checkAndSaveAuthCodeUseCase.invoke("9999").fold( + _uiState.value = AuthState.Loading + checkAndSaveAuthCodeUseCase.invoke(code).fold( onSuccess = { _actionFlow.emit(Unit) }, onFailure = { error -> - error.printStackTrace() - _actionFlow.emit(Unit) + + val errorMsg = when { + error.message?.contains("401") == true -> "Неверный код" + else -> "Ошибка подключения" + } + _uiState.value = AuthState.Data(error = errorMsg) } ) } } - is AuthIntent.TextInput -> Unit + + is AuthIntent.TextInput -> { + if (_uiState.value is AuthState.Data) { + _uiState.value = AuthState.Data(error = null) + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/main/MainState.kt b/app/src/main/java/ru/myitschool/work/ui/screen/main/MainState.kt new file mode 100644 index 0000000..5af9da9 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/screen/main/MainState.kt @@ -0,0 +1,19 @@ +package ru.myitschool.work.ui.screen.main + +sealed interface MainState { + object Loading : MainState + data class Success( + val name: String, + val photoUrl: String, + val bookings: List, + ) : MainState + + data class Error( + val message: String, + ) : MainState +} + +data class BookingItem( + val date: String, + val place: String, +) \ No newline at end of file From bc7e14ab067974b0115af672af98c06c88520c56 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 29 Nov 2025 16:27:55 +0300 Subject: [PATCH 2/2] AuthRepository.kt fix --- .../main/java/ru/myitschool/work/data/repo/AuthRepository.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 3eaf83f..ea71101 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 @@ -7,9 +7,8 @@ object AuthRepository { private var codeCache: String? = null suspend fun checkAndSave(text: String): Result { - return NetworkDataSource.checkAuth(text).mapCatching { success -> + return NetworkDataSource.checkAuth(text).onSuccess { success -> if (success) codeCache = text - success } } } \ No newline at end of file