Skip to content

Commit d3de7d1

Browse files
authored
Merge branch 'master' into test/lnurl
2 parents 3d7fce9 + fa63c71 commit d3de7d1

File tree

4 files changed

+64
-21
lines changed

4 files changed

+64
-21
lines changed

app/src/main/java/to/bitkit/ext/Activities.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ fun Activity.Onchain.boostType() = when (this.v1.txType) {
7171
PaymentType.RECEIVED -> BoostType.CPFP
7272
}
7373

74+
fun Activity.timestamp() = when (this) {
75+
is Activity.Lightning -> v1.timestamp
76+
is Activity.Onchain -> when (v1.confirmed) {
77+
true -> v1.confirmTimestamp ?: v1.timestamp
78+
else -> v1.timestamp
79+
}
80+
}
81+
7482
enum class BoostType { RBF, CPFP }
7583

7684
@Suppress("LongParameterList")

app/src/main/java/to/bitkit/models/FeeRate.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package to.bitkit.models
22

33
import androidx.annotation.DrawableRes
44
import androidx.annotation.StringRes
5+
import androidx.compose.runtime.Composable
56
import androidx.compose.ui.graphics.Color
7+
import androidx.compose.ui.res.stringResource
68
import com.synonym.bitkitcore.FeeRates
79
import to.bitkit.R
810
import to.bitkit.ui.theme.Colors
@@ -69,7 +71,6 @@ enum class FeeRate(
6971
}
7072
}
7173

72-
// TODO use for confirmsIn text in ActivityRow.kt:125
7374
fun fromSatsPerVByte(satsPerVByte: ULong, feeRates: FeeRates): FeeRate {
7475
val value = satsPerVByte.toUInt()
7576
return when {
@@ -79,5 +80,17 @@ enum class FeeRate(
7980
else -> MINIMUM
8081
}
8182
}
83+
84+
@Composable
85+
fun getFeeDescription(
86+
feeRate: ULong,
87+
feeEstimates: FeeRates?,
88+
): String {
89+
val feeRateEnum = feeEstimates?.let {
90+
fromSatsPerVByte(feeRate, it)
91+
} ?: NORMAL
92+
93+
return stringResource(feeRateEnum.shortDescription)
94+
}
8295
}
8396
}

app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import androidx.compose.ui.unit.dp
4242
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
4343
import androidx.lifecycle.compose.collectAsStateWithLifecycle
4444
import com.synonym.bitkitcore.Activity
45+
import com.synonym.bitkitcore.FeeRates
4546
import com.synonym.bitkitcore.LightningActivity
4647
import com.synonym.bitkitcore.OnchainActivity
4748
import com.synonym.bitkitcore.PaymentState
@@ -52,12 +53,15 @@ import to.bitkit.ext.ellipsisMiddle
5253
import to.bitkit.ext.isSent
5354
import to.bitkit.ext.isTransfer
5455
import to.bitkit.ext.rawId
56+
import to.bitkit.ext.timestamp
5557
import to.bitkit.ext.toActivityItemDate
5658
import to.bitkit.ext.toActivityItemTime
5759
import to.bitkit.ext.totalValue
60+
import to.bitkit.models.FeeRate
5861
import to.bitkit.models.Toast
5962
import to.bitkit.ui.Routes
6063
import to.bitkit.ui.appViewModel
64+
import to.bitkit.ui.blocktankViewModel
6165
import to.bitkit.ui.components.BalanceHeaderView
6266
import to.bitkit.ui.components.BodySSB
6367
import to.bitkit.ui.components.BottomSheetPreview
@@ -188,6 +192,10 @@ fun ActivityDetailScreen(
188192
}
189193

190194
val context = LocalContext.current
195+
val blocktankInfo by blocktankViewModel?.info?.collectAsStateWithLifecycle() ?: remember {
196+
mutableStateOf(null)
197+
}
198+
val feeRates = blocktankInfo?.onchain?.feeRates
191199

