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