secant-android-wallet/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/backup/view/ShortNewWalletBackupView.kt

160 lines
4.8 KiB
Kotlin

@file:Suppress("TooManyFunctions")
package co.electriccoin.zcash.ui.screen.backup.view
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
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.MoreVert
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
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.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Devices
import androidx.compose.ui.tooling.preview.Preview
import cash.z.ecc.android.sdk.model.PersistableWallet
import cash.z.ecc.sdk.fixture.PersistableWalletFixture
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.common.SecureScreen
import co.electriccoin.zcash.ui.design.component.Body
import co.electriccoin.zcash.ui.design.component.ChipGrid
import co.electriccoin.zcash.ui.design.component.GradientSurface
import co.electriccoin.zcash.ui.design.component.PrimaryButton
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import kotlinx.collections.immutable.toPersistentList
@Preview(device = Devices.PIXEL_4)
@Composable
fun ComposablePreviewShort() {
ZcashTheme(darkTheme = false) {
GradientSurface {
ShortNewWalletBackup(
PersistableWalletFixture.new(),
onCopyToClipboard = {},
onComplete = {},
)
}
}
}
/**
* @param onComplete Callback when the user has confirmed viewing the seed phrase.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ShortNewWalletBackup(
wallet: PersistableWallet,
onCopyToClipboard: () -> Unit,
onComplete: () -> Unit,
) {
Scaffold(
topBar = {
ShortNewWalletTopAppBar(
onCopyToClipboard = onCopyToClipboard,
)
},
bottomBar = {
ShortNewWalletBottomNav(
onComplete = onComplete,
)
}
) { paddingValues ->
ShortNewWalletMainContent(
paddingValues = paddingValues,
wallet = wallet,
)
}
}
@Composable
private fun ShortNewWalletMainContent(
paddingValues: PaddingValues,
wallet: PersistableWallet,
) {
Column(
Modifier
.padding(
top = paddingValues.calculateTopPadding(),
bottom = paddingValues.calculateBottomPadding()
)
) {
SeedPhrase(wallet)
}
}
@Composable
private fun SeedPhrase(persistableWallet: PersistableWallet) {
SecureScreen()
Column(
Modifier
.verticalScroll(rememberScrollState())
.padding(vertical = ZcashTheme.paddings.padding)
) {
Body(stringResource(R.string.new_wallet_short_body))
ChipGrid(persistableWallet.seedPhrase.split.toPersistentList())
}
}
@Composable
@OptIn(ExperimentalMaterial3Api::class)
private fun ShortNewWalletTopAppBar(
onCopyToClipboard: () -> Unit,
) {
TopAppBar(
title = { Text(text = stringResource(id = R.string.new_wallet_short_header)) },
actions = {
CopySeedMenu(onCopyToClipboard)
}
)
}
@Composable
private fun CopySeedMenu(onCopyToClipboard: () -> Unit) {
Column {
var expanded by rememberSaveable { mutableStateOf(false) }
IconButton(onClick = { expanded = true }) {
Icon(
Icons.Default.MoreVert,
contentDescription = stringResource(R.string.new_wallet_toolbar_more_button_content_description)
)
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
DropdownMenuItem(
text = { Text(stringResource(R.string.new_wallet_short_copy)) },
onClick = {
expanded = false
onCopyToClipboard()
}
)
}
}
}
@Suppress("LongParameterList")
@Composable
private fun ShortNewWalletBottomNav(
onComplete: () -> Unit
) {
Column {
PrimaryButton(onClick = onComplete, text = stringResource(R.string.new_wallet_short_button_finished))
}
}