11package to.bitkit.ui.screens.wallets.send
22
3+ import androidx.compose.foundation.layout.BoxWithConstraints
34import androidx.compose.foundation.layout.Column
45import androidx.compose.foundation.layout.Row
56import androidx.compose.foundation.layout.Spacer
@@ -8,7 +9,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
89import androidx.compose.foundation.layout.height
910import androidx.compose.foundation.layout.navigationBarsPadding
1011import androidx.compose.foundation.layout.padding
11- import androidx.compose.foundation.layout.width
12+ import androidx.compose.foundation.layout.sizeIn
1213import androidx.compose.material3.HorizontalDivider
1314import androidx.compose.runtime.Composable
1415import androidx.compose.runtime.getValue
@@ -19,6 +20,7 @@ import androidx.compose.ui.Alignment
1920import androidx.compose.ui.Modifier
2021import androidx.compose.ui.platform.testTag
2122import androidx.compose.ui.res.stringResource
23+ import androidx.compose.ui.tooling.preview.Devices.NEXUS_5
2224import androidx.compose.ui.tooling.preview.Preview
2325import androidx.compose.ui.unit.dp
2426import com.synonym.bitkitcore.LnurlPayData
@@ -34,6 +36,9 @@ import to.bitkit.ui.LocalBalances
3436import to.bitkit.ui.LocalCurrencies
3537import to.bitkit.ui.components.AmountInputHandler
3638import 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
3742import to.bitkit.ui.components.Keyboard
3843import to.bitkit.ui.components.MoneySSB
3944import to.bitkit.ui.components.NumberPadActionButton
@@ -42,6 +47,7 @@ import to.bitkit.ui.components.PrimaryButton
4247import to.bitkit.ui.components.SyncNodeView
4348import to.bitkit.ui.components.Text13Up
4449import to.bitkit.ui.components.UnitButton
50+ import to.bitkit.ui.components.VerticalSpacer
4551import to.bitkit.ui.currencyViewModel
4652import to.bitkit.ui.scaffold.SheetTopBar
4753import 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