Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
440f2b1
feat: add PendingSweepBalance extension functions
jvsena42 Feb 25, 2026
14db4c9
fix: improve syncTransferStates for batched force-close sweeps
jvsena42 Feb 25, 2026
28f1993
fix: add ConnectionClosed sheet variant and UI
jvsena42 Feb 25, 2026
03c9cb5
fix: update handleChannelClosed in AppViewModel
jvsena42 Feb 25, 2026
71aeef6
test: add force-close sync tests
jvsena42 Feb 25, 2026
a179821
chore: lint
jvsena42 Feb 25, 2026
33a77ec
chore: lint
jvsena42 Feb 26, 2026
356a1d7
fix: mark closing transaction as transfer activity
jvsena42 Feb 26, 2026
0fff4aa
Merge branch 'fix/reimport-channel-monitor' into fix/channel-close-ui
jvsena42 Feb 26, 2026
7e284ef
fix: sheet size medium
jvsena42 Feb 26, 2026
4030583
Merge remote-tracking branch 'origin/fix/channel-close-ui' into fix/c…
jvsena42 Feb 27, 2026
9c4f80d
fix: settle COOP_CLOSE immediately
jvsena42 Feb 27, 2026
298bdf5
fix: balance calculation includes COOP_CLOSE whole they are unsettled…
jvsena42 Feb 27, 2026
d3af0c3
test: update coop close tests to settle immediately
jvsena42 Feb 27, 2026
793e0b9
feat: add claimableAtHeight to TransferEntity
jvsena42 Feb 27, 2026
f4849a4
feat: pass claimableAtHeight when creating force close transfer
jvsena42 Feb 27, 2026
8777244
chore: create helpers to display the duration
jvsena42 Feb 27, 2026
0aa2049
feat: update banner for dynamic title
jvsena42 Feb 27, 2026
6af900c
fix: show dynamic duration for force-close
jvsena42 Feb 27, 2026
ae0f027
fix: suppress receive sheet for transfers
jvsena42 Feb 27, 2026
78efaf5
fix: claimableAtHeight type
jvsena42 Feb 27, 2026
5480492
chore: migration
jvsena42 Feb 27, 2026
37235c3
fix: claimableAtHeight type
jvsena42 Feb 27, 2026
dafdea3
test: BlockTimer helper tests
jvsena42 Feb 27, 2026
aad07e4
chore: lint
jvsena42 Feb 27, 2026
c1715b4
refactor: move force close duration calculation to TransferRepo.kt
jvsena42 Feb 27, 2026
94c86a3
fix: subtract coop closing amount from balanceInTransferToSavings
jvsena42 Feb 27, 2026
8302993
fix: transfer banner visibility
jvsena42 Feb 27, 2026
ed56df9
fix: check if this transaction is a pending sweep from a channel closure
jvsena42 Feb 27, 2026
e56d56a
Merge branch 'fix/reimport-channel-monitor' into fix/channel-close-ui
jvsena42 Feb 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: update banner for dynamic title
  • Loading branch information
jvsena42 committed Feb 27, 2026
commit 0aa2049f8a0dbfbf6d0094cc781fa8693352ec32
5 changes: 5 additions & 0 deletions app/src/main/java/to/bitkit/models/ActivityBannerType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,8 @@ enum class ActivityBannerType(
title = R.string.lightning__transfer_in_progress
)
}

data class BannerItem(
val type: ActivityBannerType,
val title: String,
)
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/models/BalanceState.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package to.bitkit.models

import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient

