feat(folio): show current balance on the add-transaction screen

renders the account's balance (testTag TxnCurrentBalance) below the
account name, above the credit/debit toggle, so before/after screenshots
carry comparison data.
This commit is contained in:
pj committed 2026-07-13 12:55:38 +05:30
1 parent 133ce17d72
commit e6b9f6db3c
2 files changed
+23 -2

No files matched your search

@@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -15,10 +16,12 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import app.folio.core.data.TxnType import app.folio.core.data.TxnType
import app.folio.di.LocalAppGraph import app.folio.di.LocalAppGraph
import app.folio.util.formatCents
import app.folio.ui.BackHandler import app.folio.ui.BackHandler
import app.folio.ui.component.AppButton import app.folio.ui.component.AppButton
import app.folio.ui.component.BackButton import app.folio.ui.component.BackButton
import app.folio.ui.component.ButtonStyle import app.folio.ui.component.ButtonStyle
import app.folio.ui.component.Card
import app.folio.ui.component.EmptyState import app.folio.ui.component.EmptyState
import app.folio.ui.component.ErrorText import app.folio.ui.component.ErrorText
import app.folio.ui.component.FieldLabel import app.folio.ui.component.FieldLabel
@@ -26,6 +29,7 @@ import app.folio.ui.component.Header
import app.folio.ui.component.Screen import app.folio.ui.component.Screen
import app.folio.ui.component.Segmented import app.folio.ui.component.Segmented
import app.folio.ui.component.TextInput import app.folio.ui.component.TextInput
import app.folio.ui.theme.LocalTokens
import app.folio.ui.theme.Type import app.folio.ui.theme.Type
@Composable @Composable
@@ -78,10 +82,20 @@ fun AddTransactionScreen(state: AddTransactionUiState, onEvent: (AddTransactionE
) )
}, },
) { ) {
val t = LocalTokens.current
Column( Column(
modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp),
verticalArrangement = Arrangement.spacedBy(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp),
) { ) {
Card {
Text("CURRENT BALANCE", style = Type.label, color = t.textMuted)
Text(
formatCents(state.balanceCents),
style = Type.balance,
color = t.text,
modifier = Modifier.testTag("TxnCurrentBalance"),
)
}
Segmented( Segmented(
selected = if (state.type == TxnType.credit) 0 else 1, selected = if (state.type == TxnType.credit) 0 else 1,
labels = listOf("Credit", "Debit"), labels = listOf("Credit", "Debit"),
@@ -7,6 +7,7 @@ import app.folio.core.data.Repository
import app.folio.core.data.TxnType import app.folio.core.data.TxnType
import app.folio.navigation.Navigator import app.folio.navigation.Navigator
import app.folio.navigation.Route import app.folio.navigation.Route
import app.folio.util.balanceOf
import app.folio.util.parseCents import app.folio.util.parseCents
import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory import dev.zacsweers.metro.AssistedFactory
@@ -24,6 +25,7 @@ private val AMOUNT_REGEX = Regex("""^\d*(\.\d{0,2})?$""")
data class AddTransactionUiState( data class AddTransactionUiState(
val account: Account? = null, val account: Account? = null,
val balanceCents: Long = 0,
val type: TxnType = TxnType.credit, val type: TxnType = TxnType.credit,
val amount: String = "", val amount: String = "",
val note: String = "", val note: String = "",
@@ -50,8 +52,13 @@ class AddTransactionViewModel(
val state: StateFlow<AddTransactionUiState> = combine( val state: StateFlow<AddTransactionUiState> = combine(
form, form,
repository.accounts.map { accounts -> accounts.firstOrNull { it.id == accountId } }, repository.accounts.map { accounts -> accounts.firstOrNull { it.id == accountId } },
) { f, account -> f.copy(account = account) } repository.transactions,
.stateIn(viewModelScope, SharingStarted.Eagerly, AddTransactionUiState()) ) { f, account, transactions ->
f.copy(
account = account,
balanceCents = balanceOf(transactions.filter { it.accountId == accountId }),
)
}.stateIn(viewModelScope, SharingStarted.Eagerly, AddTransactionUiState())
fun onEvent(event: AddTransactionEvent) { fun onEvent(event: AddTransactionEvent) {
when (event) { when (event) {