Skip to content

Commit 5ca1acf

Browse files
committed
fix: set available height
1 parent 14800cd commit 5ca1acf

File tree

1 file changed

+127
-86
lines changed

1 file changed

+127
-86
lines changed

app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAmountScreen.kt

Lines changed: 127 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package to.bitkit.ui.screens.wallets.send
22

3+
import androidx.compose.foundation.layout.BoxWithConstraints
34
import androidx.compose.foundation.layout.Column
45
import androidx.compose.foundation.layout.Row
56
import androidx.compose.foundation.layout.Spacer
@@ -8,7 +9,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
89
import androidx.compose.foundation.layout.height
910
import androidx.compose.foundation.layout.navigationBarsPadding
1011
import androidx.compose.foundation.layout.padding
11-
import androidx.compose.foundation.layout.width
12+
import androidx.compose.foundation.layout.sizeIn
1213
import androidx.compose.material3.HorizontalDivider
1314
import androidx.compose.runtime.Composable
1415
import androidx.compose.runtime.getValue
@@ -19,6 +20,7 @@ import androidx.compose.ui.Alignment
1920
import androidx.compose.ui.Modifier
2021
import androidx.compose.ui.platform.testTag
2122
import androidx.compose.ui.res.stringResource
23+
import androidx.compose.ui.tooling.preview.Devices.NEXUS_5
2224
import androidx.compose.ui.tooling.preview.Preview
2325
import androidx.compose.ui.unit.dp
2426
import com.synonym.bitkitcore.LnurlPayData
@@ -34,6 +36,9 @@ import to.bitkit.ui.LocalBalances
3436
import to.bitkit.ui.LocalCurrencies
3537
import to.bitkit.ui.components.AmountInputHandler
3638
import to.bitkit.ui.components.BottomSheetPreview
39+
import to.bitkit.ui.components.FillHeight
40+
import to.bitkit.ui.components.FillWidth
41+
import to.bitkit.ui.components.HorizontalSpacer
3742
import to.bitkit.ui.components.Keyboard
3843
import to.bitkit.ui.components.MoneySSB
3944
import to.bitkit.ui.components.NumberPadActionButton
@@ -42,6 +47,7 @@ import to.bitkit.ui.components.PrimaryButton
4247
import to.bitkit.ui.components.SyncNodeView
4348
import to.bitkit.ui.components.Text13Up
4449
import to.bitkit.ui.components.UnitButton
50+
import to.bitkit.ui.components.VerticalSpacer
4551
import to.bitkit.ui.currencyViewModel
4652
import to.bitkit.ui.scaffold.SheetTopBar
4753
import to.bitkit.ui.shared.modifiers.sheetHeight
@@ -166,100 +172,107 @@ private fun SendAmountNodeRunning(
166172
onEvent: (SendEvent) -> Unit,
167173
onMaxClick: (Long) -> Unit,
168174
) {
169-
val isLnurlWithdraw = uiState.lnurl is LnurlParams.LnurlWithdraw
175+
BoxWithConstraints {
176+
val maxHeight = this.maxHeight
177+
val isLnurlWithdraw = uiState.lnurl is LnurlParams.LnurlWithdraw
170178

171-
val availableAmount = when {
172-
isLnurlWithdraw -> uiState.lnurl.data.maxWithdrawableSat().toLong()
173-
uiState.payMethod == SendMethod.ONCHAIN -> balances.totalOnchainSats.toLong()
174-
else -> balances.maxSendLightningSats.toLong()
175-
}
176-
177-
Column(
178-
modifier = Modifier.padding(horizontal = 16.dp)
179-
) {
180-
Spacer(Modifier.height(16.dp))
181-
182-
NumberPadTextField(
183-
input = input,
184-
displayUnit = displayUnit,
185-
primaryDisplay = primaryDisplay,
186-
modifier = Modifier
187-
.fillMaxWidth()
188-
.testTag("amount_input_field")
189-
)
190-
191-
Spacer(modifier = Modifier.height(24.dp))
192-
Spacer(modifier = Modifier.weight(1f))
193-
194-
val textAvailable = when {
195-
uiState.lnurl is LnurlParams.LnurlWithdraw -> R.string.wallet__lnurl_w_max
196-
uiState.isUnified -> R.string.wallet__send_available
197-
uiState.payMethod == SendMethod.ONCHAIN -> R.string.wallet__send_available_savings
198-
uiState.payMethod == SendMethod.LIGHTNING -> R.string.wallet__send_available_spending
199-
else -> R.string.wallet__send_available
179+
val availableAmount = when {
180+
isLnurlWithdraw -> uiState.lnurl.data.maxWithdrawableSat().toLong()
181+
uiState.payMethod == SendMethod.ONCHAIN -> balances.totalOnchainSats.toLong()
182+
else -> balances.maxSendLightningSats.toLong()
200183
}
201184

202-
Text13Up(
203-
text = stringResource(textAvailable),
204-
color = Colors.White64,
205-
modifier = Modifier.testTag("available_balance")
206-
)
207-
Spacer(modifier = Modifier.height(4.dp))
208-
209-
Row(
210-
verticalAlignment = Alignment.CenterVertically,
185+
Column(
186+
modifier = Modifier.padding(horizontal = 16.dp)
211187
) {
212-
// TODO add onClick -> override to max amount
213-
MoneySSB(sats = availableAmount)
188+
Spacer(Modifier.height(16.dp))
189+
190+
NumberPadTextField(
191+
input = input,
192+
displayUnit = displayUnit,
193+
primaryDisplay = primaryDisplay,
194+
modifier = Modifier
195+
.fillMaxWidth()
196+
.testTag("amount_input_field")
197+
)
214198

215-
Spacer(modifier = Modifier.weight(1f))
199+
FillHeight(min = 12.dp)
216200

217-
val isLnurl = uiState.lnurl != null
218-
if (!isLnurl) {
219-
PaymentMethodButton(uiState = uiState, onEvent = onEvent)
201+
val textAvailable = when {
202+
uiState.lnurl is LnurlParams.LnurlWithdraw -> R.string.wallet__lnurl_w_max
203+
uiState.isUnified -> R.string.wallet__send_available
204+
uiState.payMethod == SendMethod.ONCHAIN -> R.string.wallet__send_available_savings
205+
uiState.payMethod == SendMethod.LIGHTNING -> R.string.wallet__send_available_spending
206+
else -> R.string.wallet__send_available
220207
}
221-
if (uiState.lnurl is LnurlParams.LnurlPay) {
222-
val max = minOf(
223-
uiState.lnurl.data.maxSendableSat().toLong(),
224-
availableAmount,
225-
)
226-
NumberPadActionButton(
227-
text = stringResource(R.string.common__max),
228-
onClick = { onMaxClick(max) },
229-
modifier = Modifier
230-
.height(28.dp)
231-
.testTag("max_amount_button")
232-
)
208+
209+
Text13Up(
210+
text = stringResource(textAvailable),
211+
color = Colors.White64,
212+
modifier = Modifier.testTag("available_balance")
213+
)
214+
VerticalSpacer(4.dp)
215+
216+
Row(
217+
verticalAlignment = Alignment.CenterVertically,
218+
) {
219+
// TODO add onClick -> override to max amount
220+
MoneySSB(sats = availableAmount)
221+
222+
FillWidth()
223+
224+
val isLnurl = uiState.lnurl != null
225+
if (!isLnurl) {
226+
PaymentMethodButton(uiState = uiState, onEvent = onEvent)
227+
}
228+
if (uiState.lnurl is LnurlParams.LnurlPay) {
229+
val max = minOf(
230+
uiState.lnurl.data.maxSendableSat().toLong(),
231+
availableAmount,
232+
)
233+
NumberPadActionButton(
234+
text = stringResource(R.string.common__max),
235+
onClick = { onMaxClick(max) },
236+
modifier = Modifier
237+
.height(28.dp)
238+
.testTag("max_amount_button")
239+
)
240+
}
241+
HorizontalSpacer(8.dp)
242+
UnitButton(modifier = Modifier.height(28.dp))
233243
}
234-
Spacer(modifier = Modifier.width(8.dp))
235-
UnitButton(modifier = Modifier.height(28.dp))
236-
}
237244

238-
HorizontalDivider(modifier = Modifier.padding(vertical = 24.dp))
239-
240-
Keyboard(
241-
onClick = { number ->
242-
onInputChanged(if (input == "0") number else input + number)
243-
},
244-
onClickBackspace = {
245-
onInputChanged(if (input.length > 1) input.dropLast(1) else "0")
246-
},
247-
isDecimal = currencyUiState.primaryDisplay == PrimaryDisplay.FIAT,
248-
modifier = Modifier
249-
.fillMaxWidth()
250-
.testTag("amount_keyboard"),
251-
)
252-
253-
Spacer(modifier = Modifier.height(41.dp))
254-
255-
PrimaryButton(
256-
text = stringResource(R.string.common__continue),
257-
enabled = uiState.isAmountInputValid,
258-
onClick = { onEvent(SendEvent.AmountContinue(uiState.amountInput)) },
259-
modifier = Modifier.testTag("continue_button")
260-
)
261-
262-
Spacer(modifier = Modifier.height(16.dp))
245+
HorizontalDivider(modifier = Modifier.padding(vertical = 24.dp))
246+
247+
Keyboard(
248+
onClick = { number ->
249+
onInputChanged(if (input == "0") number else input + number)
250+
},
251+
onClickBackspace = {
252+
onInputChanged(if (input.length > 1) input.dropLast(1) else "0")
253+
},
254+
isDecimal = currencyUiState.primaryDisplay == PrimaryDisplay.FIAT,
255+
availableHeight = maxHeight,
256+
modifier = Modifier
257+
.fillMaxWidth()
258+
.testTag("amount_keyboard"),
259+
)
260+
261+
Spacer(
262+
modifier = Modifier
263+
.weight(1f)
264+
.sizeIn(minHeight = 16.dp, maxHeight = 41.dp)
265+
)
266+
267+
PrimaryButton(
268+
text = stringResource(R.string.common__continue),
269+
enabled = uiState.isAmountInputValid,
270+
onClick = { onEvent(SendEvent.AmountContinue(uiState.amountInput)) },
271+
modifier = Modifier.testTag("continue_button")
272+
)
273+
274+
VerticalSpacer(16.dp)
275+
}
263276
}
264277
}
265278

@@ -464,3 +477,31 @@ private fun PreviewLnurlPay() {
464477
}
465478
}
466479
}
480+
481+
482+
@Preview(showSystemUi = true, name = "Running - Short screen", device = NEXUS_5)
483+
@Composable
484+
private fun PreviewSmallScreen() {
485+
AppThemeSurface {
486+
BottomSheetPreview {
487+
SendAmountContent(
488+
uiState = SendUiState(
489+
payMethod = SendMethod.LIGHTNING,
490+
amountInput = "100",
491+
isAmountInputValid = true,
492+
isUnified = false
493+
),
494+
balances = BalanceState(totalSats = 150u, totalOnchainSats = 50u, maxSendLightningSats = 100u),
495+
walletUiState = MainUiState(nodeLifecycleState = NodeLifecycleState.Running),
496+
onBack = {},
497+
onEvent = {},
498+
input = "100",
499+
displayUnit = BitcoinDisplayUnit.MODERN,
500+
primaryDisplay = PrimaryDisplay.FIAT,
501+
currencyUiState = CurrencyUiState(),
502+
onInputChanged = {},
503+
modifier = Modifier.sheetHeight(),
504+
)
505+
}
506+
}
507+
}

0 commit comments

Comments
 (0)