feat: Enhance logging and debugging capabilities across Protocol and UI components
This commit is contained in:
@@ -63,8 +63,8 @@ fun SetPasswordScreen(
|
||||
}
|
||||
|
||||
val passwordsMatch = password == confirmPassword && password.isNotEmpty()
|
||||
val passwordStrong = password.length >= 6
|
||||
val canContinue = passwordsMatch && passwordStrong && !isCreating
|
||||
val isPasswordWeak = password.isNotEmpty() && password.length < 6
|
||||
val canContinue = passwordsMatch && !isCreating
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
@@ -223,32 +223,60 @@ fun SetPasswordScreen(
|
||||
animationSpec = tween(400, delayMillis = 350)
|
||||
)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
val strength = when {
|
||||
password.length < 6 -> "Weak"
|
||||
password.length < 10 -> "Medium"
|
||||
else -> "Strong"
|
||||
Column(modifier = Modifier.fillMaxWidth()) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
val strength = when {
|
||||
password.length < 6 -> "Weak"
|
||||
password.length < 10 -> "Medium"
|
||||
else -> "Strong"
|
||||
}
|
||||
val strengthColor = when {
|
||||
password.length < 6 -> Color(0xFFE53935)
|
||||
password.length < 10 -> Color(0xFFFFA726)
|
||||
else -> Color(0xFF4CAF50)
|
||||
}
|
||||
Icon(
|
||||
imageVector = Icons.Default.Shield,
|
||||
contentDescription = null,
|
||||
tint = strengthColor,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(4.dp))
|
||||
Text(
|
||||
text = "Password strength: $strength",
|
||||
fontSize = 12.sp,
|
||||
color = strengthColor
|
||||
)
|
||||
}
|
||||
val strengthColor = when {
|
||||
password.length < 6 -> Color(0xFFE53935)
|
||||
password.length < 10 -> Color(0xFFFFA726)
|
||||
else -> Color(0xFF4CAF50)
|
||||
// Warning for weak passwords
|
||||
if (isPasswordWeak) {
|
||||
Spacer(modifier = Modifier.height(4.dp))
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.clip(RoundedCornerShape(8.dp))
|
||||
.background(Color(0xFFE53935).copy(alpha = 0.1f))
|
||||
.padding(8.dp),
|
||||
verticalAlignment = Alignment.Top
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Warning,
|
||||
contentDescription = null,
|
||||
tint = Color(0xFFE53935),
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(
|
||||
text = "Your password is too weak. Consider using at least 6 characters for better security.",
|
||||
fontSize = 11.sp,
|
||||
color = Color(0xFFE53935),
|
||||
lineHeight = 14.sp
|
||||
)
|
||||
}
|
||||
}
|
||||
Icon(
|
||||
imageVector = Icons.Default.Shield,
|
||||
contentDescription = null,
|
||||
tint = strengthColor,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(4.dp))
|
||||
Text(
|
||||
text = "Password strength: $strength",
|
||||
fontSize = 12.sp,
|
||||
color = strengthColor
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -394,10 +422,6 @@ fun SetPasswordScreen(
|
||||
) {
|
||||
Button(
|
||||
onClick = {
|
||||
if (!passwordStrong) {
|
||||
error = "Password must be at least 6 characters"
|
||||
return@Button
|
||||
}
|
||||
if (!passwordsMatch) {
|
||||
error = "Passwords don't match"
|
||||
return@Button
|
||||
|
||||
@@ -117,8 +117,8 @@ fun WelcomeScreen(
|
||||
)
|
||||
) {
|
||||
Text(
|
||||
text = "Rosetta uses cryptographic keys\nto secure your messages.\n\nNo account registration,\nno phone number required.",
|
||||
fontSize = 15.sp,
|
||||
text = "Secure messaging with\ncryptographic keys",
|
||||
fontSize = 16.sp,
|
||||
color = secondaryTextColor,
|
||||
textAlign = TextAlign.Center,
|
||||
lineHeight = 24.sp,
|
||||
@@ -126,14 +126,46 @@ fun WelcomeScreen(
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.weight(0.3f))
|
||||
Spacer(modifier = Modifier.height(24.dp))
|
||||
|
||||
// Features list with icons - placed above buttons
|
||||
AnimatedVisibility(
|
||||
visible = visible,
|
||||
enter = fadeIn(tween(600, delayMillis = 400))
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
horizontalArrangement = Arrangement.SpaceEvenly
|
||||
) {
|
||||
CompactFeatureItem(
|
||||
icon = Icons.Default.Security,
|
||||
text = "Encrypted",
|
||||
isDarkTheme = isDarkTheme,
|
||||
textColor = textColor
|
||||
)
|
||||
CompactFeatureItem(
|
||||
icon = Icons.Default.NoAccounts,
|
||||
text = "No Phone",
|
||||
isDarkTheme = isDarkTheme,
|
||||
textColor = textColor
|
||||
)
|
||||
CompactFeatureItem(
|
||||
icon = Icons.Default.Key,
|
||||
text = "Your Keys",
|
||||
isDarkTheme = isDarkTheme,
|
||||
textColor = textColor
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(32.dp))
|
||||
|
||||
// Create Seed Button
|
||||
AnimatedVisibility(
|
||||
visible = visible,
|
||||
enter = fadeIn(tween(600, delayMillis = 400)) + slideInVertically(
|
||||
enter = fadeIn(tween(600, delayMillis = 500)) + slideInVertically(
|
||||
initialOffsetY = { 100 },
|
||||
animationSpec = tween(600, delayMillis = 400)
|
||||
animationSpec = tween(600, delayMillis = 500)
|
||||
)
|
||||
) {
|
||||
Button(
|
||||
@@ -145,14 +177,18 @@ fun WelcomeScreen(
|
||||
containerColor = PrimaryBlue,
|
||||
contentColor = Color.White
|
||||
),
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
shape = RoundedCornerShape(16.dp),
|
||||
elevation = ButtonDefaults.buttonElevation(
|
||||
defaultElevation = 0.dp,
|
||||
pressedElevation = 0.dp
|
||||
)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Key,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(20.dp)
|
||||
modifier = Modifier.size(22.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Spacer(modifier = Modifier.width(12.dp))
|
||||
Text(
|
||||
text = "Generate New Seed Phrase",
|
||||
fontSize = 16.sp,
|
||||
@@ -161,70 +197,35 @@ fun WelcomeScreen(
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
|
||||
// Import Seed Button
|
||||
AnimatedVisibility(
|
||||
visible = visible,
|
||||
enter = fadeIn(tween(600, delayMillis = 500)) + slideInVertically(
|
||||
enter = fadeIn(tween(600, delayMillis = 600)) + slideInVertically(
|
||||
initialOffsetY = { 100 },
|
||||
animationSpec = tween(600, delayMillis = 500)
|
||||
animationSpec = tween(600, delayMillis = 600)
|
||||
)
|
||||
) {
|
||||
OutlinedButton(
|
||||
TextButton(
|
||||
onClick = onImportSeed,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(56.dp),
|
||||
colors = ButtonDefaults.outlinedButtonColors(
|
||||
contentColor = PrimaryBlue
|
||||
),
|
||||
border = ButtonDefaults.outlinedButtonBorder.copy(
|
||||
brush = Brush.horizontalGradient(listOf(PrimaryBlue, PrimaryBlue))
|
||||
),
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
shape = RoundedCornerShape(16.dp)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Download,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(20.dp)
|
||||
modifier = Modifier.size(20.dp),
|
||||
tint = PrimaryBlue
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(
|
||||
text = "I Already Have a Seed Phrase",
|
||||
fontSize = 16.sp,
|
||||
fontWeight = FontWeight.SemiBold
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(24.dp))
|
||||
|
||||
// Info text
|
||||
AnimatedVisibility(
|
||||
visible = visible,
|
||||
enter = fadeIn(tween(600, delayMillis = 600))
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.clip(RoundedCornerShape(12.dp))
|
||||
.background(if (isDarkTheme) AuthSurface else AuthSurfaceLight)
|
||||
.padding(16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Info,
|
||||
contentDescription = null,
|
||||
tint = PrimaryBlue,
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(12.dp))
|
||||
Text(
|
||||
text = "Your seed phrase is the master key to your account. Keep it safe and never share it.",
|
||||
fontSize = 14.sp,
|
||||
color = secondaryTextColor,
|
||||
lineHeight = 18.sp
|
||||
fontSize = 15.sp,
|
||||
fontWeight = FontWeight.Medium,
|
||||
color = PrimaryBlue
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -233,3 +234,84 @@ fun WelcomeScreen(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun CompactFeatureItem(
|
||||
icon: androidx.compose.ui.graphics.vector.ImageVector,
|
||||
text: String,
|
||||
isDarkTheme: Boolean,
|
||||
textColor: Color
|
||||
) {
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.size(48.dp)
|
||||
.clip(CircleShape)
|
||||
.background(PrimaryBlue.copy(alpha = 0.12f)),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Icon(
|
||||
imageVector = icon,
|
||||
contentDescription = null,
|
||||
tint = PrimaryBlue,
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
}
|
||||
Text(
|
||||
text = text,
|
||||
fontSize = 13.sp,
|
||||
color = textColor.copy(alpha = 0.8f),
|
||||
fontWeight = FontWeight.Medium,
|
||||
textAlign = TextAlign.Center
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun FeatureItem(
|
||||
icon: androidx.compose.ui.graphics.vector.ImageVector,
|
||||
text: String,
|
||||
isDarkTheme: Boolean,
|
||||
textColor: Color
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.size(40.dp)
|
||||
.clip(CircleShape)
|
||||
.background(PrimaryBlue.copy(alpha = 0.15f)),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Icon(
|
||||
imageVector = icon,
|
||||
contentDescription = null,
|
||||
tint = PrimaryBlue,
|
||||
modifier = Modifier.size(20.dp)
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.width(16.dp))
|
||||
Text(
|
||||
text = text,
|
||||
fontSize = 15.sp,
|
||||
color = textColor,
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.width(16.dp))
|
||||
Text(
|
||||
text = text,
|
||||
fontSize = 15.sp,
|
||||
color = textColor,
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user