107 lines
3.8 KiB
Kotlin
107 lines
3.8 KiB
Kotlin
package auth.presentation
|
|
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.material3.*
|
|
import androidx.compose.runtime.*
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.text.input.PasswordVisualTransformation
|
|
import androidx.compose.ui.unit.dp
|
|
import ru.knot.messager.R
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
fun RegisterScreen(
|
|
viewModel: AuthViewModel,
|
|
onNavigateToLogin: () -> Unit,
|
|
onRegisterSuccess: () -> Unit
|
|
) {
|
|
val state by viewModel.state.collectAsState()
|
|
var userName by remember { mutableStateOf("") }
|
|
var password by remember { mutableStateOf("") }
|
|
var confirmPassword by remember { mutableStateOf("") }
|
|
var errorMessage by remember { mutableStateOf<String?>(null) }
|
|
|
|
val passwordsNotMatchMsg = stringResource(R.string.passwords_not_match)
|
|
|
|
LaunchedEffect(state.isAuthenticated) {
|
|
if (state.isAuthenticated) {
|
|
onRegisterSuccess()
|
|
}
|
|
}
|
|
|
|
Scaffold(
|
|
topBar = {
|
|
TopAppBar(title = { Text(stringResource(R.string.register)) })
|
|
}
|
|
) { paddingValues ->
|
|
Column(
|
|
modifier = Modifier
|
|
.fillMaxSize()
|
|
.padding(paddingValues)
|
|
.padding(16.dp),
|
|
horizontalAlignment = Alignment.CenterHorizontally,
|
|
verticalArrangement = Arrangement.Center
|
|
) {
|
|
OutlinedTextField(
|
|
value = userName,
|
|
onValueChange = { userName = it },
|
|
label = { Text(stringResource(R.string.username)) },
|
|
modifier = Modifier.fillMaxWidth(),
|
|
singleLine = true
|
|
)
|
|
Spacer(modifier = Modifier.height(8.dp))
|
|
OutlinedTextField(
|
|
value = password,
|
|
onValueChange = { password = it },
|
|
label = { Text(stringResource(R.string.password)) },
|
|
modifier = Modifier.fillMaxWidth(),
|
|
visualTransformation = PasswordVisualTransformation(),
|
|
singleLine = true
|
|
)
|
|
Spacer(modifier = Modifier.height(8.dp))
|
|
OutlinedTextField(
|
|
value = confirmPassword,
|
|
onValueChange = { confirmPassword = it },
|
|
label = { Text(stringResource(R.string.confirm_password)) },
|
|
modifier = Modifier.fillMaxWidth(),
|
|
visualTransformation = PasswordVisualTransformation(),
|
|
singleLine = true
|
|
)
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
|
|
if (state.isLoading) {
|
|
CircularProgressIndicator()
|
|
} else {
|
|
Button(
|
|
onClick = {
|
|
if (password == confirmPassword) {
|
|
errorMessage = null
|
|
viewModel.register(userName, password)
|
|
} else {
|
|
errorMessage = passwordsNotMatchMsg
|
|
}
|
|
},
|
|
modifier = Modifier.fillMaxWidth(),
|
|
enabled = userName.isNotBlank() && password.isNotBlank() && confirmPassword.isNotBlank()
|
|
) {
|
|
Text(stringResource(R.string.register))
|
|
}
|
|
TextButton(onClick = onNavigateToLogin) {
|
|
Text(stringResource(R.string.already_have_account))
|
|
}
|
|
}
|
|
|
|
val displayError = state.error ?: errorMessage
|
|
if (displayError != null) {
|
|
Text(
|
|
text = displayError,
|
|
color = MaterialTheme.colorScheme.error,
|
|
modifier = Modifier.padding(top = 8.dp)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|