feat: Add paste functionality for seed phrase confirmation with success message
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
package com.rosetta.messenger.ui.auth
|
package com.rosetta.messenger.ui.auth
|
||||||
|
|
||||||
|
import android.content.ClipboardManager
|
||||||
|
import android.content.Context
|
||||||
import androidx.compose.animation.*
|
import androidx.compose.animation.*
|
||||||
import androidx.compose.animation.core.*
|
import androidx.compose.animation.core.*
|
||||||
import androidx.compose.foundation.*
|
import androidx.compose.foundation.*
|
||||||
@@ -16,6 +18,7 @@ import androidx.compose.ui.draw.clip
|
|||||||
import androidx.compose.ui.focus.onFocusChanged
|
import androidx.compose.ui.focus.onFocusChanged
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.SolidColor
|
import androidx.compose.ui.graphics.SolidColor
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.text.TextStyle
|
import androidx.compose.ui.text.TextStyle
|
||||||
import androidx.compose.ui.text.font.FontFamily
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
@@ -50,6 +53,7 @@ fun ConfirmSeedPhraseScreen(
|
|||||||
val backgroundColor = if (isDarkTheme) Color(0xFF1E1E1E) else Color(0xFFFFFFFF)
|
val backgroundColor = if (isDarkTheme) Color(0xFF1E1E1E) else Color(0xFFFFFFFF)
|
||||||
val textColor = if (isDarkTheme) Color.White else Color.Black
|
val textColor = if (isDarkTheme) Color.White else Color.Black
|
||||||
val secondaryTextColor = if (isDarkTheme) Color(0xFF8E8E93) else Color(0xFF666666)
|
val secondaryTextColor = if (isDarkTheme) Color(0xFF8E8E93) else Color(0xFF666666)
|
||||||
|
val context = LocalContext.current
|
||||||
|
|
||||||
// Select 4 words at fixed positions to confirm (2, 5, 9, 12)
|
// Select 4 words at fixed positions to confirm (2, 5, 9, 12)
|
||||||
val wordsToConfirm = remember {
|
val wordsToConfirm = remember {
|
||||||
@@ -59,6 +63,56 @@ fun ConfirmSeedPhraseScreen(
|
|||||||
var userInputs by remember { mutableStateOf(List(12) { "" }) }
|
var userInputs by remember { mutableStateOf(List(12) { "" }) }
|
||||||
var showError by remember { mutableStateOf(false) }
|
var showError by remember { mutableStateOf(false) }
|
||||||
var visible by remember { mutableStateOf(false) }
|
var visible by remember { mutableStateOf(false) }
|
||||||
|
var showPasteSuccess by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
// Function to handle paste from clipboard
|
||||||
|
val handlePaste: () -> Unit = {
|
||||||
|
try {
|
||||||
|
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
|
val clipData = clipboard.primaryClip
|
||||||
|
if (clipData != null && clipData.itemCount > 0) {
|
||||||
|
val pastedText = clipData.getItemAt(0).text?.toString() ?: ""
|
||||||
|
|
||||||
|
// Split by spaces, commas, or newlines and filter empty strings
|
||||||
|
val pastedWords = pastedText
|
||||||
|
.split(Regex("\\s+|,|\\n"))
|
||||||
|
.map { it.trim().lowercase() }
|
||||||
|
.filter { it.isNotEmpty() }
|
||||||
|
|
||||||
|
if (pastedWords.size >= 12) {
|
||||||
|
// Fill all 12 words
|
||||||
|
userInputs = pastedWords.take(12)
|
||||||
|
showPasteSuccess = true
|
||||||
|
showError = false
|
||||||
|
} else if (pastedWords.isNotEmpty()) {
|
||||||
|
// Fill only the required input fields with available words
|
||||||
|
val newInputs = userInputs.toMutableList()
|
||||||
|
var pasteIndex = 0
|
||||||
|
|
||||||
|
wordsToConfirm.forEach { (index, _) ->
|
||||||
|
if (pasteIndex < pastedWords.size) {
|
||||||
|
newInputs[index] = pastedWords[pasteIndex]
|
||||||
|
pasteIndex++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
userInputs = newInputs
|
||||||
|
showPasteSuccess = pasteIndex > 0
|
||||||
|
showError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide success message after delay
|
||||||
|
LaunchedEffect(showPasteSuccess) {
|
||||||
|
if (showPasteSuccess) {
|
||||||
|
kotlinx.coroutines.delay(2000)
|
||||||
|
showPasteSuccess = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
visible = true
|
visible = true
|
||||||
@@ -86,11 +140,30 @@ fun ConfirmSeedPhraseScreen(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(4.dp),
|
.padding(4.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween
|
||||||
) {
|
) {
|
||||||
IconButton(onClick = onBack) {
|
IconButton(onClick = onBack) {
|
||||||
Icon(Icons.Default.ArrowBack, "Back", tint = textColor)
|
Icon(Icons.Default.ArrowBack, "Back", tint = textColor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Paste button
|
||||||
|
OutlinedButton(
|
||||||
|
onClick = handlePaste,
|
||||||
|
modifier = Modifier.height(40.dp),
|
||||||
|
colors = ButtonDefaults.outlinedButtonColors(
|
||||||
|
contentColor = PrimaryBlue
|
||||||
|
),
|
||||||
|
border = BorderStroke(1.dp, PrimaryBlue)
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.ContentPaste,
|
||||||
|
contentDescription = "Paste",
|
||||||
|
modifier = Modifier.size(18.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(6.dp))
|
||||||
|
Text("Paste", fontSize = 14.sp)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
@@ -136,6 +209,42 @@ fun ConfirmSeedPhraseScreen(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Paste success message
|
||||||
|
AnimatedVisibility(
|
||||||
|
visible = showPasteSuccess,
|
||||||
|
enter = fadeIn(tween(300)) + scaleIn(initialScale = 0.9f),
|
||||||
|
exit = fadeOut(tween(300))
|
||||||
|
) {
|
||||||
|
Column {
|
||||||
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
Card(
|
||||||
|
colors = CardDefaults.cardColors(
|
||||||
|
containerColor = Color(0xFF4CAF50).copy(alpha = 0.15f)
|
||||||
|
),
|
||||||
|
shape = RoundedCornerShape(8.dp)
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.padding(12.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.CheckCircle,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = Color(0xFF4CAF50),
|
||||||
|
modifier = Modifier.size(20.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(8.dp))
|
||||||
|
Text(
|
||||||
|
text = "Words pasted successfully!",
|
||||||
|
fontSize = 14.sp,
|
||||||
|
color = Color(0xFF4CAF50),
|
||||||
|
fontWeight = FontWeight.Medium
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(32.dp))
|
Spacer(modifier = Modifier.height(32.dp))
|
||||||
|
|
||||||
// Two column layout like SeedPhraseScreen
|
// Two column layout like SeedPhraseScreen
|
||||||
|
|||||||
Reference in New Issue
Block a user