diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/CashuRedeem.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/CashuRedeem.kt
new file mode 100644
index 000000000..25978ae4e
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/CashuRedeem.kt
@@ -0,0 +1,88 @@
+package com.vitorpamplona.amethyst.ui.components
+
+import android.content.Intent
+import android.net.Uri
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.*
+import androidx.compose.runtime.*
+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.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.core.content.ContextCompat.startActivity
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import com.vitorpamplona.amethyst.ui.theme.QuoteBorder
+import com.vitorpamplona.amethyst.ui.theme.subtleBorder
+
+@Composable
+fun CashuPreview(cashutoken: String, accountViewModel: AccountViewModel) {
+ val context = LocalContext.current
+ val lnaddress = accountViewModel.account.userProfile().info?.lud16
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(start = 30.dp, end = 30.dp)
+ .clip(shape = QuoteBorder)
+ .border(1.dp, MaterialTheme.colors.subtleBorder, QuoteBorder)
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(30.dp)
+ ) {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(bottom = 10.dp)
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.cashu),
+ null,
+ modifier = Modifier.size(20.dp),
+ tint = Color.Unspecified
+ )
+
+ Text(
+ text = stringResource(R.string.cashu),
+ fontSize = 20.sp,
+ fontWeight = FontWeight.W500,
+ modifier = Modifier.padding(start = 10.dp)
+ )
+ }
+
+ Divider()
+
+ Button(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(vertical = 10.dp),
+ onClick = {
+ runCatching {
+ val url = "https://redeem.cashu.me?token=$cashutoken&lightning=$lnaddress"
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ startActivity(context, intent, null)
+ }
+ },
+ shape = QuoteBorder,
+ colors = ButtonDefaults.buttonColors(
+ backgroundColor = MaterialTheme.colors.primary
+ )
+ ) {
+ Text(stringResource(R.string.cashu_redeem), color = Color.White, fontSize = 20.sp)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt
index 10bcef0f7..8dd75aff5 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt
@@ -260,7 +260,7 @@ private fun parseUrls(
}
enum class WordType {
- IMAGE, LINK, EMOJI, INVOICE, WITHDRAW, EMAIL, PHONE, BECH, HASH_INDEX, HASHTAG, SCHEMELESS_URL, OTHER
+ IMAGE, LINK, EMOJI, INVOICE, WITHDRAW, CASHU, EMAIL, PHONE, BECH, HASH_INDEX, HASHTAG, SCHEMELESS_URL, OTHER
}
@Composable
@@ -284,6 +284,8 @@ private fun RenderWord(
WordType.INVOICE
} else if (word.startsWith("lnurl", true)) {
WordType.WITHDRAW
+ } else if (word.startsWith("cashu", true) && word.endsWith("==", true)) {
+ WordType.CASHU
} else if (Patterns.EMAIL_ADDRESS.matcher(word).matches()) {
WordType.EMAIL
} else if (word.length > 6 && Patterns.PHONE.matcher(word).matches()) {
@@ -339,6 +341,7 @@ private fun RenderWordWithoutPreview(
WordType.INVOICE -> NormalWord(wordSpace)
// Don't offer to withdraw
WordType.WITHDRAW -> NormalWord(wordSpace)
+ WordType.CASHU -> NormalWord(wordSpace)
WordType.EMAIL -> ClickableEmail(word)
WordType.PHONE -> ClickablePhone(word)
WordType.BECH -> BechLink(word, false, backgroundColor, accountViewModel, nav)
@@ -369,6 +372,7 @@ private fun RenderWordWithPreview(
WordType.EMOJI -> RenderCustomEmoji(word, state)
WordType.INVOICE -> MayBeInvoicePreview(word)
WordType.WITHDRAW -> MayBeWithdrawal(word)
+ WordType.CASHU -> CashuPreview(word, accountViewModel)
WordType.EMAIL -> ClickableEmail(word)
WordType.PHONE -> ClickablePhone(word)
WordType.BECH -> BechLink(word, true, backgroundColor, accountViewModel, nav)
diff --git a/app/src/main/res/drawable/cashu.xml b/app/src/main/res/drawable/cashu.xml
new file mode 100644
index 000000000..e08c5f079
--- /dev/null
+++ b/app/src/main/res/drawable/cashu.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6cbc6420e..ab4042c45 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -456,6 +456,8 @@
Minimum PoW
Auth
Payment
+ Cashu ecash
+ Redeem Sats
LIVE
OFFLINE