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 4e1a106..fc25dc0 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( @@ -83,16 +87,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