Merge remote-tracking branch 'origin/HEAD'

# Conflicts:
#	app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt
This commit is contained in:
Vitor Pamplona
2023-06-28 18:32:59 -04:00
8 changed files with 249 additions and 25 deletions
@@ -51,6 +51,7 @@ object LocalCache {
}
fun getUserIfExists(key: String): User? {
if (key.isEmpty()) return null
return users.get(key)
}
@@ -108,6 +109,7 @@ object LocalCache {
}
private fun isValidHexNpub(key: String): Boolean {
if (key.isBlank()) return false
if (key.contains(":")) return false
return HexValidator.isHex(key)
@@ -14,6 +14,7 @@ import java.util.Base64
@Immutable
data class CashuToken(
val token: String,
val mint: String,
val totalAmount: Long,
val fees: Int,
@@ -39,7 +40,7 @@ class CashuProcessor {
val fees = Math.max(((totalAmount * 0.02).toInt()), 2)
val redeemInvoiceAmount = totalAmount - fees
return GenericLoadable.Loaded(CashuToken(mint, totalAmount, fees, redeemInvoiceAmount, proofs))
return GenericLoadable.Loaded(CashuToken(cashuToken, mint, totalAmount, fees, redeemInvoiceAmount, proofs))
} catch (e: Exception) {
return GenericLoadable.Error<CashuToken>("Could not parse this cashu token")
}
@@ -88,7 +89,7 @@ class CashuProcessor {
if (successful) {
onSuccess("Redeemed ${token.totalAmount} Sats" + " (Fees: ${token.fees} Sats)")
} else {
onError(tree?.get("detail")?.asText()?.split('.')?.getOrNull(0) ?: "Error")
onError(tree?.get("detail")?.asText()?.split('.')?.getOrNull(0) ?: "Cashu: Tokens already spent.")
}
} catch (e: Exception) {
onError("Token melt failure: " + e.message)
@@ -16,9 +16,11 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.dp
@@ -67,6 +69,7 @@ fun CashuPreview(token: CashuToken, accountViewModel: AccountViewModel) {
val useWebService = false
val context = LocalContext.current
val scope = rememberCoroutineScope()
val clipboardManager = LocalClipboardManager.current
Column(
modifier = Modifier
@@ -114,17 +117,17 @@ fun CashuPreview(token: CashuToken, accountViewModel: AccountViewModel) {
)
}
Button(
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 10.dp),
onClick = {
// Just in case we want to use a webservice instead of directly contacting the mint
if (useWebService) {
val url = "https://redeem.cashu.me?token=$token&lightning=$lud16&autopay=true"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(context, intent, null)
} else {
.padding(bottom = 10.dp)
) {
Button(
modifier = Modifier
.padding(vertical = 10.dp).padding(horizontal = 2.dp),
onClick = {
if (lud16 != null) {
scope.launch(Dispatchers.IO) {
CashuProcessor().melt(
@@ -144,17 +147,50 @@ fun CashuPreview(token: CashuToken, accountViewModel: AccountViewModel) {
}
} else {
scope.launch {
Toast.makeText(context, "No Lightning Address set", Toast.LENGTH_SHORT).show()
Toast.makeText(
context,
"No Lightning Address set",
Toast.LENGTH_SHORT
).show()
}
}
}
},
shape = QuoteBorder,
colors = ButtonDefaults.buttonColors(
backgroundColor = MaterialTheme.colors.primary
)
) {
Text(stringResource(R.string.cashu_redeem), color = Color.White, fontSize = 20.sp)
},
shape = QuoteBorder,
colors = ButtonDefaults.buttonColors(
backgroundColor = MaterialTheme.colors.primary
)
) {
Text(
stringResource(R.string.cashu_redeem),
color = Color.White,
fontSize = 18.sp
)
}
Button(
modifier = Modifier
.padding(vertical = 10.dp).padding(horizontal = 1.dp),
onClick = {
if (useWebService) {
// In case we want to use the cashu.me webservice
val url = "https://redeem.cashu.me?token=$token&lightning=$lud16&autopay=false"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(context, intent, null)
} else {
// Copying the token to clipboard for now
var orignaltoken = token.token
clipboardManager.setText(AnnotatedString("$orignaltoken"))
scope.launch {
Toast.makeText(context, "Copied token to clipboard", Toast.LENGTH_SHORT).show()
}
}
},
shape = QuoteBorder,
colors = ButtonDefaults.buttonColors(
backgroundColor = MaterialTheme.colors.primary
)
) {
Text("", color = Color.White, fontSize = 18.sp)
}
}
}
}
@@ -2089,9 +2089,7 @@ fun DisplayHighlight(
nav
)
authorHex?.let {
DisplayQuoteAuthor(authorHex, url, nav)
}
DisplayQuoteAuthor(authorHex ?: "", url, nav)
}
@Composable
@@ -2113,7 +2111,7 @@ private fun DisplayQuoteAuthor(
}
}
Row() {
Row {
userBase?.let { userBase ->
LoadAndDisplayUser(userBase, nav)
}