diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt index efac3da70..14c88a39b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/CashuProcessor.kt @@ -6,6 +6,7 @@ import com.google.gson.JsonArray import com.google.gson.JsonObject import com.google.gson.JsonParser import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver +import com.vitorpamplona.amethyst.ui.components.GenericLoadable import okhttp3.MediaType.Companion.toMediaType import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody @@ -21,21 +22,25 @@ data class CashuToken( ) class CashuProcessor { - fun parse(cashutoken: String): CashuToken { - val base64token = cashutoken.replace("cashuA", "") - val cashu = JsonParser.parseString(String(Base64.getDecoder().decode(base64token))) - val token = cashu.asJsonObject.get("token").asJsonArray[0].asJsonObject - val proofs = token["proofs"].asJsonArray - val mint = token["mint"].asString + fun parse(cashuToken: String): GenericLoadable { + try { + val base64token = cashuToken.replace("cashuA", "") + val cashu = JsonParser.parseString(String(Base64.getDecoder().decode(base64token))) + val token = cashu.asJsonObject.get("token").asJsonArray[0].asJsonObject + val proofs = token["proofs"].asJsonArray + val mint = token["mint"].asString - var totalAmount = 0L - for (proof in proofs) { - totalAmount += proof.asJsonObject["amount"].asLong + var totalAmount = 0L + for (proof in proofs) { + totalAmount += proof.asJsonObject["amount"].asLong + } + val fees = Math.max(((totalAmount * 0.02).toInt()), 2) + val redeemInvoiceAmount = totalAmount - fees + + return GenericLoadable.Loaded(CashuToken(mint, totalAmount, fees, redeemInvoiceAmount, proofs)) + } catch (e: Exception) { + return GenericLoadable.Error("Could not parse this cashu token") } - val fees = Math.max(((totalAmount * 0.02).toInt()), 2) - val redeemInvoiceAmount = totalAmount - fees - - return CashuToken(mint, totalAmount, fees, redeemInvoiceAmount, proofs) } fun melt(token: CashuToken, lud16: String, onSuccess: (String) -> Unit, onError: (String) -> Unit) { 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 index 33bf334fa..719dd6c61 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/CashuRedeem.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/CashuRedeem.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.launch @Composable fun CashuPreview(cashutoken: String, accountViewModel: AccountViewModel) { - var cachuData by remember { mutableStateOf(null) } + var cachuData by remember { mutableStateOf>(GenericLoadable.Loading()) } LaunchedEffect(key1 = cashutoken) { launch(Dispatchers.IO) { @@ -44,13 +44,13 @@ fun CashuPreview(cashutoken: String, accountViewModel: AccountViewModel) { } Crossfade(targetState = cachuData) { - if (it != null) { - CashuPreview(it, accountViewModel) - } else { - Text( + when (it) { + is GenericLoadable.Loaded -> CashuPreview(it.loaded, accountViewModel) + is GenericLoadable.Error -> Text( text = "$cashutoken ", style = LocalTextStyle.current.copy(textDirection = TextDirection.Content) ) + else -> {} } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt new file mode 100644 index 000000000..22a72d914 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/GenericLoadable.kt @@ -0,0 +1,19 @@ +package com.vitorpamplona.amethyst.ui.components + +import androidx.compose.runtime.Immutable + +@Immutable +sealed class GenericLoadable { + + @Immutable + class Loading : GenericLoadable() + + @Immutable + class Loaded(val loaded: T) : GenericLoadable() + + @Immutable + class Empty : GenericLoadable() + + @Immutable + class Error(val errorMessage: String) : GenericLoadable() +}