package com.example.barokahstore.ui.screens import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Lock import androidx.compose.material.icons.filled.Person import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.barokahstore.data.DatabaseHelper import com.example.barokahstore.data.User @OptIn(ExperimentalMaterial3Api::class) @Composable fun LoginScreen( dbHelper: DatabaseHelper, onLoginSuccess: (User) -> Unit ) { var username by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } var errorMessage by remember { mutableStateOf("") } Box( modifier = Modifier .fillMaxSize() .background( Brush.verticalGradient( colors = listOf( Color(0xFF4F46E5), // Indigo 600 Color(0xFF312E81) // Indigo 900 ) ) ), contentAlignment = Alignment.Center ) { Card( modifier = Modifier .fillMaxWidth(0.85f) .padding(16.dp), shape = RoundedCornerShape(24.dp), colors = CardDefaults.cardColors( containerColor = Color.White.copy(alpha = 0.95f) ), elevation = CardDefaults.cardElevation( defaultElevation = 16.dp ) ) { Column( modifier = Modifier .padding(24.dp) .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text( text = "Toko Barokah", fontSize = 28.sp, fontWeight = FontWeight.Bold, color = Color(0xFF312E81) ) Text( text = "Aplikasi Kasir & Inventaris", fontSize = 14.sp, color = Color.Gray, modifier = Modifier.padding(bottom = 12.dp) ) if (errorMessage.isNotEmpty()) { Text( text = errorMessage, color = Color.Red, fontSize = 13.sp, fontWeight = FontWeight.Medium ) } OutlinedTextField( value = username, onValueChange = { username = it errorMessage = "" }, label = { Text("Username") }, leadingIcon = { Icon( imageVector = Icons.Default.Person, contentDescription = "Username Icon", tint = Color(0xFF4F46E5) ) }, singleLine = true, shape = RoundedCornerShape(12.dp), modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = password, onValueChange = { password = it errorMessage = "" }, label = { Text("Password") }, leadingIcon = { Icon( imageVector = Icons.Default.Lock, contentDescription = "Password Icon", tint = Color(0xFF4F46E5) ) }, visualTransformation = PasswordVisualTransformation(), singleLine = true, shape = RoundedCornerShape(12.dp), modifier = Modifier.fillMaxWidth() ) Button( onClick = { if (username.isBlank() || password.isBlank()) { errorMessage = "Username dan password tidak boleh kosong" return@Button } val user = dbHelper.login(username.trim(), password) if (user != null) { dbHelper.checkInUser(user.id, "Login Aplikasi") onLoginSuccess(user) } else { errorMessage = "Username atau password salah!" } }, shape = RoundedCornerShape(12.dp), colors = ButtonDefaults.buttonColors( containerColor = Color(0xFF4F46E5) ), modifier = Modifier .fillMaxWidth() .padding(top = 8.dp) .height(50.dp) ) { Text( text = "Masuk", fontSize = 16.sp, fontWeight = FontWeight.SemiBold, color = Color.White ) } Text( text = "Hubungi Admin jika lupa password", fontSize = 11.sp, color = Color.LightGray, modifier = Modifier.padding(top = 10.dp) ) } } } }