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

136 lines
4.0 KiB
Kotlin

package cash.z.ecc.android.sdk.demoapp.ui.screen.addresses.view
import androidx.compose.foundation.clickable
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.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import cash.z.ecc.android.sdk.Synchronizer
import cash.z.ecc.android.sdk.demoapp.R
import cash.z.ecc.android.sdk.demoapp.model.WalletAddresses
import kotlinx.coroutines.flow.flow
// @Preview
// @Composable
// fun ComposablePreview() {
// MaterialTheme {
// Addresses()
// }
// }
/**
* @param copyToClipboard First string is a tag, the second string is the text to copy.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Addresses(
synchronizer: Synchronizer,
copyToClipboard: (String, String) -> Unit,
onBack: () -> Unit
) {
Scaffold(topBar = {
AddressesTopAppBar(onBack)
}) { paddingValues ->
// TODO [#846]: Slow addresses providing
// TODO [#846]: https://github.com/zcash/zcash-android-wallet-sdk/issues/846
val walletAddresses = flow {
emit(WalletAddresses.new(synchronizer))
}.collectAsState(
initial = null
).value
if (null != walletAddresses) {
AddressesMainContent(
paddingValues = paddingValues,
addresses = walletAddresses,
copyToClipboard = copyToClipboard
)
}
}
}
@Composable
@OptIn(ExperimentalMaterial3Api::class)
private fun AddressesTopAppBar(onBack: () -> Unit) {
TopAppBar(
title = { Text(text = stringResource(id = R.string.menu_address)) },
navigationIcon = {
IconButton(
onClick = onBack
) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = null
)
}
}
)
}
@Composable
private fun AddressesMainContent(
paddingValues: PaddingValues,
addresses: WalletAddresses,
copyToClipboard: (String, String) -> Unit
) {
Column(
Modifier
.verticalScroll(rememberScrollState())
.padding(top = paddingValues.calculateTopPadding())
) {
Text(stringResource(id = R.string.unified_address))
addresses.unified.address.also { address ->
val tag = stringResource(id = R.string.unified_address)
Text(
address,
Modifier.clickable {
copyToClipboard(tag, address)
}
)
}
Spacer(Modifier.padding(8.dp))
Text(stringResource(id = R.string.sapling_address))
addresses.sapling.address.also { address ->
val tag = stringResource(id = R.string.sapling_address_tag)
Text(
address,
Modifier.clickable {
copyToClipboard(tag, address)
}
)
}
Spacer(Modifier.padding(8.dp))
Text(stringResource(id = R.string.transparent_address))
addresses.transparent.address.also { address ->
val tag = stringResource(id = R.string.transparent_address)
Text(
address,
Modifier.clickable {
copyToClipboard(tag, address)
}
)
}
}
}