Skip to content
13 changes: 10 additions & 3 deletions app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import to.bitkit.ext.removeSpaces
import to.bitkit.ext.toLongOrDefault
import to.bitkit.models.BITCOIN_SYMBOL
Expand All @@ -39,6 +40,7 @@ fun NumberPadTextField(
displayUnit: BitcoinDisplayUnit,
primaryDisplay: PrimaryDisplay,
modifier: Modifier = Modifier,
showSecondaryField: Boolean = true,
) {
val isPreview = LocalInspectionMode.current
if (isPreview) {
Expand All @@ -48,6 +50,7 @@ fun NumberPadTextField(
unit = primaryDisplay,
placeholder = "",
showPlaceholder = true,
showSecondaryField = showSecondaryField,
satoshis = 0,
currencySymbol = if (primaryDisplay == PrimaryDisplay.BITCOIN) BITCOIN_SYMBOL else "$"
)
Expand Down Expand Up @@ -129,6 +132,7 @@ fun NumberPadTextField(
value = value,
unit = primaryDisplay,
placeholder = placeholder,
showSecondaryField = showSecondaryField,
showPlaceholder = true,
satoshis = satoshis.toLongOrNull() ?: 0,
currencySymbol = currency.getCurrencySymbol()
Expand All @@ -142,7 +146,7 @@ fun AmountInputHandler(
displayUnit: BitcoinDisplayUnit,
onInputChanged: (String) -> Unit,
onAmountCalculated: (String) -> Unit,
currencyVM: CurrencyViewModel,
currencyVM: CurrencyViewModel = hiltViewModel(),
overrideSats: Long? = null,
) {
var lastDisplay by rememberSaveable { mutableStateOf(primaryDisplay) }
Expand Down Expand Up @@ -219,14 +223,17 @@ fun MoneyAmount(
showPlaceholder: Boolean,
satoshis: Long,
currencySymbol: String,
showSecondaryField: Boolean = true,
) {
Column(
modifier = modifier.semantics { contentDescription = value },
horizontalAlignment = Alignment.Start
) {
MoneySSB(sats = satoshis, unit = unit.not(), color = Colors.White64)
if (showSecondaryField) {
MoneySSB(sats = satoshis, unit = unit.not(), color = Colors.White64)

Spacer(modifier = Modifier.height(12.dp))
Spacer(modifier = Modifier.height(12.dp))
}

Row(
verticalAlignment = Alignment.CenterVertically
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/to/bitkit/ui/components/Text.kt
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,14 @@ fun Title(
text: String,
modifier: Modifier = Modifier,
color: Color = MaterialTheme.colorScheme.primary,
maxLines: Int = Int.MAX_VALUE,
overflow: TextOverflow = TextOverflow.Ellipsis,
textAlign: TextAlign = TextAlign.Unspecified,
) {
Text(
text = text,
maxLines = maxLines,
overflow = overflow,
style = AppTextStyles.Title.merge(
color = color,
textAlign = textAlign,
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/to/bitkit/ui/scaffold/AppTopBar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ fun AppTopBar(
.size(32.dp)
)
}
Title(text = titleText)
Title(text = titleText, maxLines = 1)
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
Expand All @@ -16,17 +17,22 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Devices.NEXUS_5
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import okhttp3.internal.toLongOrDefault
import to.bitkit.R
import to.bitkit.models.PrimaryDisplay
import to.bitkit.ui.LocalCurrencies
import to.bitkit.ui.components.AmountInput
import to.bitkit.ui.components.AmountInputHandler
import to.bitkit.ui.components.Display
import to.bitkit.ui.components.FillHeight
import to.bitkit.ui.components.FillWidth
import to.bitkit.ui.components.Keyboard
import to.bitkit.ui.components.MoneySSB
import to.bitkit.ui.components.NumberPadActionButton
import to.bitkit.ui.components.NumberPadTextField
import to.bitkit.ui.components.PrimaryButton
import to.bitkit.ui.components.Text13Up
import to.bitkit.ui.components.UnitButton
Expand Down Expand Up @@ -68,6 +74,17 @@
}
}

AmountInputHandler(
input = uiState.input,
overrideSats = uiState.overrideSats,
primaryDisplay = currencies.primaryDisplay,
displayUnit = currencies.displayUnit,
onInputChanged = viewModel::onInputChanged,
onAmountCalculated = { sats ->
viewModel.handleCalculatedAmount(sats.toLongOrDefault(0))
},
)

Content(
uiState = uiState,
currencies = currencies,
Expand All @@ -76,7 +93,7 @@
onClickQuarter = viewModel::onClickQuarter,
onClickMaxAmount = viewModel::onClickMaxAmount,
onConfirmAmount = viewModel::onConfirmAmount,
onAmountChanged = viewModel::onAmountChanged
onInputChanged = viewModel::onInputChanged,
)
}

Expand All @@ -89,7 +106,7 @@
onClickQuarter: () -> Unit,
onClickMaxAmount: () -> Unit,
onConfirmAmount: () -> Unit,
onAmountChanged: (Long) -> Unit,
onInputChanged: (String) -> Unit,
) {
ScreenColumn {
AppTopBar(
Expand All @@ -104,17 +121,21 @@
.imePadding()
.testTag("SpendingAmount")
) {
VerticalSpacer(32.dp)
VerticalSpacer(16.dp)
Display(
text = stringResource(R.string.lightning__spending_amount__title)
.withAccent(accentColor = Colors.Purple)
)
VerticalSpacer(32.dp)
VerticalSpacer(4.dp)

AmountInput(
NumberPadTextField(
input = uiState.input,
displayUnit = currencies.displayUnit,
showSecondaryField = false,
primaryDisplay = currencies.primaryDisplay,
overrideSats = uiState.overrideSats,
onSatsChange = onAmountChanged,
modifier = Modifier
.fillMaxWidth()
// .testTag("SendNumberField")
)

FillHeight()
Expand Down Expand Up @@ -151,8 +172,24 @@
)
}
HorizontalDivider()

VerticalSpacer(16.dp)

Keyboard(
onClick = { number ->
onInputChanged(if (uiState.input == "0") number else uiState.input + number)
},
onClickBackspace = {
onInputChanged(if (uiState.input.length > 1) uiState.input.dropLast(1) else "0")
},
isDecimal = currencies.primaryDisplay == PrimaryDisplay.FIAT,
// availableHeight = maxHeight,
modifier = Modifier
.fillMaxWidth()
)

VerticalSpacer(8.dp)

PrimaryButton(
text = stringResource(R.string.common__continue),
onClick = onConfirmAmount,
Expand All @@ -171,14 +208,31 @@
private fun Preview() {
AppThemeSurface {
Content(
uiState = TransferToSpendingUiState(),
uiState = TransferToSpendingUiState(input = "5 000"),
currencies = CurrencyUiState(),
onBackClick = {},
onCloseClick = {},
onClickQuarter = {},
onClickMaxAmount = {},
onConfirmAmount = {},
onInputChanged = {},
)
}
}

@Preview(showBackground = true, device = NEXUS_5)
@Composable
private fun Preview2() {
AppThemeSurface {
Content(
uiState = TransferToSpendingUiState(input = "5 000"),
currencies = CurrencyUiState(),
onBackClick = {},
onCloseClick = {},
onClickQuarter = {},
onClickMaxAmount = {},
onConfirmAmount = {},
onAmountChanged = {},
onInputChanged = {},
)
}
}
7 changes: 6 additions & 1 deletion app/src/main/java/to/bitkit/viewmodels/TransferViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,11 @@ class TransferViewModel @Inject constructor(
}
}

fun onAmountChanged(sats: Long) {
fun onInputChanged(newInput: String) {
_spendingUiState.update { it.copy(input = newInput) }
}

fun handleCalculatedAmount(sats: Long) {
if (sats > _spendingUiState.value.maxAllowedToSend) {
setTransferEffect(
TransferEffect.ToastError(
Expand Down Expand Up @@ -545,6 +549,7 @@ data class TransferToSpendingUiState(
val maxAllowedToSend: Long = 0,
val balanceAfterFee: Long = 0,
val isLoading: Boolean = false,
val input: String = "",
)

data class TransferValues(
Expand Down