2023-05-02 13:32:09 -07:00
|
|
|
package cash.z.ecc.android.sdk.demoapp.ui.screen.transactions.view
|
|
|
|
|
|
|
|
import androidx.compose.foundation.layout.Column
|
|
|
|
import androidx.compose.foundation.layout.PaddingValues
|
|
|
|
import androidx.compose.foundation.layout.fillMaxHeight
|
|
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
|
|
import androidx.compose.foundation.layout.padding
|
|
|
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
|
|
import androidx.compose.foundation.lazy.items
|
|
|
|
import androidx.compose.material.icons.Icons
|
|
|
|
import androidx.compose.material.icons.filled.ArrowBack
|
2023-08-16 04:17:00 -07:00
|
|
|
import androidx.compose.material.icons.outlined.Autorenew
|
2023-05-02 13:32:09 -07:00
|
|
|
import androidx.compose.material3.Button
|
|
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
|
|
import androidx.compose.material3.Icon
|
|
|
|
import androidx.compose.material3.IconButton
|
2023-06-22 07:19:13 -07:00
|
|
|
import androidx.compose.material3.MaterialTheme
|
2023-05-02 13:32:09 -07:00
|
|
|
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.runtime.rememberCoroutineScope
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
import androidx.compose.ui.res.stringResource
|
2023-06-22 07:19:13 -07:00
|
|
|
import androidx.compose.ui.tooling.preview.Preview
|
2023-05-02 13:32:09 -07:00
|
|
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
2023-08-16 04:17:00 -07:00
|
|
|
import cash.z.ecc.android.sdk.SdkSynchronizer
|
2023-05-02 13:32:09 -07:00
|
|
|
import cash.z.ecc.android.sdk.Synchronizer
|
|
|
|
import cash.z.ecc.android.sdk.demoapp.R
|
2023-07-31 02:37:03 -07:00
|
|
|
import cash.z.ecc.android.sdk.internal.Twig
|
2023-05-02 13:32:09 -07:00
|
|
|
import cash.z.ecc.android.sdk.model.TransactionOverview
|
|
|
|
import cash.z.ecc.android.sdk.model.WalletAddresses
|
|
|
|
import kotlinx.coroutines.flow.flow
|
|
|
|
import kotlinx.coroutines.flow.toList
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
2023-06-22 07:19:13 -07:00
|
|
|
@Preview(name = "Transactions")
|
|
|
|
@Composable
|
|
|
|
private fun ComposablePreview() {
|
|
|
|
MaterialTheme {
|
|
|
|
// TODO [#1090]: Demo: Add Addresses and Transactions Compose Previews
|
|
|
|
// TODO [#1090]: https://github.com/zcash/zcash-android-wallet-sdk/issues/1090
|
|
|
|
// Transactions()
|
|
|
|
}
|
|
|
|
}
|
2023-05-02 13:32:09 -07:00
|
|
|
|
|
|
|
@Composable
|
|
|
|
fun Transactions(
|
|
|
|
synchronizer: Synchronizer,
|
|
|
|
onBack: () -> Unit
|
|
|
|
) {
|
|
|
|
Scaffold(
|
2023-08-16 04:17:00 -07:00
|
|
|
topBar = {
|
|
|
|
TransactionsTopAppBar(
|
|
|
|
onBack,
|
|
|
|
onRefresh = {
|
|
|
|
(synchronizer as SdkSynchronizer).refreshTransactions()
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
2023-05-02 13:32:09 -07:00
|
|
|
) { 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) {
|
|
|
|
TransactionsMainContent(
|
|
|
|
paddingValues = paddingValues,
|
|
|
|
synchronizer,
|
2023-05-05 14:46:07 -07:00
|
|
|
synchronizer.transactions.collectAsStateWithLifecycle(initialValue = emptyList()).value
|
2023-05-02 13:32:09 -07:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
2023-08-16 04:17:00 -07:00
|
|
|
private fun TransactionsTopAppBar(
|
|
|
|
onBack: () -> Unit,
|
|
|
|
onRefresh: () -> Unit
|
|
|
|
) {
|
2023-05-02 13:32:09 -07:00
|
|
|
TopAppBar(
|
|
|
|
title = { Text(text = stringResource(id = R.string.menu_transactions)) },
|
|
|
|
navigationIcon = {
|
|
|
|
IconButton(
|
|
|
|
onClick = onBack
|
|
|
|
) {
|
|
|
|
Icon(
|
|
|
|
imageVector = Icons.Filled.ArrowBack,
|
|
|
|
contentDescription = null
|
|
|
|
)
|
|
|
|
}
|
2023-08-16 04:17:00 -07:00
|
|
|
},
|
|
|
|
actions = {
|
|
|
|
IconButton(onClick = onRefresh) {
|
|
|
|
Icon(
|
|
|
|
imageVector = Icons.Outlined.Autorenew,
|
|
|
|
contentDescription = stringResource(id = R.string.transactions_refresh)
|
|
|
|
)
|
|
|
|
}
|
2023-05-02 13:32:09 -07:00
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
private fun TransactionsMainContent(
|
|
|
|
paddingValues: PaddingValues,
|
|
|
|
synchronizer: Synchronizer,
|
|
|
|
transactions: List<TransactionOverview>
|
|
|
|
) {
|
|
|
|
val queryScope = rememberCoroutineScope()
|
|
|
|
Column(
|
|
|
|
Modifier
|
|
|
|
.padding(top = paddingValues.calculateTopPadding())
|
|
|
|
) {
|
|
|
|
LazyColumn(
|
|
|
|
Modifier
|
|
|
|
.fillMaxWidth()
|
|
|
|
.fillMaxHeight()
|
|
|
|
) {
|
|
|
|
items(transactions) {
|
|
|
|
Button({
|
|
|
|
val memos = synchronizer.getMemos(it)
|
|
|
|
queryScope.launch {
|
2023-07-31 04:34:41 -07:00
|
|
|
memos.toList().run {
|
|
|
|
Twig.debug {
|
|
|
|
"Transaction memos: count: $size, contains: ${joinToString().ifEmpty { "-" }}"
|
2023-07-31 02:37:03 -07:00
|
|
|
}
|
2023-05-02 13:32:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}) {
|
|
|
|
val time = kotlinx.datetime.Instant.fromEpochSeconds(it.blockTimeEpochSeconds)
|
|
|
|
val value = if (it.isSentTransaction) {
|
|
|
|
-it.netValue.value
|
|
|
|
} else {
|
|
|
|
it.netValue.value
|
|
|
|
}
|
|
|
|
Text("$time, $value")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|