demo: add new tab with copyable address

This commit is contained in:
Oscar Mira 2023-10-23 17:57:08 +02:00
parent 2bd227124a
commit e022a27f04
3 changed files with 76 additions and 10 deletions

View File

@ -7,19 +7,13 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Card import androidx.compose.material3.Card
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import im.molly.monero.Balance
import im.molly.monero.Ledger
import im.molly.monero.demo.data.model.WalletConfig
import im.molly.monero.demo.ui.theme.AppTheme
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@ -2,6 +2,7 @@ package im.molly.monero.demo.ui
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
@ -15,12 +16,14 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import im.molly.monero.Ledger import im.molly.monero.Ledger
import im.molly.monero.MoneroCurrency import im.molly.monero.MoneroCurrency
import im.molly.monero.PublicAddress import im.molly.monero.PublicAddress
import im.molly.monero.demo.data.model.WalletConfig import im.molly.monero.demo.data.model.WalletConfig
import im.molly.monero.demo.ui.component.CopyableText
import im.molly.monero.demo.ui.component.Toolbar import im.molly.monero.demo.ui.component.Toolbar
import im.molly.monero.demo.ui.preview.PreviewParameterData import im.molly.monero.demo.ui.preview.PreviewParameterData
import im.molly.monero.demo.ui.theme.AppIcons import im.molly.monero.demo.ui.theme.AppIcons
@ -114,18 +117,53 @@ private fun WalletScreenLoaded(
var selectedTabIndex by rememberSaveable { mutableStateOf(0) } var selectedTabIndex by rememberSaveable { mutableStateOf(0) }
WalletHeaderTabs( WalletHeaderTabs(
titles = listOf("Balance", "Transactions"), titles = listOf("Balance", "Send", "Receive", "History"),
selectedTabIndex = selectedTabIndex, selectedTabIndex = selectedTabIndex,
onTabSelected = { index -> selectedTabIndex = index }, onTabSelected = { index -> selectedTabIndex = index },
) )
when (selectedTabIndex) { when (selectedTabIndex) {
0 -> { 0 -> {
WalletBalanceView(balance = uiState.balance, blockchainTime = uiState.blockchainTime) WalletBalanceView(
balance = uiState.balance,
blockchainTime = uiState.blockchainTime
)
} }
1 -> { 1 -> {} // TODO
LazyColumn {
2 -> {
Column(
modifier = modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text(
text = "Primary address",
style = MaterialTheme.typography.labelMedium,
)
CopyableText(
text = uiState.config.publicAddress,
style = MaterialTheme.typography.bodyMedium,
)
}
}
3 -> {
val scrollState = rememberLazyListState()
var lastTxId by remember { mutableStateOf("") }
lastTxId = uiState.transactions.firstOrNull()?.transaction?.txId ?: ""
LaunchedEffect(lastTxId) {
if (uiState.transactions.isNotEmpty()) {
scrollState.scrollToItem(0)
}
}
LazyColumn(
state = scrollState,
) {
transactionCardItems( transactionCardItems(
items = uiState.transactions, items = uiState.transactions,
onTransactionClick = onTransactionClick, onTransactionClick = onTransactionClick,

View File

@ -0,0 +1,34 @@
package im.molly.monero.demo.ui.component
import android.widget.Toast
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.combinedClickable
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.TextStyle
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun CopyableText(
text: String,
style: TextStyle,
) {
val context = LocalContext.current
val clipboardManager = LocalClipboardManager.current
Text(
text = text,
style = style,
modifier = Modifier.combinedClickable(
onClick = {},
onLongClick = {
clipboardManager.setText(AnnotatedString(text))
Toast.makeText(context, "Text copied to clipboard", Toast.LENGTH_SHORT).show()
},
),
)
}