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 { data object Loading : UiState() data class Success(val data: T) : UiState() data class Error(val message: String) : UiState() } 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 = emptyList(), override val routeHintAliases : Map = 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 = emptyList(), override val routeHintAliases : Map = 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 ) : SendState() data class Error(val message: String) : SendState() } // ── History list states ──────────────────────────────────────────────────────── sealed interface HistoryState { data object Loading : HistoryState data class Success( val payments : List, 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 val routeHintAliases : Map val paymentHash : String val createdAt : Instant val expiresAt : Instant }