Skip to content

Commit cb75ab2

Browse files
authored
Fix bugs on the implementation of different amount selector implementing new UI component (#1167)
1 parent c823d2e commit cb75ab2

File tree

18 files changed

+1498
-566
lines changed

18 files changed

+1498
-566
lines changed

shared/domain/src/commonMain/resources/mobile/mobile.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ mobile.bisqEasy.tradeWizard.price.tradePrice.type.percentage.validation.shouldBe
114114
mobile.bisqEasy.tradeWizard.price.adjustedDueToMarketChange=Price adjusted due to market price change
115115
mobile.bisqEasy.tradeWizard.price.updateError=Unable to update prices due to market price change
116116
mobile.bisqEasy.tradeWizard.amount.range.validation.minShouldBeLessThanMax=The Minimum value must not exceed Maximum
117+
mobile.bisqEasy.tradeWizard.amount.seller.limitInfo=Your maximum selling amount is {0} out of {1}.
118+
117119
mobile.bisqEasy.openTrades.title=Trade ID: {0}
118120
mobile.bisqEasy.openTrades.failed=The trade failed with error message: {0}
119121
mobile.bisqEasy.openTrades.failedAtPeer=The peer's trade failed with an error caused by: {0}

shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/common/ui/components/atoms/AmountSlider.kt

Lines changed: 0 additions & 138 deletions
This file was deleted.

shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/common/ui/components/atoms/RangeAmountSlider.kt

Lines changed: 0 additions & 48 deletions
This file was deleted.

shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/common/ui/components/atoms/TextFieldV0.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import androidx.compose.foundation.layout.Arrangement
66
import androidx.compose.foundation.layout.Box
77
import androidx.compose.foundation.layout.Column
88
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.Spacer
910
import androidx.compose.foundation.layout.fillMaxWidth
1011
import androidx.compose.foundation.layout.padding
1112
import androidx.compose.foundation.layout.size
13+
import androidx.compose.foundation.layout.width
1214
import androidx.compose.foundation.shape.RoundedCornerShape
1315
import androidx.compose.foundation.text.BasicTextField
1416
import androidx.compose.foundation.text.KeyboardActions
@@ -172,13 +174,20 @@ fun BisqTextFieldV0(
172174
prefixContent()
173175
}
174176

175-
Box(modifier = Modifier.weight(1f)) {
177+
Box(
178+
modifier =
179+
Modifier
180+
.weight(1f),
181+
propagateMinConstraints = true,
182+
) {
176183
if (value.isEmpty() && placeholder != null) {
177184
BisqText.LargeLightGrey(placeholder)
178185
}
179186
innerTextField()
180187
}
181188

189+
Spacer(modifier = Modifier.width(4.dp))
190+
182191
suffix?.let { suffixContent ->
183192
suffixContent()
184193
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package network.bisq.mobile.presentation.common.ui.components.atoms.slider
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.height
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.layout.width
10+
import androidx.compose.foundation.shape.RoundedCornerShape
11+
import androidx.compose.material3.ExperimentalMaterial3Api
12+
import androidx.compose.material3.RangeSlider
13+
import androidx.compose.material3.RangeSliderState
14+
import androidx.compose.material3.SliderDefaults
15+
import androidx.compose.runtime.Composable
16+
import androidx.compose.runtime.mutableStateOf
17+
import androidx.compose.runtime.remember
18+
import androidx.compose.ui.Modifier
19+
import androidx.compose.ui.unit.dp
20+
import network.bisq.mobile.presentation.common.ui.components.atoms.BisqText
21+
import network.bisq.mobile.presentation.common.ui.theme.BisqTheme
22+
import org.jetbrains.compose.ui.tooling.preview.Preview
23+
24+
@OptIn(ExperimentalMaterial3Api::class)
25+
@Composable
26+
fun BisqRangeSlider(
27+
value: ClosedFloatingPointRange<Float>,
28+
onValueChange: (ClosedFloatingPointRange<Float>) -> Unit,
29+
modifier: Modifier = Modifier,
30+
valueRange: ClosedFloatingPointRange<Float> = 0f..1f,
31+
onValueChangeFinished: (() -> Unit)? = null,
32+
enabled: Boolean = true,
33+
) {
34+
val thumbColor = if (enabled) BisqTheme.colors.primary else BisqTheme.colors.mid_grey20
35+
36+
val customThumb: @Composable (RangeSliderState) -> Unit = { _ ->
37+
Box(
38+
modifier =
39+
Modifier
40+
.width(4.dp)
41+
.height(26.dp)
42+
.background(
43+
color = thumbColor,
44+
shape = RoundedCornerShape(2.dp),
45+
),
46+
)
47+
}
48+
49+
RangeSlider(
50+
value = value,
51+
onValueChange = onValueChange,
52+
modifier = modifier,
53+
valueRange = valueRange,
54+
onValueChangeFinished = onValueChangeFinished,
55+
enabled = enabled,
56+
startThumb = customThumb,
57+
endThumb = customThumb,
58+
colors =
59+
SliderDefaults.colors(
60+
thumbColor = BisqTheme.colors.primary,
61+
activeTrackColor = BisqTheme.colors.primary,
62+
inactiveTrackColor = BisqTheme.colors.mid_grey10,
63+
disabledThumbColor = BisqTheme.colors.mid_grey20,
64+
disabledActiveTrackColor = BisqTheme.colors.mid_grey10,
65+
disabledInactiveTrackColor = BisqTheme.colors.dark_grey30,
66+
),
67+
)
68+
}
69+
70+
@Preview
71+
@Composable
72+
private fun BisqRangeSlider_DefaultPreview() {
73+
BisqTheme.Preview {
74+
val rangeValue = remember { mutableStateOf(0.25f..0.75f) }
75+
Column(modifier = Modifier.padding(16.dp)) {
76+
BisqText.BaseRegular("Default (0.25f..0.75f)")
77+
Spacer(modifier = Modifier.height(8.dp))
78+
BisqRangeSlider(
79+
value = rangeValue.value,
80+
onValueChange = { rangeValue.value = it },
81+
)
82+
Spacer(modifier = Modifier.height(4.dp))
83+
BisqText.SmallRegular("Range: ${rangeValue.value.start}..${rangeValue.value.endInclusive}")
84+
}
85+
}
86+
}
87+
88+
@Preview
89+
@Composable
90+
private fun BisqRangeSlider_MinRangePreview() {
91+
BisqTheme.Preview {
92+
val rangeValue = remember { mutableStateOf(0f..0.1f) }
93+
Column(modifier = Modifier.padding(16.dp)) {
94+
BisqText.BaseRegular("Min Range (0f..0.1f)")
95+
Spacer(modifier = Modifier.height(8.dp))
96+
BisqRangeSlider(
97+
value = rangeValue.value,
98+
onValueChange = { rangeValue.value = it },
99+
)
100+
Spacer(modifier = Modifier.height(4.dp))
101+
BisqText.SmallRegular("Range: ${rangeValue.value.start}..${rangeValue.value.endInclusive}")
102+
}
103+
}
104+
}
105+
106+
@Preview
107+
@Composable
108+
private fun BisqRangeSlider_MaxRangePreview() {
109+
BisqTheme.Preview {
110+
val rangeValue = remember { mutableStateOf(0.9f..1f) }
111+
Column(modifier = Modifier.padding(16.dp)) {
112+
BisqText.BaseRegular("Max Range (0.9f..1f)")
113+
Spacer(modifier = Modifier.height(8.dp))
114+
BisqRangeSlider(
115+
value = rangeValue.value,
116+
onValueChange = { rangeValue.value = it },
117+
)
118+
Spacer(modifier = Modifier.height(4.dp))
119+
BisqText.SmallRegular("Range: ${rangeValue.value.start}..${rangeValue.value.endInclusive}")
120+
}
121+
}
122+
}
123+
124+
@Preview
125+
@Composable
126+
private fun BisqRangeSlider_DisabledPreview() {
127+
BisqTheme.Preview {
128+
val rangeValue = remember { mutableStateOf(0.25f..0.75f) }
129+
Column(modifier = Modifier.padding(16.dp)) {
130+
BisqText.BaseRegular("Disabled (enabled=false)")
131+
Spacer(modifier = Modifier.height(8.dp))
132+
BisqRangeSlider(
133+
value = rangeValue.value,
134+
onValueChange = { rangeValue.value = it },
135+
enabled = false,
136+
)
137+
Spacer(modifier = Modifier.height(4.dp))
138+
BisqText.SmallRegular("Range: ${rangeValue.value.start}..${rangeValue.value.endInclusive}")
139+
}
140+
}
141+
}
142+
143+
@Preview
144+
@Composable
145+
private fun BisqRangeSlider_CustomRangePreview() {
146+
BisqTheme.Preview {
147+
val rangeValue = remember { mutableStateOf(50f..150f) }
148+
Column(modifier = Modifier.padding(16.dp)) {
149+
BisqText.BaseRegular("Custom Range (6f..250f)")
150+
Spacer(modifier = Modifier.height(8.dp))
151+
BisqRangeSlider(
152+
value = rangeValue.value,
153+
onValueChange = { rangeValue.value = it },
154+
valueRange = 6f..250f,
155+
)
156+
Spacer(modifier = Modifier.height(4.dp))
157+
BisqText.SmallRegular("Range: ${rangeValue.value.start}..${rangeValue.value.endInclusive}")
158+
}
159+
}
160+
}

0 commit comments

Comments
 (0)