new_select_screen #9

Open
student-i-nikolaevskiy wants to merge 42 commits from Minipigi-org/NTO-2026-Android-TeamTask-Template:new_select_screen into main
Showing only changes of commit 428c2e9678 - Show all commits

View File

@ -2,22 +2,26 @@ package ru.myitschool.work.ui.screen.auth
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imeNestedScroll
import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
@ -27,7 +31,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@ -38,6 +41,7 @@ import androidx.navigation.NavController
import ru.myitschool.work.R import ru.myitschool.work.R
import ru.myitschool.work.core.TestIds import ru.myitschool.work.core.TestIds
@OptIn(ExperimentalLayoutApi::class)
@Composable @Composable
fun AuthScreen( fun AuthScreen(
viewModel: AuthViewModel = viewModel(), viewModel: AuthViewModel = viewModel(),
@ -60,7 +64,8 @@ fun AuthScreen(
.fillMaxSize() .fillMaxSize()
.padding(horizontal = 48.dp) .padding(horizontal = 48.dp)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.imePadding(), .imePadding()
.imeNestedScroll(),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center verticalArrangement = Arrangement.Center
) { ) {
@ -104,6 +109,7 @@ private fun Content(
Spacer(modifier = Modifier.size(48.dp)) Spacer(modifier = Modifier.size(48.dp))
OutlinedTextField( OutlinedTextField(
modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
value = login, value = login,
onValueChange = { onValueChange = {
login = it login = it
@ -115,6 +121,7 @@ private fun Content(
Spacer(modifier = Modifier.size(16.dp)) Spacer(modifier = Modifier.size(16.dp))
OutlinedTextField( OutlinedTextField(
modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(), modifier = Modifier.testTag(TestIds.Auth.CODE_INPUT).fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
value = password, value = password,
onValueChange = { onValueChange = {
password = it password = it
@ -123,9 +130,29 @@ private fun Content(
placeholder = { Text(stringResource(R.string.auth_placeholder_password)) }, placeholder = { Text(stringResource(R.string.auth_placeholder_password)) },
label = { Text(stringResource(R.string.auth_label_passord)) } label = { Text(stringResource(R.string.auth_label_passord)) }
) )
Spacer(modifier = Modifier.size(16.dp))
if (state.error != null) {
Card(
shape = RoundedCornerShape(20.dp),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.errorContainer,
)
) {
Text(
modifier = Modifier.testTag(TestIds.Auth.ERROR).padding(16.dp),
text = state.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onErrorContainer,
)
}
}
Spacer(modifier = Modifier.size(20.dp)) Spacer(modifier = Modifier.size(20.dp))
Button( Button(
modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth().height(64.dp), modifier = Modifier
.testTag(TestIds.Auth.SIGN_BUTTON)
.fillMaxWidth()
.height(64.dp),
onClick = { onClick = {
viewModel.onIntent(AuthIntent.Send(login, password)) viewModel.onIntent(AuthIntent.Send(login, password))
}, },
@ -136,12 +163,4 @@ private fun Content(
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
) )
} }
if (state.error != null) {
Text(
modifier = Modifier.testTag(TestIds.Auth.ERROR),
text = state.error,
style = MaterialTheme.typography.bodyMedium,
color = Color.Red,
)
}
} }