173 lines
7.1 KiB
Kotlin
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
|
|
} |