Compare commits

..

7 Commits

Author SHA1 Message Date
00162984a9 merge upstream 2025-11-29 15:03:42 +00:00
bc7e14ab06 AuthRepository.kt fix
Some checks failed
Android Test / validate-and-test (pull_request) Has been cancelled
2025-11-29 16:27:55 +03:00
b98c7f410f add auth interface logical 2025-11-29 13:03:50 +00:00
67e26d142a merge upstream 2025-11-29 12:52:36 +00:00
«Владимир
286b752974 add auth interface logical 2025-11-29 15:51:41 +03:00
cbc91ee472 Auth Case and Repo done 2025-11-29 15:37:18 +03:00
«Владимир
d92ac5a10c add space 2025-11-29 14:40:25 +03:00
6 changed files with 68 additions and 16 deletions

View File

@@ -8,9 +8,7 @@ object AuthRepository {
suspend fun checkAndSave(text: String): Result<Boolean> {
return NetworkDataSource.checkAuth(text).onSuccess { success ->
if (success) {
codeCache = text
}
if (success) codeCache = text
}
}
}

View File

@@ -8,6 +8,10 @@ class CheckAndSaveAuthCodeUseCase(
suspend operator fun invoke(
text: String
): Result<Unit> {
val isValid = text.length == 4 && text.all {it.isLetterOrDigit()}
if (!isValid) return Result.failure(IllegalArgumentException("Неверный формат кода!"))
return repository.checkAndSave(text).mapCatching { success ->
if (!success) error("Code is incorrect")
}

View File

@@ -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,7 +74,12 @@ 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(),
value = inputText,
@@ -82,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))
}
}

View File

@@ -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()
}

View File

@@ -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>(AuthState.Data)
private val _uiState = MutableStateFlow<AuthState>(AuthState.Data())
val uiState: StateFlow<AuthState> = _uiState.asStateFlow()
private val _actionFlow: MutableSharedFlow<Unit> = 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)
}
}
}
}
}

View File

@@ -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<BookingItem>,
) : MainState
data class Error(
val message: String,
) : MainState
}
data class BookingItem(
val date: String,
val place: String,
)