opent edit screen when adding new app, add edit relays dialog

This commit is contained in:
greenart7c3
2024-04-19 14:52:27 -03:00
parent cd203e0644
commit 4e4d041e74
4 changed files with 179 additions and 16 deletions
@@ -1,9 +1,12 @@
package com.greenart7c3.nostrsigner.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
@@ -11,6 +14,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.ContentPaste
@@ -20,7 +24,9 @@ import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
@@ -47,16 +53,20 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.toLowerCase
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.navigation.NavController
import com.greenart7c3.nostrsigner.LocalPreferences
import com.greenart7c3.nostrsigner.R
import com.greenart7c3.nostrsigner.database.AppDatabase
import com.greenart7c3.nostrsigner.database.ApplicationEntity
import com.greenart7c3.nostrsigner.database.ApplicationPermissionsEntity
import com.greenart7c3.nostrsigner.database.ApplicationWithPermissions
import com.greenart7c3.nostrsigner.models.Account
import com.greenart7c3.nostrsigner.models.Permission
import com.greenart7c3.nostrsigner.nostrsigner
import com.greenart7c3.nostrsigner.ui.actions.QrCodeDialog
import com.greenart7c3.nostrsigner.ui.components.CloseButton
import com.greenart7c3.nostrsigner.ui.components.PostButton
import com.greenart7c3.nostrsigner.ui.navigation.Route
import com.vitorpamplona.quartz.encoders.toHexKey
import com.vitorpamplona.quartz.encoders.toNpub
@@ -90,13 +100,148 @@ fun EditPermission(
mutableStateOf(applicationData.useSecret)
}
val secret = if (checked) "&secret=${applicationData.secret}" else ""
val bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?relay=wss://relay.nsec.app$secret"
var bunkerUri by remember {
mutableStateOf("bunker://${account.keyPair.pubKey.toHexKey()}?relay=wss://relay.nsec.app$secret")
}
var editRelaysDialog by remember {
mutableStateOf(false)
}
LaunchedEffect(Unit) {
scope.launch(Dispatchers.IO) {
permissions.addAll(database.applicationDao().getAllByKey(selectedPackage).sortedBy { "${it.type}-${it.kind}" })
applicationData = database.applicationDao().getByKey(selectedPackage)!!.application
checked = applicationData.useSecret
val relays = applicationData.relays.joinToString(separator = "&") { "relay=$it" }
val localSecret = if (checked) "&secret=${applicationData.secret}" else ""
bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?$relays$localSecret"
}
}
if (editRelaysDialog) {
val relays2 = remember {
val localRelays = mutableStateListOf<String>()
applicationData.relays.forEach {
localRelays.add(it)
}
localRelays
}
Dialog(
onDismissRequest = {
editRelaysDialog = false
},
properties = DialogProperties(usePlatformDefaultWidth = false)
) {
Surface(
modifier = Modifier
.fillMaxSize()
) {
Column(
modifier = Modifier
.background(MaterialTheme.colorScheme.background)
.fillMaxSize()
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(10.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
CloseButton {
editRelaysDialog = false
}
PostButton(
isActive = true,
onPost = {
applicationData = applicationData.copy(
relays = relays2.map { it }
)
val relays = applicationData.relays.joinToString(separator = "&") { "relay=$it" }
bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?$relays$secret"
editRelaysDialog = false
}
)
}
LazyColumn(
Modifier
.fillMaxHeight(0.9f)
.fillMaxWidth()
) {
items(relays2.size) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
relays2[it],
Modifier
.weight(0.9f)
.padding(8.dp),
fontWeight = FontWeight.Bold,
fontSize = 18.sp,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
IconButton(
onClick = {
relays2.removeAt(it)
}
) {
Icon(
Icons.Default.Delete,
stringResource(R.string.delete)
)
}
}
}
}
Row(
Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
OutlinedTextField(
modifier = Modifier
.fillMaxWidth(0.9f)
.padding(horizontal = 16.dp),
value = textFieldvalue.text,
keyboardOptions = KeyboardOptions(
imeAction = ImeAction.Done
),
onValueChange = {
textFieldvalue = TextFieldValue(it)
},
label = {
Text("Relay")
}
)
IconButton(
onClick = {
val url = textFieldvalue.text
if (url.isNotBlank() && url != "/") {
var addedWSS =
if (!url.startsWith("wss://") && !url.startsWith("ws://")) {
if (url.endsWith(".onion") || url.endsWith(".onion/")) {
"ws://$url"
} else {
"wss://$url"
}
} else {
url
}
if (url.endsWith("/")) addedWSS = addedWSS.dropLast(1)
relays2.add(addedWSS)
textFieldvalue = TextFieldValue("")
}
}
) {
Icon(
Icons.Default.Add,
null
)
}
}
}
}
}
}
@@ -182,6 +327,9 @@ fun EditPermission(
.padding(horizontal = 8.dp)
.clickable {
checked = !checked
val relays = applicationData.relays.joinToString(separator = "&") { "relay=$it" }
val localSecret = if (checked) "&secret=${applicationData.secret}" else ""
bunkerUri = "bunker://${account.keyPair.pubKey.toHexKey()}?$relays$localSecret"
}
) {
Text(
@@ -211,6 +359,21 @@ fun EditPermission(
Text("Name")
}
)
if (!applicationData.isConnected) {
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Button(
onClick = {
editRelaysDialog = true
},
Modifier.padding(6.dp)
) {
Text(stringResource(R.string.relays))
}
}
}
LazyColumn(
Modifier.weight(1f)
) {
@@ -303,11 +466,17 @@ fun EditPermission(
Button(
onClick = {
scope.launch(Dispatchers.IO) {
database.applicationDao().deletePermissions(selectedPackage)
database.applicationDao().insertPermissions(permissions)
database
.applicationDao()
.changeApplicationName(selectedPackage, textFieldvalue.text)
val localApplicationData = applicationData.copy(
name = textFieldvalue.text,
useSecret = checked
)
database.applicationDao().delete(applicationData)
database.applicationDao().insertApplicationWithPermissions(
ApplicationWithPermissions(
localApplicationData,
permissions
)
)
scope.launch(Dispatchers.Main) {
navController.popBackStack()
@@ -552,8 +552,8 @@ fun MainScreen(
accountStateViewModel,
account
) {
val secret = UUID.randomUUID().toString().substring(0, 6)
scope.launch(Dispatchers.IO) {
val secret = UUID.randomUUID().toString().substring(0, 6)
val application = ApplicationEntity(
secret,
"",
@@ -573,8 +573,7 @@ fun MainScreen(
val bunkerUrl = "bunker://${account.keyPair.pubKey.toHexKey()}?relay=wss://relay.nsec.app"
clipboardManager.setText(AnnotatedString(bunkerUrl))
scope.launch(Dispatchers.Main) {
navController.popBackStack()
accountStateViewModel.switchUser(account.keyPair.pubKey.toNpub(), Route.Permissions.route)
navController.navigate("Permission/$secret")
}
}
}
@@ -26,14 +26,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.navigation.NavController
import com.greenart7c3.nostrsigner.LocalPreferences
import com.greenart7c3.nostrsigner.R
import com.greenart7c3.nostrsigner.database.AppDatabase
import com.greenart7c3.nostrsigner.database.ApplicationEntity
import com.greenart7c3.nostrsigner.models.Account
import com.greenart7c3.nostrsigner.nostrsigner
import com.greenart7c3.nostrsigner.service.toShortenHex
import com.greenart7c3.nostrsigner.ui.components.IconRow
import com.greenart7c3.nostrsigner.ui.navigation.Route
@@ -57,13 +55,9 @@ fun PermissionsScreen(
}
var resetPermissions by remember { mutableStateOf(false) }
var selectedPackage by remember { mutableStateOf<String?>(null) }
val scope = rememberCoroutineScope()
LaunchedEffect(lifecycleEvent) {
if (lifecycleEvent == Lifecycle.Event.ON_RESUME) {
selectedPackage = null
}
scope.launch(Dispatchers.IO) {
applications.clear()
applications.addAll(database.applicationDao().getAll(localAccount.keyPair.pubKey.toHexKey()))
+1
View File
@@ -114,4 +114,5 @@
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="could_not_connect_to_tor">Could not connect to Tor</string>
<string name="relays">Relays</string>
</resources>