zcash-android-wallet-sdk/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/ui/screen/balance/view/BalanceView.kt

166 lines
5.2 KiB
Kotlin

package cash.z.ecc.android.sdk.demoapp.ui.screen.balance.view
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.outlined.Autorenew
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import cash.z.ecc.android.sdk.demoapp.R
import cash.z.ecc.android.sdk.demoapp.fixture.WalletSnapshotFixture
import cash.z.ecc.android.sdk.demoapp.ui.screen.home.viewmodel.SendState
import cash.z.ecc.android.sdk.demoapp.ui.screen.home.viewmodel.WalletSnapshot
import cash.z.ecc.android.sdk.model.toZecString
@Preview(name = "Balance")
@Suppress("ktlint:standard:function-naming")
@Composable
private fun ComposablePreview() {
MaterialTheme {
Balance(
walletSnapshot = WalletSnapshotFixture.new(),
sendState = SendState.None,
onBack = {},
onShieldFunds = {},
onRefresh = {}
)
}
}
@Composable
@Suppress("ktlint:standard:function-naming")
fun Balance(
walletSnapshot: WalletSnapshot,
sendState: SendState,
onShieldFunds: () -> Unit,
onBack: () -> Unit,
onRefresh: () -> Unit
) {
Scaffold(topBar = {
BalanceTopAppBar(
onBack,
onRefresh
)
}) { paddingValues ->
BalanceMainContent(
paddingValues = paddingValues,
walletSnapshot,
sendState,
onShieldFunds = onShieldFunds
)
}
}
@Composable
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("ktlint:standard:function-naming")
private fun BalanceTopAppBar(
onBack: () -> Unit,
onRefresh: () -> Unit
) {
TopAppBar(
title = { Text(text = stringResource(id = R.string.menu_balance)) },
navigationIcon = {
IconButton(
onClick = onBack
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = null
)
}
},
actions = {
IconButton(onClick = onRefresh) {
Icon(
imageVector = Icons.Outlined.Autorenew,
contentDescription = stringResource(id = R.string.balances_refresh)
)
}
}
)
}
@Composable
@Suppress("ktlint:standard:function-naming")
private fun BalanceMainContent(
paddingValues: PaddingValues,
walletSnapshot: WalletSnapshot,
sendState: SendState,
onShieldFunds: () -> Unit
) {
Column(
Modifier
.verticalScroll(rememberScrollState())
.padding(top = paddingValues.calculateTopPadding())
) {
Text(stringResource(id = R.string.balance_orchard))
Text(
stringResource(
id = R.string.balance_available_amount_format,
walletSnapshot.orchardBalance.available.toZecString()
)
)
Text(
stringResource(
id = R.string.balance_pending_amount_format,
walletSnapshot.orchardBalance.pending.toZecString()
)
)
Spacer(Modifier.padding(8.dp))
Text(stringResource(id = R.string.balance_sapling))
Text(
stringResource(
id = R.string.balance_available_amount_format,
walletSnapshot.saplingBalance.available.toZecString()
)
)
Text(
stringResource(
id = R.string.balance_pending_amount_format,
walletSnapshot.saplingBalance.pending.toZecString()
)
)
Spacer(Modifier.padding(8.dp))
Text(stringResource(id = R.string.balance_transparent))
Text(
stringResource(
id = R.string.balance_available_amount_format,
walletSnapshot.transparentBalance.toZecString()
)
)
// This check is not entirely correct - it does not calculate the resulting fee with the new Proposal API
if (walletSnapshot.transparentBalance.value > 0L) {
// Note this implementation does not guard against multiple clicks
Button(onClick = onShieldFunds) {
Text(stringResource(id = R.string.action_shield))
}
}
// Eventually there should be something to clear the status
Text(stringResource(id = R.string.send_status, sendState.toString()))
}
}