Skip to content

Commit a72fefe

Browse files
authored
Merge pull request #92 from synonymdev/fix/on-chain-validation-amount
Fix: Update input with low onchain values
2 parents 0c8fd71 + 8a1e675 commit a72fefe

File tree

5 files changed

+84
-23
lines changed

5 files changed

+84
-23
lines changed

app/src/androidTest/java/to/bitkit/ui/components/KeyboardTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class KeyboardTest {
2525
@Test
2626
fun keyboard_displaysAllButtons() {
2727
composeTestRule.setContent {
28-
Keyboard(onClick = {})
28+
Keyboard(onClick = {}, onClickBackspace = {})
2929
}
3030

3131
composeTestRule.onNodeWithTag("KeyboardButton_1").assertIsDisplayed()
@@ -39,21 +39,21 @@ class KeyboardTest {
3939
composeTestRule.onNodeWithTag("KeyboardButton_9").assertIsDisplayed()
4040
composeTestRule.onNodeWithTag("KeyboardButton_.").assertIsDisplayed()
4141
composeTestRule.onNodeWithTag("KeyboardButton_0").assertIsDisplayed()
42-
composeTestRule.onNodeWithTag("KeyboardButton_").assertIsDisplayed()
42+
composeTestRule.onNodeWithTag("KeyboardButton_backspace").assertIsDisplayed()
4343
}
4444

4545
@Test
4646
fun keyboard_tripleZero_when_not_decimal() {
4747
composeTestRule.setContent {
48-
Keyboard(onClick = {}, isDecimal = false)
48+
Keyboard(onClick = {}, isDecimal = false, onClickBackspace = {})
4949
}
5050
composeTestRule.onNodeWithTag("KeyboardButton_000").assertIsDisplayed()
5151
}
5252

5353
@Test
5454
fun keyboard_decimal_when_decimal() {
5555
composeTestRule.setContent {
56-
Keyboard(onClick = {}, isDecimal = true)
56+
Keyboard(onClick = {}, isDecimal = true, onClickBackspace = {})
5757
}
5858
composeTestRule.onNodeWithTag("KeyboardButton_.").assertIsDisplayed()
5959
}
@@ -62,7 +62,7 @@ class KeyboardTest {
6262
fun keyboard_button_click_triggers_callback() {
6363
var clickedValue = ""
6464
composeTestRule.setContent {
65-
Keyboard(onClick = { clickedValue = it })
65+
Keyboard(onClick = { clickedValue = it }, onClickBackspace = {})
6666
}
6767

6868
composeTestRule.onNodeWithTag("KeyboardButton_5").performClick()
@@ -80,7 +80,7 @@ class KeyboardTest {
8080
fun keyboard_button_click_tripleZero() {
8181
var clickedValue = ""
8282
composeTestRule.setContent {
83-
Keyboard(onClick = { clickedValue = it }, isDecimal = false)
83+
Keyboard(onClick = { clickedValue = it }, onClickBackspace = {}, isDecimal = false)
8484
}
8585

8686
composeTestRule.onNodeWithTag("KeyboardButton_000").performClick()

app/src/main/java/to/bitkit/ui/components/Keyboard.kt

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,34 @@ import androidx.compose.foundation.layout.Column
66
import androidx.compose.foundation.layout.fillMaxSize
77
import androidx.compose.foundation.layout.fillMaxWidth
88
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.layout.sizeIn
910
import androidx.compose.foundation.lazy.grid.GridCells
1011
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
12+
import androidx.compose.material3.Icon
1113
import androidx.compose.material3.Text
1214
import androidx.compose.runtime.Composable
1315
import androidx.compose.ui.Modifier
1416
import androidx.compose.ui.platform.testTag
17+
import androidx.compose.ui.res.painterResource
18+
import androidx.compose.ui.res.stringResource
1519
import androidx.compose.ui.text.TextStyle
1620
import androidx.compose.ui.text.font.FontWeight
1721
import androidx.compose.ui.text.style.TextAlign
1822
import androidx.compose.ui.tooling.preview.Devices
1923
import androidx.compose.ui.tooling.preview.Preview
2024
import androidx.compose.ui.unit.dp
2125
import androidx.compose.ui.unit.sp
26+
import to.bitkit.R
2227
import to.bitkit.ui.theme.AppThemeSurface
2328
import to.bitkit.ui.theme.Colors
2429
import to.bitkit.ui.theme.InterFontFamily
2530

2631
@Composable
2732
fun Keyboard(
2833
onClick: (String) -> Unit,
29-
isDecimal: Boolean = true,
30-
modifier: Modifier = Modifier
34+
onClickBackspace: () -> Unit,
35+
modifier: Modifier = Modifier,
36+
isDecimal: Boolean = true
3137
) {
3238
LazyVerticalGrid(
3339
verticalArrangement = Arrangement.spacedBy(34.dp),
@@ -45,7 +51,17 @@ fun Keyboard(
4551
item { KeyboardButton(text = "9", onClick = onClick) }
4652
item { KeyboardButton(text = if (isDecimal) "." else "000", onClick = onClick) }
4753
item { KeyboardButton(text = "0", onClick = onClick) }
48-
item { KeyboardButton(text = "", onClick = onClick) }
54+
item {
55+
Icon(
56+
painter = painterResource(R.drawable.ic_backspace),
57+
contentDescription = stringResource(R.string.common__delete),
58+
modifier = Modifier
59+
.sizeIn(minHeight = 30.dp)
60+
.padding(vertical = 4.dp)
61+
.clickable(onClick = onClickBackspace)
62+
.testTag("KeyboardButton_backspace")
63+
)
64+
}
4965
}
5066
}
5167

@@ -65,12 +81,14 @@ private fun KeyboardButton(
6581
textAlign = TextAlign.Center,
6682
color = Colors.White,
6783
),
68-
modifier = Modifier.clickable(
69-
onClick = {
70-
onClick(text)
71-
},
72-
onClickLabel = text
73-
).testTag("KeyboardButton_$text"),
84+
modifier = Modifier
85+
.clickable(
86+
onClick = {
87+
onClick(text)
88+
},
89+
onClickLabel = text
90+
)
91+
.testTag("KeyboardButton_$text"),
7492
)
7593
}
7694

@@ -79,7 +97,10 @@ private fun KeyboardButton(
7997
private fun Preview() {
8098
AppThemeSurface {
8199
Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom) {
82-
Keyboard(modifier = Modifier.fillMaxWidth().padding(41.dp), onClick = {})
100+
Keyboard(
101+
modifier = Modifier
102+
.fillMaxWidth()
103+
.padding(41.dp), onClick = {}, onClickBackspace = {})
83104
}
84105
}
85106
}
@@ -89,7 +110,13 @@ private fun Preview() {
89110
private fun Preview2() {
90111
AppThemeSurface {
91112
Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom) {
92-
Keyboard(isDecimal = false, modifier = Modifier.fillMaxWidth().padding(41.dp), onClick = {})
113+
Keyboard(
114+
isDecimal = false,
115+
modifier = Modifier
116+
.fillMaxWidth()
117+
.padding(41.dp),
118+
onClick = {},
119+
onClickBackspace = {})
93120
}
94121
}
95122
}
@@ -99,7 +126,13 @@ private fun Preview2() {
99126
private fun Preview3() {
100127
AppThemeSurface {
101128
Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom) {
102-
Keyboard(isDecimal = false, modifier = Modifier.fillMaxWidth().padding(41.dp), onClick = {})
129+
Keyboard(
130+
isDecimal = false,
131+
modifier = Modifier
132+
.fillMaxWidth()
133+
.padding(41.dp),
134+
onClick = {},
135+
onClickBackspace = {})
103136
}
104137
}
105138
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.res.stringResource
1616
import androidx.compose.ui.tooling.preview.Preview
1717
import androidx.compose.ui.unit.dp
18+
import okhttp3.internal.toLongOrDefault
1819
import to.bitkit.R
1920
import to.bitkit.models.NodeLifecycleState
2021
import to.bitkit.models.PrimaryDisplay
@@ -63,7 +64,7 @@ fun SendAmountScreen(
6364
Column(
6465
modifier = Modifier.padding(horizontal = 16.dp)
6566
) {
66-
BalanceHeaderView(sats = uiState.amountInput.toLong(), modifier = Modifier.fillMaxWidth())
67+
BalanceHeaderView(sats = uiState.amountInput.toLongOrDefault(0), modifier = Modifier.fillMaxWidth())
6768

6869
Spacer(modifier = Modifier.height(24.dp))
6970

@@ -117,6 +118,7 @@ fun SendAmountScreen(
117118

118119
Keyboard(
119120
onClick = { number -> onEvent(SendEvent.AmountChange(number)) },
121+
onClickBackspace = { onEvent(SendEvent.BackSpaceClick) },
120122
isDecimal = currencyUiState.primaryDisplay == PrimaryDisplay.FIAT,
121123
modifier = Modifier.fillMaxWidth(),
122124
)

app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ class AppViewModel @Inject constructor(
234234

235235
SendEvent.SpeedAndFee -> toast(Exception("Coming soon: Speed and Fee"))
236236
SendEvent.SwipeToPay -> onPay()
237+
SendEvent.BackSpaceClick -> onClickBackspace()
237238
}
238239
}
239240
}
@@ -276,11 +277,22 @@ class AppViewModel @Inject constructor(
276277

277278
private fun onAmountChange(value: String) {
278279
val newInput = if (_sendUiState.value.amountInput == "0") value else _sendUiState.value.amountInput + value
279-
val isAmountValid = validateAmount(newInput)
280-
if (isAmountValid) {
281-
_sendUiState.update { it.copy( amountInput = newInput,) }
280+
_sendUiState.update {
281+
it.copy(
282+
amountInput = newInput,
283+
isAmountInputValid = validateAmount(newInput)
284+
)
285+
}
286+
}
287+
288+
private fun onClickBackspace() {
289+
val newInput = if (_sendUiState.value.amountInput.length <= 1) "0" else _sendUiState.value.amountInput.dropLast(1)
290+
_sendUiState.update {
291+
it.copy(
292+
amountInput = newInput,
293+
isAmountInputValid = validateAmount(newInput)
294+
)
282295
}
283-
_sendUiState.update { it.copy(isAmountInputValid = isAmountValid,) }
284296
}
285297

286298
private fun onPaymentMethodSwitch() {
@@ -773,6 +785,7 @@ sealed class SendEvent {
773785
data object AmountReset : SendEvent()
774786
data class AmountContinue(val amount: String) : SendEvent()
775787
data class AmountChange(val value: String) : SendEvent()
788+
data object BackSpaceClick : SendEvent()
776789

777790
data object SwipeToPay : SendEvent()
778791
data object SpeedAndFee : SendEvent()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="18dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="18">
6+
<path
7+
android:pathData="M11.214,6.525C10.922,6.232 10.922,5.757 11.214,5.464C11.507,5.172 11.982,5.172 12.275,5.464L14.75,7.939L17.225,5.464C17.518,5.172 17.993,5.172 18.285,5.464C18.578,5.757 18.578,6.232 18.285,6.525L15.811,9L18.285,11.475C18.578,11.768 18.578,12.243 18.285,12.535C17.993,12.828 17.518,12.828 17.225,12.535L14.75,10.061L12.275,12.535C11.982,12.828 11.507,12.828 11.215,12.535C10.922,12.243 10.922,11.768 11.215,11.475L13.689,9L11.214,6.525Z"
8+
android:fillColor="#ffffff"/>
9+
<path
10+
android:pathData="M8.121,1.379L0.5,9L8.121,16.621C8.684,17.184 9.447,17.5 10.243,17.5H20.5C22.157,17.5 23.5,16.157 23.5,14.5V3.5C23.5,1.843 22.157,0.5 20.5,0.5H10.243C9.447,0.5 8.684,0.816 8.121,1.379ZM20.5,16.2H10.243C9.792,16.2 9.359,16.021 9.041,15.702L2.339,9L9.041,2.298C9.359,1.979 9.792,1.8 10.243,1.8H20.5C21.439,1.8 22.2,2.561 22.2,3.5V14.5C22.2,15.439 21.439,16.2 20.5,16.2Z"
11+
android:fillColor="#ffffff"
12+
android:fillType="evenOdd"/>
13+
</vector>

0 commit comments

Comments
 (0)