From 55ff6e6cd1f72417b7dec70da667e60909461020 Mon Sep 17 00:00:00 2001 From: Sweetbread Date: Wed, 23 Apr 2025 16:38:29 +0300 Subject: [PATCH] impr: LoginActivity.kt - Style changed - Added loading indicator - Added login/password validation --- .../sweetbread/unn/ui/layout/LoginActivity.kt | 113 ++++++++++-------- 1 file changed, 64 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/ru/sweetbread/unn/ui/layout/LoginActivity.kt b/app/src/main/java/ru/sweetbread/unn/ui/layout/LoginActivity.kt index b5bbb41..cd2065c 100644 --- a/app/src/main/java/ru/sweetbread/unn/ui/layout/LoginActivity.kt +++ b/app/src/main/java/ru/sweetbread/unn/ui/layout/LoginActivity.kt @@ -1,3 +1,8 @@ +/* + * Created by sweetbread + * Copyright (c) 2025. All rights reserved. + */ + package ru.sweetbread.unn.ui.layout import android.os.Bundle @@ -7,19 +12,20 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -74,21 +80,26 @@ class LoginActivity : ComponentActivity() { SnackbarHost(hostState = snackbarHostState) } ) { innerPadding -> - LoginPanel(Modifier.padding(innerPadding), { login, password -> - LoginData.login = login - LoginData.password = password - start() - finish() - }, { - scope.launch { - - snackbarHostState - .showSnackbar( - message = "Error", - duration = SnackbarDuration.Short - ) - } - }) + Box(Modifier.padding(innerPadding).fillMaxSize(), Alignment.Center) { + LoginPanel( + Modifier.imePadding(), + { login, password -> + LoginData.login = login + LoginData.password = password + start() + finish() + }, + { + scope.launch { + snackbarHostState + .showSnackbar( + message = "Error", + duration = SnackbarDuration.Short + ) + } + } + ) + } } } } @@ -107,48 +118,52 @@ fun LoginPanel( var loading by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() - Box(Modifier.fillMaxSize(), Alignment.BottomCenter) { - Column( - modifier - .padding(32.dp, 0.dp) - .clip(RoundedCornerShape(10.dp, 10.dp)) - .background(MaterialTheme.colorScheme.primaryContainer) - .padding(16.dp) - ) { - TextField( - modifier = Modifier.padding(8.dp), - value = login, - onValueChange = { login = it }, - singleLine = true, - label = { Text(stringResource(R.string.prompt_login)) } - ) + Column( + modifier + .padding(32.dp, 0.dp) + .clip(RoundedCornerShape(10.dp)) + .background(MaterialTheme.colorScheme.surfaceContainer) + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + OutlinedTextField( + modifier = Modifier.padding(8.dp), + value = login, + onValueChange = { login = it }, + singleLine = true, + label = { Text(stringResource(R.string.prompt_login))}, + placeholder = { Text("s23380101") } + ) - TextField( - modifier = Modifier.padding(8.dp), - value = password, - onValueChange = { password = it }, - singleLine = true, - label = { Text(stringResource(R.string.prompt_password)) }, - visualTransformation = PasswordVisualTransformation(), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) - ) + OutlinedTextField( + modifier = Modifier.padding(8.dp), + value = password, + onValueChange = { password = it }, + singleLine = true, + label = { Text(stringResource(R.string.prompt_password)) }, + visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) + ) - Button(modifier = Modifier - .fillMaxWidth() - .padding(8.dp), onClick = { + Button( + modifier = Modifier.padding(8.dp), + enabled = login.trim().isNotEmpty() and password.trim().isNotEmpty() and !loading, + onClick = { loading = true scope.launch { - if (auth(login, password)) { + if (auth(login, password)) ok(login, password) - } else { + else error() - } loading = false } - }) { - Text(stringResource(R.string.sign_in)) } + ) { + if (loading) + CircularProgressIndicator() + else + Text(stringResource(R.string.sign_in)) } } }