@Serializable
data class BalanceState(
Expand All @@ -10,6 +11,7 @@ data class BalanceState(
val maxSendOnchainSats: ULong = 0uL,
val balanceInTransferToSavings: ULong = 0uL,
val balanceInTransferToSpending: ULong = 0uL,
@Transient val forceCloseRemainingDuration: String? = null,
) {
val totalSats get() = totalOnchainSats + totalLightningSats
}
8 changes: 4 additions & 4 deletions app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -469,11 +469,11 @@ private fun Content(
) {
homeUiState.banners.forEach { banner ->
ActivityBanner(
gradientColor = banner.color,
title = stringResource(banner.title),
icon = banner.icon,
gradientColor = banner.type.color,
title = banner.title,
icon = banner.type.icon,
onClick = {
when (banner) {
when (banner.type) {
ActivityBannerType.SPENDING -> rootNavController.navigate(Routes.SettingUp)
ActivityBannerType.SAVINGS -> Unit
}
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/to/bitkit/ui/screens/wallets/HomeUiState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package to.bitkit.ui.screens.wallets

import androidx.compose.runtime.Stable
import to.bitkit.data.dto.price.PriceDTO
import to.bitkit.models.ActivityBannerType
import to.bitkit.models.BannerItem
import to.bitkit.models.Suggestion
import to.bitkit.models.WidgetType
import to.bitkit.models.WidgetWithPosition
Expand All @@ -18,7 +18,7 @@ import to.bitkit.ui.screens.widgets.blocks.WeatherModel
@Stable
data class HomeUiState(
val suggestions: List<Suggestion> = listOf(),
val banners: List<ActivityBannerType> = listOf(),
val banners: List<BannerItem> = listOf(),
val showWidgets: Boolean = false,
val showWidgetTitles: Boolean = false,
val widgetsWithPosition: List<WidgetWithPosition> = emptyList(),
Expand Down
39 changes: 27 additions & 12 deletions app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import to.bitkit.data.SettingsStore
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import to.bitkit.R
import to.bitkit.models.ActivityBannerType
import to.bitkit.models.BannerItem
import to.bitkit.models.Suggestion
import to.bitkit.models.TransferType
import to.bitkit.models.WidgetType
Expand All @@ -29,6 +33,7 @@ import kotlin.time.Duration.Companion.seconds

@HiltViewModel
class HomeViewModel @Inject constructor(
@ApplicationContext private val context: Context,
private val walletRepo: WalletRepo,
private val widgetsRepo: WidgetsRepo,
private val settingsStore: SettingsStore,
Expand Down Expand Up @@ -215,18 +220,28 @@ class HomeViewModel @Inject constructor(
}

private suspend fun createBannersFlow() {
transferRepo.activeTransfers
.collect { transfers ->
val banners = listOfNotNull(
ActivityBannerType.SPENDING.takeIf {
transfers.any { it.type.isToSpending() }
},
ActivityBannerType.SAVINGS.takeIf {
transfers.any { it.type.isToSavings() }
},
)
_uiState.update { it.copy(banners = banners) }
}
combine(
transferRepo.activeTransfers,
walletRepo.balanceState,
) { transfers, balanceState ->
val defaultTitle = context.getString(R.string.lightning__transfer_in_progress)
val savingsTitle = balanceState.forceCloseRemainingDuration?.let {
context.getString(R.string.lightning__transfer_ready_in, it)
} ?: defaultTitle

listOfNotNull(
BannerItem(
type = ActivityBannerType.SPENDING,
title = defaultTitle,
).takeIf { transfers.any { it.type.isToSpending() } },
BannerItem(
type = ActivityBannerType.SAVINGS,
title = savingsTitle,
).takeIf { transfers.any { it.type.isToSavings() } },
)
}.collect { banners ->
_uiState.update { it.copy(banners = banners) }
}
}

private fun createSuggestionsFlow() = combine(
Expand Down
14 changes: 14 additions & 0 deletions app/src/main/java/to/bitkit/usecases/DeriveBalanceStateUseCase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import to.bitkit.data.entities.TransferEntity
import to.bitkit.ext.amountSats
import to.bitkit.ext.channelId
import to.bitkit.ext.totalNextOutboundHtlcLimitSats
import to.bitkit.utils.BlockTimeHelpers
import to.bitkit.models.BalanceState
import to.bitkit.models.TransferType
import to.bitkit.models.safe
Expand Down Expand Up @@ -39,13 +40,16 @@ class DeriveBalanceStateUseCase @Inject constructor(
val afterPendingChannels = balanceDetails.totalLightningBalanceSats.safe() - pendingChannelsSats.safe()
val totalLightningSats = afterPendingChannels.safe() - toSavingsAmount.safe()

val forceCloseRemainingDuration = getForceCloseRemainingDuration(activeTransfers)

val balanceState = BalanceState(
totalOnchainSats = totalOnchainSats,
totalLightningSats = totalLightningSats,
maxSendLightningSats = lightningRepo.getChannels().totalNextOutboundHtlcLimitSats(),
maxSendOnchainSats = getMaxSendAmount(balanceDetails),
balanceInTransferToSavings = toSavingsAmount,
balanceInTransferToSpending = toSpendingAmount,
forceCloseRemainingDuration = forceCloseRemainingDuration,
)

val height = lightningRepo.lightningState.value.block()?.height
Expand Down Expand Up @@ -116,6 +120,16 @@ class DeriveBalanceStateUseCase @Inject constructor(
return spendableOnchainSats.safe() - fee.safe()
}

private fun getForceCloseRemainingDuration(transfers: List<TransferEntity>): String? {
val forceClose = transfers.firstOrNull { it.type == TransferType.FORCE_CLOSE }
?: return null
val targetHeight = forceClose.claimableAtHeight ?: return null
val currentHeight = lightningRepo.lightningState.value.block()?.height ?: return null
val remaining = BlockTimeHelpers.blocksRemaining(targetHeight, currentHeight)
if (remaining <= 0) return null
return BlockTimeHelpers.getDurationForBlocks(remaining)
}

companion object {
const val TAG = "DeriveBalanceStateUseCase"
const val FALLBACK_FEE_PERCENT = 0.1
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@
<string name="lightning__transfer__nav_title">Transfer Funds</string>
<string name="lightning__transfer__swipe">Swipe To Transfer</string>
<string name="lightning__transfer_in_progress">TRANSFER IN PROGRESS</string>
<string name="lightning__transfer_ready_in">TRANSFER READY IN %s</string>
<string name="lightning__transfer_intro__button">Get Started</string>
<string name="lightning__transfer_intro__text">Fund your spending balance to enjoy instant and cheap transactions with friends, family, and merchants.</string>
<string name="lightning__transfer_intro__title">Spending\n&lt;accent&gt;Balance&lt;/accent&gt;</string>
Expand Down