Files
gudari/app/src/main/java/com/bitcointxoko/gudariwallet/ui/UiStates.kt
T

173 lines
7.1 KiB
Kotlin

package com.bitcointxoko.gudariwallet.ui
import com.bitcointxoko.gudariwallet.api.LnurlScanResponse
import com.bitcointxoko.gudariwallet.api.PaymentDetailResponse
import com.bitcointxoko.gudariwallet.api.PaymentRecord
import com.bitcointxoko.gudariwallet.api.RouteHintHop
import com.bitcointxoko.gudariwallet.util.RouteHintRisk
import com.bitcointxoko.gudariwallet.util.SendInputType
import java.time.Instant
sealed class UiState<out T> {
data object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String) : UiState<Nothing>()
}
sealed class ReceiveState {
data object Idle : ReceiveState()
data object AwaitingInvoice : ReceiveState()
data class InvoiceReady(
val bolt11 : String,
val paymentHash : String,
val amountSats : Long,
val memo : String,
val expiresAt : Long
) : ReceiveState()
data class PaymentReceived(
val amountSats: Long,
val memo : String?,
val checkingId : String
) : ReceiveState()
data class Error(val message: String) : ReceiveState()
data class LnurlWithdrawReady(
val k1 : String,
val callback : String,
val defaultDescription : String,
val minSats : Long,
val maxSats : Long,
val domain : String,
val lnurl : String // original encoded string, for display
) : ReceiveState()
}
sealed class SendState {
data object Idle : SendState()
data object Scanning : SendState()
data class Bolt11Decoded(
override val bolt11 : String,
override val amountSats : Long,
override val memo : String,
override val payee : String? = null,
override val nodeAlias : String? = null,
override val routeRisk : RouteHintRisk? = null,
override val allRouteHints : List<RouteHintHop> = emptyList(),
override val routeHintAliases : Map<String, String> = emptyMap(),
override val paymentHash : String,
override val createdAt : Instant,
override val expiresAt : Instant
) : SendState(), DecodedInvoice
data class LnurlReady(
val callback : String,
val description : String,
val domain : String,
val minSats : Long,
val maxSats : Long,
val commentAllowed : Int,
val lnurl : String,
val rawRes : LnurlScanResponse
) : SendState()
data class LnurlInvoiceReady(
override val bolt11 : String,
override val amountSats : Long,
override val memo : String,
val domain : String,
val lnurl : String,
val rawRes : LnurlScanResponse,
val amountMsat : Long,
val comment : String?,
override val payee : String? = null,
override val nodeAlias : String? = null,
override val routeRisk : RouteHintRisk? = null,
override val allRouteHints : List<RouteHintHop> = emptyList(),
override val routeHintAliases : Map<String, String> = emptyMap(),
override val paymentHash : String,
override val createdAt : Instant,
override val expiresAt : Instant
) : SendState(), DecodedInvoice
data object Paying : SendState()
data class PaymentSent(
val amountSats : Long,
val feeSats : Long? = null,
val paymentHash: String,
val pendingRecord: PaymentRecord? = null,
val lnurl : String? = null
) : SendState()
data class Error(val message: String) : SendState()
}
// ── History list states ────────────────────────────────────────────────────────
sealed interface HistoryState {
data object Loading : HistoryState
data class Success(
val payments : List<PaymentRecord>,
val canLoadMore : Boolean,
val isRefreshing: Boolean = false
) : HistoryState
data class Error(val message: String) : HistoryState
}
// ── Payment detail states ──────────────────────────────────────────────────────
sealed interface DetailState {
data object Idle : DetailState
data object Loading : DetailState
data class Partial(val record: PaymentRecord) : DetailState
data class Success(val detail: PaymentDetailResponse) : DetailState
data class Error(val message: String) : DetailState
}
// ── Balance states ─────────────────────────────────────────────────────────────
sealed interface BalanceState {
data object Loading : BalanceState
data class Success(
val sats : Long,
val isRefreshing: Boolean = false,
val lastUpdated : Long = System.currentTimeMillis(),
val fiatAmount : Double? = null,
val fiatCurrency : String? = null
) : BalanceState
data class Error(
val message : String,
val staleSats: Long? = null
) : BalanceState
}
// ── Clipboard offer states ─────────────────────────────────────────────────────
sealed interface ClipboardOfferState {
data object None : ClipboardOfferState
data class Detected(
val raw : String,
val inputType: SendInputType
) : ClipboardOfferState
}
sealed interface NfcOfferState {
data object None : NfcOfferState
data class Detected(
val raw : String,
val inputType: SendInputType
) : NfcOfferState
}
/**
* Shared interface for send states that represent a fully decoded invoice
* ready for user confirmation. Allows ConfirmCardContent to accept either
* Bolt11Decoded or LnurlInvoiceReady without knowing which it is.
*/
interface DecodedInvoice {
val amountSats : Long
val memo : String
val payee : String?
val nodeAlias : String?
val bolt11 : String
val routeRisk : RouteHintRisk?
val allRouteHints : List<RouteHintHop>
val routeHintAliases : Map<String, String>
val paymentHash : String
val createdAt : Instant
val expiresAt : Instant
}