login screen

This commit is contained in:
sathwikcs
2024-10-10 18:27:35 +05:30
parent 2372dd9589
commit a7aff3c680

View File

@@ -1,2 +1,139 @@
package `in`.sminnovations.attendanceapp.screens.login.ui
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.sp
import `in`.sminnovations.attendanceapp.R
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@Composable
fun LoginScreen(onLoginSuccess: () -> Unit) {
val coroutineScope = rememberCoroutineScope()
var userId by remember { mutableStateOf(TextFieldValue("")) }
var password by remember { mutableStateOf(TextFieldValue("")) }
var showLoginButton by remember { mutableStateOf(false) }
var isButtonLoading by remember { mutableStateOf(false) }
var passwordVisible by remember { mutableStateOf(false) }
// Animated visibility for screen entrance
LaunchedEffect(Unit) {
delay(300) // Small delay before showing content
showLoginButton = true
}
AnimatedVisibility(
visible = showLoginButton,
enter = fadeIn(),
exit = fadeOut()
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(26.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(text = "Attendance App ", style = MaterialTheme.typography.headlineLarge)
Spacer(modifier = Modifier.height(50.dp))
Image(painter = painterResource(id = R.drawable.smi_logo), contentDescription = "Image", alignment = Alignment.TopCenter)
Spacer(modifier = Modifier.height(100.dp))
Text(text = "Credentials", style = MaterialTheme.typography.headlineMedium)
Spacer(modifier = Modifier.height(20.dp))
OutlinedTextField(
value = userId,
onValueChange = { userId = it },
textStyle = MaterialTheme.typography.bodyLarge,
label = { Text("User ID") },
modifier = Modifier.fillMaxWidth(),
keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Next)
)
Spacer(modifier = Modifier.height(30.dp))
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
modifier = Modifier.fillMaxWidth(),
textStyle = MaterialTheme.typography.bodyLarge,
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done),
trailingIcon = {
val image = if (passwordVisible) painterResource(id = R.drawable.baseline_visibility_24) else painterResource(
id = R.drawable.baseline_visibility_off_24
)
IconButton(onClick = { passwordVisible = !passwordVisible }) {
Icon(painter = image, contentDescription = "Toggle Password Visibility")
}
}
)
Spacer(modifier = Modifier.height(60.dp))
Button(
onClick = {
isButtonLoading = true
coroutineScope.launch {
delay(1000) // Simulate network call
onLoginSuccess()
isButtonLoading = false
}
},
modifier = Modifier
.fillMaxWidth()
.height(50.dp),
enabled = !isButtonLoading
) {
if (isButtonLoading) {
CircularProgressIndicator(
color = Color.White,
modifier = Modifier.size(24.dp),
strokeWidth = 2.dp
)
} else {
Text(
text = "Login",
fontSize = 20.sp
)
}
}
}
}
}
@Preview
@Composable
fun lofpre(){
LoginScreen {
}
}