package com.example.loginpage
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Email
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
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.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
AppNavigation()
}
}
}
}
sealed class Screen(val route: String) {
object Login : Screen("login")
object Register : Screen("register")
}
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Screen.Login.route) {
composable(Screen.Login.route) {
LoginPage(navController = navController)
}
composable(Screen.Register.route) {
RegisterPage(navController = navController)
}
}
}
@Composable
fun LoginPage(navController: NavController) {
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
var isPasswordVisible by remember { mutableStateOf(false) }
Box(
modifier = Modifier
.fillMaxSize()
.background(
Brush.verticalGradient(
colors = listOf(
Color(0xFF6A11CB),
Color(0xFF2575FC)
)
)
)
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 32.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Selamat Datang",
fontSize = 32.sp,
fontWeight = FontWeight.Bold,
color = Color.White
)
Text(
text = "Masuk untuk melanjutkan",
fontSize = 18.sp,
color = Color.White.copy(alpha = 0.8f),
modifier = Modifier.padding(top = 8.dp)
)
Spacer(modifier = Modifier.height(48.dp))
OutlinedTextField(
value = email,
onValueChange = { email = it },
label = { Text("Email") },
leadingIcon = {
Icon(
imageVector = Icons.Default.Email,
contentDescription = "Ikon Email",
tint = Color.White
)
},
modifier = Modifier.fillMaxWidth(),
colors = textFieldColors(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email),
singleLine = true
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
leadingIcon = {
Icon(
imageVector = Icons.Default.Lock,
contentDescription = "Ikon Password",
tint = Color.White
)
},
trailingIcon = {
val image = if (isPasswordVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff
IconButton(onClick = { isPasswordVisible = !isPasswordVisible }) {
Icon(imageVector = image, contentDescription = null, tint = Color.White)
}
},
visualTransformation = if (isPasswordVisible) VisualTransformation.None else PasswordVisualTransformation(),
modifier = Modifier.fillMaxWidth(),
colors = textFieldColors(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
singleLine = true
)
TextButton(
onClick = { /* TODO: Logika lupa password */ },
modifier = Modifier.align(Alignment.End)
) {
Text("Lupa Password?", color = Color.White.copy(alpha = 0.8f))
}
Spacer(modifier = Modifier.height(24.dp))
Button(
onClick = { /* TODO: Logika login */ },
modifier = Modifier
.fillMaxWidth()
.height(50.dp),
shape = RoundedCornerShape(12.dp),
colors = ButtonDefaults.buttonColors(containerColor = Color.White),
elevation = ButtonDefaults.buttonElevation(defaultElevation = 8.dp)
) {
Text("Login", color = Color(0xFF2575FC), fontWeight = FontWeight.Bold, fontSize = 18.sp)
}
Spacer(modifier = Modifier.height(32.dp))
Row(
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Text("Belum punya akun?", color = Color.White.copy(alpha = 0.8f))
TextButton(onClick = { navController.navigate(Screen.Register.route) }) {
Text("Daftar Sekarang", color = Color.White, fontWeight = FontWeight.Bold)
}
}
}
}
}
@Composable
fun RegisterPage(navController: NavController) {
var namaLengkap by remember { mutableStateOf("") }
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
var isPasswordVisible by remember { mutableStateOf(false) }
Box(
modifier = Modifier
.fillMaxSize()
.background(
Brush.verticalGradient(
colors = listOf(
Color(0xFF2575FC),
Color(0xFF6A11CB)
)
)
)
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 32.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Buat Akun",
fontSize = 32.sp,
fontWeight = FontWeight.Bold,
color = Color.White
)
Text(
text = "Mulai perjalananmu bersama kami",
fontSize = 18.sp,
color = Color.White.copy(alpha = 0.8f),
modifier = Modifier.padding(top = 8.dp)
)
Spacer(modifier = Modifier.height(48.dp))
OutlinedTextField(
value = namaLengkap,
onValueChange = { namaLengkap = it },
label = { Text("Nama Lengkap") },
leadingIcon = {
Icon(
imageVector = Icons.Default.Person,
contentDescription = "Ikon Nama",
tint = Color.White
)
},
modifier = Modifier.fillMaxWidth(),
colors = textFieldColors(),
singleLine = true
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = email,
onValueChange = { email = it },
label = { Text("Email") },
leadingIcon = {
Icon(
imageVector = Icons.Default.Email,
contentDescription = "Ikon Email",
tint = Color.White
)
},
modifier = Modifier.fillMaxWidth(),
colors = textFieldColors(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email),
singleLine = true
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
leadingIcon = {
Icon(
imageVector = Icons.Default.Lock,
contentDescription = "Ikon Password",
tint = Color.White
)
},
trailingIcon = {
val image = if (isPasswordVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff
IconButton(onClick = { isPasswordVisible = !isPasswordVisible }) {
Icon(imageVector = image, contentDescription = null, tint = Color.White)
}
},
visualTransformation = if (isPasswordVisible) VisualTransformation.None else PasswordVisualTransformation(),
modifier = Modifier.fillMaxWidth(),
colors = textFieldColors(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
singleLine = true
)
Spacer(modifier = Modifier.height(32.dp))
Button(
onClick = { /* TODO: Logika registrasi */ },
modifier = Modifier
.fillMaxWidth()
.height(50.dp),
shape = RoundedCornerShape(12.dp),
colors = ButtonDefaults.buttonColors(containerColor = Color.White),
elevation = ButtonDefaults.buttonElevation(defaultElevation = 8.dp)
) {
Text("Daftar", color = Color(0xFF6A11CB), fontWeight = FontWeight.Bold, fontSize = 18.sp)
}
Spacer(modifier = Modifier.height(32.dp))
Row(
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Text("Sudah punya akun?", color = Color.White.copy(alpha = 0.8f))
TextButton(onClick = { navController.navigate(Screen.Login.route) {
// Membersihkan backstack agar tidak kembali ke halaman register
popUpTo(Screen.Login.route) { inclusive = true }
} }) {
Text("Masuk", color = Color.White, fontWeight = FontWeight.Bold)
}
}
}
}
}
@Composable
fun textFieldColors(): TextFieldColors {
return OutlinedTextFieldDefaults.colors(
focusedBorderColor = Color.White,
unfocusedBorderColor = Color.White.copy(alpha = 0.5f),
focusedLabelColor = Color.White,
unfocusedLabelColor = Color.White.copy(alpha = 0.8f),
cursorColor = Color.White,
focusedTextColor = Color.White,
unfocusedTextColor = Color.White,
)
}
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun LoginPagePreview() {
MaterialTheme {
LoginPage(navController = rememberNavController())
}
}
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun RegisterPagePreview() {
MaterialTheme {
RegisterPage(navController = rememberNavController())
}
}
Komentar
Posting Komentar