diff --git a/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsScreen.kt b/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsScreen.kt index 96f39109..65cd2609 100644 --- a/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsScreen.kt +++ b/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsScreen.kt @@ -72,7 +72,7 @@ import org.bitcoinppl.cove.ui.theme.CoveColor import org.bitcoinppl.cove.ui.theme.coveColors import org.bitcoinppl.cove.ui.theme.isLight import org.bitcoinppl.cove.utils.toColor -import org.bitcoinppl.cove.views.AutoSizeText +import org.bitcoinppl.cove.views.AsyncText import org.bitcoinppl.cove.views.BalanceAutoSizeText import org.bitcoinppl.cove.views.ImageButton import org.bitcoinppl.cove_core.HeaderIconPresenter @@ -110,9 +110,11 @@ fun TransactionDetailsScreen( // state for confirmation polling and pull-to-refresh var numberOfConfirmations by remember { mutableStateOf(null) } var isRefreshing by remember { mutableStateOf(false) } - var feeFiatFmt by remember { mutableStateOf("---") } - var sentSansFeeFiatFmt by remember { mutableStateOf("---") } - var totalSpentFiatFmt by remember { mutableStateOf("---") } + + // use cached fiat values for immediate display, null shows spinner + var feeFiatFmt by remember { mutableStateOf(transactionDetails.feeFiatFmtCached()) } + var sentSansFeeFiatFmt by remember { mutableStateOf(transactionDetails.sentSansFeeFiatFmtCached()) } + var totalSpentFiatFmt by remember { mutableStateOf(transactionDetails.amountFiatFmtCached()) } // get current color scheme (respects in-app theme toggle) val isDark = !MaterialTheme.colorScheme.isLight @@ -127,25 +129,28 @@ fun TransactionDetailsScreen( } } - // load fiat amounts + // load fiat amounts (update cached values with fresh async values) LaunchedEffect(transactionDetails) { feeFiatFmt = try { transactionDetails.feeFiatFmt() } catch (e: Exception) { - "---" + android.util.Log.e("TransactionDetails", "Failed to fetch fiat fee amount", e) + feeFiatFmt // keep cached value on error } sentSansFeeFiatFmt = try { transactionDetails.sentSansFeeFiatFmt() } catch (e: Exception) { - "---" + android.util.Log.e("TransactionDetails", "Failed to fetch sent sans fee fiat amount", e) + sentSansFeeFiatFmt // keep cached value on error } totalSpentFiatFmt = try { transactionDetails.amountFiatFmt() } catch (e: Exception) { - "---" + android.util.Log.e("TransactionDetails", "Failed to fetch total fiat amount", e) + totalSpentFiatFmt // keep cached value on error } } @@ -268,14 +273,6 @@ fun TransactionDetailsScreen( // format amounts val txAmountPrimary = manager.rust.displayAmount(amount = transactionDetails.amount()) - val txAmountSecondary by androidx.compose.runtime.produceState(initialValue = "---") { - value = - try { - transactionDetails.amountFiatFmt() - } catch (e: Exception) { - "---" - } - } // details expanded from metadata val isExpanded = metadata.detailsExpanded @@ -483,11 +480,10 @@ fun TransactionDetailsScreen( Spacer(Modifier.height(4.dp)) - AutoSizeText( - txAmountSecondary, + AsyncText( + text = totalSpentFiatFmt, color = fg.copy(alpha = 0.8f), - maxFontSize = 18.sp, - minimumScaleFactor = 0.90f, + style = MaterialTheme.typography.bodyLarge.copy(fontSize = 18.sp), ) Spacer(Modifier.height(32.dp)) diff --git a/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsWidget.kt b/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsWidget.kt index 37ab8945..ea2afb40 100644 --- a/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsWidget.kt +++ b/android/app/src/main/java/org/bitcoinppl/cove/flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsWidget.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.bitcoinppl.cove.R import org.bitcoinppl.cove.ui.theme.CoveColor +import org.bitcoinppl.cove.views.AsyncText import org.bitcoinppl.cove.views.AutoSizeText import org.bitcoinppl.cove_core.TransactionDetails import org.bitcoinppl.cove_core.WalletMetadata @@ -36,9 +37,9 @@ import org.bitcoinppl.cove_core.WalletMetadata internal fun TransactionDetailsWidget( transactionDetails: TransactionDetails, numberOfConfirmations: Int?, - feeFiatFmt: String, - sentSansFeeFiatFmt: String, - totalSpentFiatFmt: String, + feeFiatFmt: String?, + sentSansFeeFiatFmt: String?, + totalSpentFiatFmt: String?, metadata: WalletMetadata, ) { val dividerColor = MaterialTheme.colorScheme.outlineVariant @@ -207,10 +208,8 @@ internal fun DetailsWidget( } Column(horizontalAlignment = Alignment.End) { AutoSizeText(primary, color = primaryColor, maxFontSize = 14.sp, minimumScaleFactor = 0.90f, fontWeight = FontWeight.SemiBold) - if (!secondary.isNullOrEmpty()) { - Spacer(Modifier.height(6.dp)) - Text(secondary, color = sub, fontSize = 12.sp) - } + Spacer(Modifier.height(6.dp)) + AsyncText(text = secondary, color = sub, style = MaterialTheme.typography.bodySmall.copy(fontSize = 12.sp)) } } } diff --git a/android/app/src/main/java/org/bitcoinppl/cove/views/AsyncView.kt b/android/app/src/main/java/org/bitcoinppl/cove/views/AsyncView.kt index 618f1a17..9fa63795 100644 --- a/android/app/src/main/java/org/bitcoinppl/cove/views/AsyncView.kt +++ b/android/app/src/main/java/org/bitcoinppl/cove/views/AsyncView.kt @@ -50,8 +50,10 @@ fun AsyncText( } // view that runs an async operation and shows loading/content/error states +// if cachedValue is provided, show it immediately while async operation runs @Composable fun AsyncView( + cachedValue: T? = null, operation: suspend () -> T, modifier: Modifier = Modifier, errorView: @Composable () -> Unit = {}, @@ -66,19 +68,32 @@ fun AsyncView( } catch (e: CancellationException) { throw e } catch (e: Exception) { - Log.e("AsyncView", "Error loading async view: ${e.message}") + Log.e("AsyncView", "Error loading async view: ${e.message}", e) Result.failure(e) } } Box(modifier = modifier, contentAlignment = Alignment.Center) { when (val r = result) { - null -> - CircularProgressIndicator( - modifier = Modifier.size(16.dp), - strokeWidth = 2.dp, - ) - else -> if (r.isSuccess) content(r.getOrThrow()) else errorView() + null -> { + if (cachedValue != null) { + content(cachedValue) + } else { + CircularProgressIndicator( + modifier = Modifier.size(16.dp), + strokeWidth = 2.dp, + ) + } + } + else -> { + if (r.isSuccess) { + content(r.getOrThrow()) + } else if (cachedValue != null) { + content(cachedValue) + } else { + errorView() + } + } } } } diff --git a/android/app/src/main/java/org/bitcoinppl/cove_core/cove.kt b/android/app/src/main/java/org/bitcoinppl/cove_core/cove.kt index d926147a..ce647905 100644 --- a/android/app/src/main/java/org/bitcoinppl/cove_core/cove.kt +++ b/android/app/src/main/java/org/bitcoinppl/cove_core/cove.kt @@ -1625,6 +1625,8 @@ external fun uniffi_cove_checksum_method_transactiondetails_amount_fiat( ): Short external fun uniffi_cove_checksum_method_transactiondetails_amount_fiat_fmt( ): Short +external fun uniffi_cove_checksum_method_transactiondetails_amount_fiat_fmt_cached( +): Short external fun uniffi_cove_checksum_method_transactiondetails_amount_fmt( ): Short external fun uniffi_cove_checksum_method_transactiondetails_block_number( @@ -1635,6 +1637,8 @@ external fun uniffi_cove_checksum_method_transactiondetails_confirmation_date_ti ): Short external fun uniffi_cove_checksum_method_transactiondetails_fee_fiat_fmt( ): Short +external fun uniffi_cove_checksum_method_transactiondetails_fee_fiat_fmt_cached( +): Short external fun uniffi_cove_checksum_method_transactiondetails_fee_fmt( ): Short external fun uniffi_cove_checksum_method_transactiondetails_is_confirmed( @@ -1645,6 +1649,8 @@ external fun uniffi_cove_checksum_method_transactiondetails_is_sent( ): Short external fun uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fiat_fmt( ): Short +external fun uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fiat_fmt_cached( +): Short external fun uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fmt( ): Short external fun uniffi_cove_checksum_method_transactiondetails_transaction_label( @@ -2677,6 +2683,8 @@ external fun uniffi_cove_fn_method_transactiondetails_amount_fiat(`ptr`: Long, ): Long external fun uniffi_cove_fn_method_transactiondetails_amount_fiat_fmt(`ptr`: Long, ): Long +external fun uniffi_cove_fn_method_transactiondetails_amount_fiat_fmt_cached(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, +): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_amount_fmt(`ptr`: Long,`unit`: RustBufferBitcoinUnit.ByValue,uniffi_out_err: UniffiRustCallStatus, ): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_block_number(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, @@ -2687,6 +2695,8 @@ external fun uniffi_cove_fn_method_transactiondetails_confirmation_date_time(`pt ): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_fee_fiat_fmt(`ptr`: Long, ): Long +external fun uniffi_cove_fn_method_transactiondetails_fee_fiat_fmt_cached(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, +): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_fee_fmt(`ptr`: Long,`unit`: RustBufferBitcoinUnit.ByValue,uniffi_out_err: UniffiRustCallStatus, ): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_is_confirmed(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, @@ -2697,6 +2707,8 @@ external fun uniffi_cove_fn_method_transactiondetails_is_sent(`ptr`: Long,uniffi ): Byte external fun uniffi_cove_fn_method_transactiondetails_sent_sans_fee_fiat_fmt(`ptr`: Long, ): Long +external fun uniffi_cove_fn_method_transactiondetails_sent_sans_fee_fiat_fmt_cached(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, +): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_sent_sans_fee_fmt(`ptr`: Long,`unit`: RustBufferBitcoinUnit.ByValue,uniffi_out_err: UniffiRustCallStatus, ): RustBuffer.ByValue external fun uniffi_cove_fn_method_transactiondetails_transaction_label(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, @@ -4108,6 +4120,9 @@ private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { if (lib.uniffi_cove_checksum_method_transactiondetails_amount_fiat_fmt() != 17226.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_cove_checksum_method_transactiondetails_amount_fiat_fmt_cached() != 11182.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_cove_checksum_method_transactiondetails_amount_fmt() != 13996.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -4123,6 +4138,9 @@ private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { if (lib.uniffi_cove_checksum_method_transactiondetails_fee_fiat_fmt() != 57101.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_cove_checksum_method_transactiondetails_fee_fiat_fmt_cached() != 1845.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_cove_checksum_method_transactiondetails_fee_fmt() != 37631.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -4138,6 +4156,9 @@ private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { if (lib.uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fiat_fmt() != 61624.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fiat_fmt_cached() != 42399.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fmt() != 64427.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -20359,6 +20380,8 @@ public interface TransactionDetailsInterface { suspend fun `amountFiatFmt`(): kotlin.String + fun `amountFiatFmtCached`(): kotlin.String? + fun `amountFmt`(`unit`: BitcoinUnit): kotlin.String fun `blockNumber`(): kotlin.UInt? @@ -20369,6 +20392,8 @@ public interface TransactionDetailsInterface { suspend fun `feeFiatFmt`(): kotlin.String + fun `feeFiatFmtCached`(): kotlin.String? + fun `feeFmt`(`unit`: BitcoinUnit): kotlin.String? fun `isConfirmed`(): kotlin.Boolean @@ -20379,6 +20404,8 @@ public interface TransactionDetailsInterface { suspend fun `sentSansFeeFiatFmt`(): kotlin.String + fun `sentSansFeeFiatFmtCached`(): kotlin.String? + fun `sentSansFeeFmt`(`unit`: BitcoinUnit): kotlin.String? fun `transactionLabel`(): kotlin.String? @@ -20567,6 +20594,19 @@ open class TransactionDetails: Disposable, AutoCloseable, TransactionDetailsInte ) } + override fun `amountFiatFmtCached`(): kotlin.String? { + return FfiConverterOptionalString.lift( + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_cove_fn_method_transactiondetails_amount_fiat_fmt_cached( + it, + _status) +} + } + ) + } + + override fun `amountFmt`(`unit`: BitcoinUnit): kotlin.String { return FfiConverterString.lift( callWithHandle { @@ -20640,6 +20680,19 @@ open class TransactionDetails: Disposable, AutoCloseable, TransactionDetailsInte ) } + override fun `feeFiatFmtCached`(): kotlin.String? { + return FfiConverterOptionalString.lift( + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_cove_fn_method_transactiondetails_fee_fiat_fmt_cached( + it, + _status) +} + } + ) + } + + override fun `feeFmt`(`unit`: BitcoinUnit): kotlin.String? { return FfiConverterOptionalString.lift( callWithHandle { @@ -20713,6 +20766,19 @@ open class TransactionDetails: Disposable, AutoCloseable, TransactionDetailsInte ) } + override fun `sentSansFeeFiatFmtCached`(): kotlin.String? { + return FfiConverterOptionalString.lift( + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_cove_fn_method_transactiondetails_sent_sans_fee_fiat_fmt_cached( + it, + _status) +} + } + ) + } + + override fun `sentSansFeeFmt`(`unit`: BitcoinUnit): kotlin.String? { return FfiConverterOptionalString.lift( callWithHandle { diff --git a/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/SentDetailsExpandedView.swift b/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/SentDetailsExpandedView.swift index 9458ddd0..1d8ccec3 100644 --- a/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/SentDetailsExpandedView.swift +++ b/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/SentDetailsExpandedView.swift @@ -75,7 +75,10 @@ struct SentDetailsExpandedView: View { VStack(alignment: .trailing) { Text(transactionDetails.feeFmt(unit: metadata.selectedUnit) ?? "") - AsyncView(operation: transactionDetails.feeFiatFmt) { amount in + AsyncView( + cachedValue: transactionDetails.feeFiatFmtCached(), + operation: transactionDetails.feeFiatFmt + ) { amount in Text(amount).foregroundStyle(.secondary) .font(.caption) .padding(.top, 2) @@ -91,7 +94,10 @@ struct SentDetailsExpandedView: View { VStack(alignment: .trailing) { Text(transactionDetails.sentSansFeeFmt(unit: metadata.selectedUnit) ?? "") - AsyncView(operation: transactionDetails.sentSansFeeFiatFmt) { amount in + AsyncView( + cachedValue: transactionDetails.sentSansFeeFiatFmtCached(), + operation: transactionDetails.sentSansFeeFiatFmt + ) { amount in Text(amount).foregroundStyle(.secondary) .font(.caption) .padding(.top, 2) @@ -110,7 +116,10 @@ struct SentDetailsExpandedView: View { Spacer() VStack(alignment: .trailing) { Text(transactionDetails.amountFmt(unit: metadata.selectedUnit)) - AsyncView(operation: transactionDetails.amountFiatFmt) { amount in + AsyncView( + cachedValue: transactionDetails.amountFiatFmtCached(), + operation: transactionDetails.amountFiatFmt + ) { amount in Text(amount).foregroundStyle(.secondary) .font(.caption) .padding(.top, 2) diff --git a/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsView.swift b/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsView.swift index a553b658..4be8968e 100644 --- a/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsView.swift +++ b/ios/Cove/Flows/SelectedWalletFlow/TransactionDetails/TransactionDetailsView.swift @@ -104,7 +104,10 @@ struct TransactionDetailsView: View { .fontWeight(.bold) .padding(.top, 12) - AsyncView(operation: transactionDetails.amountFiatFmt) { amount in + AsyncView( + cachedValue: transactionDetails.amountFiatFmtCached(), + operation: transactionDetails.amountFiatFmt + ) { amount in Text(amount).foregroundStyle(.primary.opacity(0.8)) } } @@ -188,7 +191,10 @@ struct TransactionDetailsView: View { .fontWeight(.bold) .padding(.top, 12) - AsyncView(operation: transactionDetails.amountFiatFmt) { amount in + AsyncView( + cachedValue: transactionDetails.amountFiatFmtCached(), + operation: transactionDetails.amountFiatFmt + ) { amount in Text(amount).foregroundStyle(.primary.opacity(0.8)) } } diff --git a/ios/Cove/Views/AsyncView.swift b/ios/Cove/Views/AsyncView.swift index cd4f258a..2e96e840 100644 --- a/ios/Cove/Views/AsyncView.swift +++ b/ios/Cove/Views/AsyncView.swift @@ -28,22 +28,41 @@ struct AsyncText: View { } struct AsyncView: View { + let cachedValue: Success? let operation: () async throws -> Success let content: (Success) -> Content let errorView: some View = Text("") @State private var result: Result? + init( + cachedValue: Success? = nil, + operation: @escaping () async throws -> Success, + @ViewBuilder content: @escaping (Success) -> Content + ) { + self.cachedValue = cachedValue + self.operation = operation + self.content = content + } + var body: some View { Group { switch result { case .none: - ProgressView() - .tint(.primary) + if let cachedValue { + content(cachedValue) + } else { + ProgressView() + .tint(.primary) + } case let .success(value): content(value) case .failure: - errorView + if let cachedValue { + content(cachedValue) + } else { + errorView + } } } .task { diff --git a/ios/CoveCore/Sources/CoveCore/generated/cove.swift b/ios/CoveCore/Sources/CoveCore/generated/cove.swift index bb11bd1c..486c56d1 100644 --- a/ios/CoveCore/Sources/CoveCore/generated/cove.swift +++ b/ios/CoveCore/Sources/CoveCore/generated/cove.swift @@ -9093,6 +9093,8 @@ public protocol TransactionDetailsProtocol: AnyObject, Sendable { func amountFiatFmt() async throws -> String + func amountFiatFmtCached() -> String? + func amountFmt(unit: BitcoinUnit) -> String func blockNumber() -> UInt32? @@ -9103,6 +9105,8 @@ public protocol TransactionDetailsProtocol: AnyObject, Sendable { func feeFiatFmt() async throws -> String + func feeFiatFmtCached() -> String? + func feeFmt(unit: BitcoinUnit) -> String? func isConfirmed() -> Bool @@ -9113,6 +9117,8 @@ public protocol TransactionDetailsProtocol: AnyObject, Sendable { func sentSansFeeFiatFmt() async throws -> String + func sentSansFeeFiatFmtCached() -> String? + func sentSansFeeFmt(unit: BitcoinUnit) -> String? func transactionLabel() -> String? @@ -9276,6 +9282,14 @@ open func amountFiatFmt()async throws -> String { ) } +open func amountFiatFmtCached() -> String? { + return try! FfiConverterOptionString.lift(try! rustCall() { + uniffi_cove_fn_method_transactiondetails_amount_fiat_fmt_cached( + self.uniffiCloneHandle(),$0 + ) +}) +} + open func amountFmt(unit: BitcoinUnit) -> String { return try! FfiConverterString.lift(try! rustCall() { uniffi_cove_fn_method_transactiondetails_amount_fmt( @@ -9326,6 +9340,14 @@ open func feeFiatFmt()async throws -> String { ) } +open func feeFiatFmtCached() -> String? { + return try! FfiConverterOptionString.lift(try! rustCall() { + uniffi_cove_fn_method_transactiondetails_fee_fiat_fmt_cached( + self.uniffiCloneHandle(),$0 + ) +}) +} + open func feeFmt(unit: BitcoinUnit) -> String? { return try! FfiConverterOptionString.lift(try! rustCall() { uniffi_cove_fn_method_transactiondetails_fee_fmt( @@ -9376,6 +9398,14 @@ open func sentSansFeeFiatFmt()async throws -> String { ) } +open func sentSansFeeFiatFmtCached() -> String? { + return try! FfiConverterOptionString.lift(try! rustCall() { + uniffi_cove_fn_method_transactiondetails_sent_sans_fee_fiat_fmt_cached( + self.uniffiCloneHandle(),$0 + ) +}) +} + open func sentSansFeeFmt(unit: BitcoinUnit) -> String? { return try! FfiConverterOptionString.lift(try! rustCall() { uniffi_cove_fn_method_transactiondetails_sent_sans_fee_fmt( @@ -29269,6 +29299,9 @@ private let initializationResult: InitializationResult = { if (uniffi_cove_checksum_method_transactiondetails_amount_fiat_fmt() != 17226) { return InitializationResult.apiChecksumMismatch } + if (uniffi_cove_checksum_method_transactiondetails_amount_fiat_fmt_cached() != 11182) { + return InitializationResult.apiChecksumMismatch + } if (uniffi_cove_checksum_method_transactiondetails_amount_fmt() != 13996) { return InitializationResult.apiChecksumMismatch } @@ -29284,6 +29317,9 @@ private let initializationResult: InitializationResult = { if (uniffi_cove_checksum_method_transactiondetails_fee_fiat_fmt() != 57101) { return InitializationResult.apiChecksumMismatch } + if (uniffi_cove_checksum_method_transactiondetails_fee_fiat_fmt_cached() != 1845) { + return InitializationResult.apiChecksumMismatch + } if (uniffi_cove_checksum_method_transactiondetails_fee_fmt() != 37631) { return InitializationResult.apiChecksumMismatch } @@ -29299,6 +29335,9 @@ private let initializationResult: InitializationResult = { if (uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fiat_fmt() != 61624) { return InitializationResult.apiChecksumMismatch } + if (uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fiat_fmt_cached() != 42399) { + return InitializationResult.apiChecksumMismatch + } if (uniffi_cove_checksum_method_transactiondetails_sent_sans_fee_fmt() != 64427) { return InitializationResult.apiChecksumMismatch } diff --git a/rust/src/transaction/transaction_details.rs b/rust/src/transaction/transaction_details.rs index 7f7e79c6..57041c61 100644 --- a/rust/src/transaction/transaction_details.rs +++ b/rust/src/transaction/transaction_details.rs @@ -230,6 +230,13 @@ impl TransactionDetails { Ok(fiat_amount_fmt(amount)) } + #[uniffi::method] + pub fn amount_fiat_fmt_cached(&self) -> Option { + let amount = self.amount(); + let fiat = FIAT_CLIENT.value_in_currency_cached(amount, currency())?; + Some(fiat_amount_fmt(fiat)) + } + #[uniffi::method] pub fn fee_fmt(&self, unit: Unit) -> Option { let fee = self.fee?; @@ -251,6 +258,13 @@ impl TransactionDetails { Ok(fiat_amount_fmt(fiat)) } + #[uniffi::method] + pub fn fee_fiat_fmt_cached(&self) -> Option { + let fee = self.fee?; + let fiat = FIAT_CLIENT.value_in_currency_cached(fee, currency())?; + Some(fiat_amount_fmt(fiat)) + } + #[uniffi::method] pub fn amount_fmt(&self, unit: Unit) -> String { self.sent_and_received.amount_fmt(unit) @@ -288,6 +302,13 @@ impl TransactionDetails { Ok(fiat_amount_fmt(fiat)) } + #[uniffi::method] + pub fn sent_sans_fee_fiat_fmt_cached(&self) -> Option { + let amount = self.sent_sans_fee()?; + let fiat = FIAT_CLIENT.value_in_currency_cached(amount, currency())?; + Some(fiat_amount_fmt(fiat)) + } + #[uniffi::method] pub fn is_confirmed(&self) -> bool { self.pending_or_confirmed.is_confirmed()