192200
Column(
193201
modifier = Modifier.background(Colors.Black)
@@ -220,7 +228,8 @@ fun ActivityDetailScreen(
220228
title = copyToastTitle,
221229
description = text.ellipsisMiddle(40)
222230
)
223-
}
231+
},
232+
feeRates = feeRates,
224233
)
225234
if (showAddTagSheet) {
226235
ActivityAddTagSheet(
@@ -289,6 +298,7 @@ private fun ActivityDetailContent(
289298
isCpfpChild: Boolean = false,
290299
boostTxDoesExist: Map<String, Boolean> = emptyMap(),
291300
onCopy: (String) -> Unit,
301+
feeRates: FeeRates? = null,
292302
) {
293303
val isLightning = item is Activity.Lightning
294304
val isSent = item.isSent()
@@ -303,13 +313,7 @@ private fun ActivityDetailContent(
303313
}
304314

305315
val amountPrefix = if (isSent) "-" else "+"
306-
val timestamp = when (item) {
307-
is Activity.Lightning -> item.v1.timestamp
308-
is Activity.Onchain -> when (item.v1.confirmed) {
309-
true -> item.v1.confirmTimestamp ?: item.v1.timestamp
310-
else -> item.v1.timestamp
311-
}
312-
}
316+
val timestamp = item.timestamp()
313317
val paymentValue = when (item) {
314318
is Activity.Lightning -> item.v1.value
315319
is Activity.Onchain -> item.v1.value
@@ -369,7 +373,7 @@ private fun ActivityDetailContent(
369373
}
370374

371375
Spacer(modifier = Modifier.height(16.dp))
372-
StatusSection(item, accentColor)
376+
StatusSection(item, accentColor, feeRates)
373377
HorizontalDivider(modifier = Modifier.padding(top = 16.dp))
374378

375379
// Timestamp section: date and time
@@ -686,7 +690,11 @@ private fun ActivityDetailContent(
686690
}
687691

688692
@Composable
689-
private fun StatusSection(item: Activity, accentColor: Color) {
693+
private fun StatusSection(
694+
item: Activity,
695+
accentColor: Color,
696+
feeRates: FeeRates? = null,
697+
) {
690698
Column(modifier = Modifier.fillMaxWidth()) {
691699
Caption13Up(
692700
text = stringResource(R.string.wallet__activity_status),
@@ -731,9 +739,10 @@ private fun StatusSection(item: Activity, accentColor: Color) {
731739
var statusTestTag: String? = null
732740

733741
if (item.v1.isTransfer) {
734-
val duration = 0 // TODO get transfer duration
742+
val duration = FeeRate.getFeeDescription(item.v1.feeRate, feeRates)
743+
.removeEstimationSymbol()
735744
statusText = stringResource(R.string.wallet__activity_transfer_pending)
736-
.replace("{duration}", "$duration")
745+
.replace("{duration}", duration)
737746
statusTestTag = "StatusTransfer"
738747
}
739748

@@ -951,3 +960,6 @@ private fun isBoostCompleted(
951960

952961
return false
953962
}
963+
964+
// TODO remove this method after transifex update
965+
private fun String.removeEstimationSymbol() = this.replace("±", "")

app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityRow.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,15 @@ import to.bitkit.ext.formatted
3434
import to.bitkit.ext.isSent
3535
import to.bitkit.ext.isTransfer
3636
import to.bitkit.ext.rawId
37+
import to.bitkit.ext.timestamp
3738
import to.bitkit.ext.totalValue
3839
import to.bitkit.ext.txType
40+
import to.bitkit.models.FeeRate
3941
import to.bitkit.models.PrimaryDisplay
4042
import to.bitkit.models.formatToModernDisplay
4143
import to.bitkit.ui.LocalCurrencies
4244
import to.bitkit.ui.activityListViewModel
45+
import to.bitkit.ui.blocktankViewModel
4346
import to.bitkit.ui.components.BodyMSB
4447
import to.bitkit.ui.components.CaptionB
4548
import to.bitkit.ui.currencyViewModel
@@ -61,15 +64,17 @@ fun ActivityRow(
6164
onClick: (String) -> Unit,
6265
testTag: String,
6366
) {
67+
val blocktankInfo by blocktankViewModel?.info?.collectAsStateWithLifecycle() ?: remember {
68+
mutableStateOf(null)
69+
}
70+
val feeRates = blocktankInfo?.onchain?.feeRates
71+
6472
val status: PaymentState? = when (item) {
6573
is Activity.Lightning -> item.v1.status
6674
is Activity.Onchain -> null
6775
}
6876
val isLightning = item is Activity.Lightning
69-
val timestamp = when (item) {
70-
is Activity.Lightning -> item.v1.timestamp
71-
is Activity.Onchain -> item.v1.timestamp
72-
}
77+
val timestamp = item.timestamp()
7378
val txType: PaymentType = item.txType()
7479
val isSent = item.isSent()
7580
val amountPrefix = if (isSent) "-" else "+"
@@ -123,24 +128,26 @@ fun ActivityRow(
123128
isTransfer && isSent -> if (item.v1.confirmed) {
124129
stringResource(R.string.wallet__activity_transfer_spending_done)
125130
} else {
131+
val duration = FeeRate.getFeeDescription(item.v1.feeRate, feeRates)
126132
stringResource(R.string.wallet__activity_transfer_spending_pending)
127-
.replace("{duration}", "1h") // TODO: calculate confirmsIn text
133+
.replace("{duration}", duration.removeEstimationSymbol())
128134
}
129135

130136
isTransfer && !isSent -> if (item.v1.confirmed) {
131137
stringResource(R.string.wallet__activity_transfer_savings_done)
132138
} else {
139+
val duration = FeeRate.getFeeDescription(item.v1.feeRate, feeRates)
133140
stringResource(R.string.wallet__activity_transfer_savings_pending)
134-
.replace("{duration}", "1h") // TODO: calculate confirmsIn text
141+
.replace("{duration}", duration.removeEstimationSymbol())
135142
}
136143

137144
confirmed == true -> formattedTime(timestamp)
138145

139146
else -> {
140-
// TODO: calculate confirmsIn text
147+
val feeDescription = FeeRate.getFeeDescription(item.v1.feeRate, feeRates)
141148
stringResource(R.string.wallet__activity_confirms_in).replace(
142149
"{feeRateDescription}",
143-
"± 1h"
150+
feeDescription
144151
)
145152
}
146153
}
@@ -316,6 +323,9 @@ private fun formattedTime(timestamp: ULong): String {
316323
}
317324
}
318325

326+
// TODO remove this method after transifex update
327+
private fun String.removeEstimationSymbol() = this.replace("±", "")
328+
319329
private class ActivityItemsPreviewProvider : PreviewParameterProvider<Activity> {
320330
override val values: Sequence<Activity> get() = previewActivityItems.asSequence()
321331
}

0 commit comments

Comments
 (0)