From 02f8575f82659b93318294a3fd710fbd790f94e5 Mon Sep 17 00:00:00 2001 From: Oscar Mira Date: Wed, 25 Oct 2023 17:41:34 +0200 Subject: [PATCH] demo: add offline wallet confirmation dialog --- .../monero/demo/ui/AddWalletViewModel.kt | 2 +- .../molly/monero/demo/ui/AddWalletWizard.kt | 102 ++++++++++-------- .../im/molly/monero/demo/ui/RemoteNodeList.kt | 2 +- .../molly/monero/demo/ui/WalletBalanceView.kt | 1 - 4 files changed, 61 insertions(+), 46 deletions(-) diff --git a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletViewModel.kt b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletViewModel.kt index a833a84..f6b60bd 100644 --- a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletViewModel.kt +++ b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletViewModel.kt @@ -49,7 +49,7 @@ class AddWalletViewModel( .stateIn( scope = viewModelScope, started = WhileSubscribed(5000), - initialValue = listOf(RemoteNode.EMPTY), + initialValue = emptyList(), ) val selectedRemoteNodes = mutableStateMapOf() diff --git a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt index 55643c5..fb2344d 100644 --- a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt +++ b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt @@ -44,21 +44,16 @@ private fun FirstStepScreen( onRestoreClick: () -> Unit, modifier: Modifier = Modifier, ) { - Scaffold( - topBar = { - Toolbar( - title = "Add wallet", - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon( - imageVector = AppIcons.ArrowBack, - contentDescription = "Back", - ) - } - } - ) - } - ) { padding -> + Scaffold(topBar = { + Toolbar(title = "Add wallet", navigationIcon = { + IconButton(onClick = onBackClick) { + Icon( + imageVector = AppIcons.ArrowBack, + contentDescription = "Back", + ) + } + }) + }) { padding -> Column( modifier = modifier .fillMaxSize() @@ -144,21 +139,20 @@ private fun SecondStepScreen( remoteNodes: List, selectedRemoteNodeIds: MutableMap = mutableMapOf(), ) { - Scaffold( - topBar = { - Toolbar( - title = if (showRestoreOptions) "Restore wallet" else "New wallet", - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon( - imageVector = AppIcons.ArrowBack, - contentDescription = "Back", - ) - } + var showOffLineConfirmationDialog by remember { mutableStateOf(false) } + + Scaffold(topBar = { + Toolbar( + title = if (showRestoreOptions) "Restore wallet" else "New wallet", + navigationIcon = { + IconButton(onClick = onBackClick) { + Icon( + imageVector = AppIcons.ArrowBack, + contentDescription = "Back", + ) } - ) - } - ) { padding -> + }) + }) { padding -> Column( modifier = modifier .padding(padding) @@ -188,21 +182,18 @@ private fun SecondStepScreen( Text( text = "Remote node selection", style = MaterialTheme.typography.titleMedium, - modifier = Modifier - .padding(16.dp), + modifier = Modifier.padding(16.dp), ) MultiSelectRemoteNodeList( remoteNodes = remoteNodes, selectedIds = selectedRemoteNodeIds, - modifier = Modifier - .padding(start = 16.dp), + modifier = Modifier.padding(start = 16.dp), ) if (showRestoreOptions) { Text( text = "Deterministic wallet recovery", style = MaterialTheme.typography.titleMedium, - modifier = Modifier - .padding(16.dp), + modifier = Modifier.padding(16.dp), ) OutlinedTextField( value = secretSpendKeyHex, @@ -217,8 +208,7 @@ private fun SecondStepScreen( Text( text = "Synchronization", style = MaterialTheme.typography.titleMedium, - modifier = Modifier - .padding(16.dp), + modifier = Modifier.padding(16.dp), ) OutlinedTextField( value = creationDate, @@ -246,21 +236,47 @@ private fun SecondStepScreen( } Column( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { - val validInput = !showRestoreOptions || !(secretSpendKeyHexError || creationDateError || restoreHeightError) + val validInput = + !showRestoreOptions || !(secretSpendKeyHexError || creationDateError || restoreHeightError) Button( - onClick = onCreateClick, + onClick = { + if (selectedRemoteNodeIds.filterValues { checked -> checked }.isEmpty()) { + showOffLineConfirmationDialog = true + } else { + onCreateClick() + } + }, enabled = validInput, - modifier = Modifier - .padding(16.dp), + modifier = Modifier.padding(16.dp), ) { Text("Finish") } } } + + if (showOffLineConfirmationDialog) { + AlertDialog(onDismissRequest = { showOffLineConfirmationDialog = false }, title = { + Text("No remote nodes selected") + }, text = { + Text("There are no remote nodes added to your wallet settings. Are you sure you want to start an offline wallet?") + }, confirmButton = { + TextButton(onClick = { + showOffLineConfirmationDialog = false + onCreateClick() + }) { + Text("Continue") + } + }, dismissButton = { + TextButton(onClick = { + showOffLineConfirmationDialog = false + }) { + Text("Cancel") + } + }) + } } } diff --git a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/RemoteNodeList.kt b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/RemoteNodeList.kt index 5c3aa75..20b3de5 100644 --- a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/RemoteNodeList.kt +++ b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/RemoteNodeList.kt @@ -31,7 +31,7 @@ fun MultiSelectRemoteNodeList( } } else { Text( - text = "No matching remote nodes", + text = "Empty list. Start by adding new remote nodes in the settings.", style = MaterialTheme.typography.labelMedium, ) } diff --git a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/WalletBalanceView.kt b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/WalletBalanceView.kt index 4cd79b4..6b079e2 100644 --- a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/WalletBalanceView.kt +++ b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/WalletBalanceView.kt @@ -19,7 +19,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import im.molly.monero.MoneroAmount import im.molly.monero.Balance import im.molly.monero.BlockchainTime