Skip to content

Commit e87c214

Browse files
authored
Merge pull request #709 from synonymdev/fix/price-widget-layout
feat: add gradient overlay to price widget appbar
2 parents 520b60c + b1e253d commit e87c214

File tree

1 file changed

+128
-49
lines changed

1 file changed

+128
-49
lines changed

app/src/main/java/to/bitkit/ui/screens/widgets/price/PriceEditScreen.kt

Lines changed: 128 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
11
package to.bitkit.ui.screens.widgets.price
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Box
46
import androidx.compose.foundation.layout.Column
57
import androidx.compose.foundation.layout.Row
6-
import androidx.compose.foundation.layout.Spacer
8+
import androidx.compose.foundation.layout.fillMaxSize
79
import androidx.compose.foundation.layout.fillMaxWidth
8-
import androidx.compose.foundation.layout.height
910
import androidx.compose.foundation.layout.padding
1011
import androidx.compose.foundation.layout.size
1112
import androidx.compose.foundation.rememberScrollState
1213
import androidx.compose.foundation.verticalScroll
1314
import androidx.compose.material3.HorizontalDivider
1415
import androidx.compose.material3.Icon
1516
import androidx.compose.material3.IconButton
17+
import androidx.compose.material3.MaterialTheme
1618
import androidx.compose.runtime.Composable
1719
import androidx.compose.runtime.getValue
1820
import androidx.compose.ui.Alignment
1921
import androidx.compose.ui.Modifier
22+
import androidx.compose.ui.graphics.Brush
23+
import androidx.compose.ui.graphics.Color
24+
import androidx.compose.ui.graphics.TileMode
2025
import androidx.compose.ui.platform.testTag
2126
import androidx.compose.ui.res.painterResource
2227
import androidx.compose.ui.res.stringResource
28+
import androidx.compose.ui.tooling.preview.Preview
2329
import androidx.compose.ui.unit.dp
2430
import androidx.lifecycle.compose.collectAsStateWithLifecycle
2531
import to.bitkit.R
32+
import to.bitkit.data.dto.price.Change
2633
import to.bitkit.data.dto.price.GraphPeriod
2734
import to.bitkit.data.dto.price.PriceDTO
2835
import to.bitkit.data.dto.price.PriceWidgetData
@@ -32,16 +39,18 @@ import to.bitkit.ui.components.BodyM
3239
import to.bitkit.ui.components.BodySSB
3340
import to.bitkit.ui.components.PrimaryButton
3441
import to.bitkit.ui.components.SecondaryButton
42+
import to.bitkit.ui.components.VerticalSpacer
3543
import to.bitkit.ui.scaffold.AppTopBar
3644
import to.bitkit.ui.scaffold.DrawerNavIcon
3745
import to.bitkit.ui.scaffold.ScreenColumn
46+
import to.bitkit.ui.theme.AppThemeSurface
3847
import to.bitkit.ui.theme.Colors
3948

4049
@Composable
4150
fun PriceEditScreen(
4251
viewModel: PriceViewModel,
4352
onBack: () -> Unit,
44-
navigatePreview: () -> Unit
53+
navigatePreview: () -> Unit,
4554
) {
4655
val customPreferences by viewModel.customPreferences.collectAsStateWithLifecycle()
4756
val currentPrice by viewModel.currentPrice.collectAsStateWithLifecycle()
@@ -87,66 +96,83 @@ fun PriceEditContent(
8796
ScreenColumn(
8897
modifier = Modifier.testTag("weather_edit_screen")
8998
) {
90-
AppTopBar(
91-
titleText = stringResource(R.string.widgets__widget__edit),
92-
onBackClick = onBack,
93-
actions = { DrawerNavIcon() },
94-
)
95-
96-
Column(
99+
Box(
97100
modifier = Modifier
98-
.padding(horizontal = 16.dp)
99101
.weight(1f)
100-
.verticalScroll(rememberScrollState())
101-
.testTag("WidgetEditScrollView")
102+
.fillMaxWidth()
102103
) {
103-
Spacer(modifier = Modifier.height(26.dp))
104+
Column(
105+
modifier = Modifier
106+
.fillMaxSize()
107+
.padding(horizontal = 16.dp)
108+
.verticalScroll(rememberScrollState())
109+
.testTag("WidgetEditScrollView")
110+
) {
111+
VerticalSpacer(82.dp)
104112

105-
BodyM(
106-
text = stringResource(R.string.widgets__widget__edit_description).replace(
107-
"{name}",
108-
stringResource(R.string.widgets__price__name)
109-
),
110-
color = Colors.White64,
111-
modifier = Modifier.testTag("edit_description")
112-
)
113+
BodyM(
114+
text = stringResource(R.string.widgets__widget__edit_description).replace(
115+
"{name}",
116+
stringResource(R.string.widgets__price__name)
117+
),
118+
color = Colors.White64,
119+
modifier = Modifier.testTag("edit_description")
120+
)
121+
122+
VerticalSpacer(32.dp)
123+
124+
priceModel.widgets.map { data ->
125+
PriceEditOptionRow(
126+
label = data.pair.displayName,
127+
value = data.price,
128+
isEnabled = data.pair in preferences.enabledPairs,
129+
onClick = {
130+
onClickTradingPair(data.pair)
131+
},
132+
testTagPrefix = data.pair.displayName,
133+
)
134+
}
113135

114-
Spacer(modifier = Modifier.height(32.dp))
136+
allPeriodsUsd.map { priceData ->
137+
PriceChartOptionRow(
138+
widgetData = priceData,
139+
isEnabled = priceData.period == preferences.period,
140+
onClick = onClickGraph,
141+
testTagPrefix = priceData.period.value,
142+
)
143+
}
115144

116-
priceModel.widgets.map { data ->
117145
PriceEditOptionRow(
118-
label = data.pair.displayName,
119-
value = data.price,
120-
isEnabled = data.pair in preferences.enabledPairs,
121-
onClick = {
122-
onClickTradingPair(data.pair)
123-
},
124-
testTagPrefix = data.pair.displayName,
146+
label = stringResource(R.string.widgets__widget__source),
147+
value = priceModel.source,
148+
isEnabled = preferences.showSource,
149+
onClick = onClickSource,
150+
testTagPrefix = "showSource",
125151
)
126152
}
127153

128-
allPeriodsUsd.map { priceData ->
129-
PriceChartOptionRow(
130-
widgetData = priceData,
131-
isEnabled = priceData.period == preferences.period,
132-
onClick = onClickGraph,
133-
testTagPrefix = priceData.period.value,
154+
Column {
155+
AppTopBar(
156+
titleText = stringResource(R.string.widgets__widget__edit),
157+
onBackClick = onBack,
158+
actions = { DrawerNavIcon() },
159+
modifier = Modifier.background(
160+
Brush.verticalGradient(
161+
colors = listOf(
162+
MaterialTheme.colorScheme.background,
163+
Color.Transparent
164+
),
165+
tileMode = TileMode.Decal
166+
)
167+
)
134168
)
135169
}
136-
137-
PriceEditOptionRow(
138-
label = stringResource(R.string.widgets__widget__source),
139-
value = priceModel.source,
140-
isEnabled = preferences.showSource,
141-
onClick = onClickSource,
142-
testTagPrefix = "showSource",
143-
)
144170
}
145171

146172
Row(
147173
horizontalArrangement = Arrangement.spacedBy(16.dp),
148174
modifier = Modifier
149-
.padding(vertical = 21.dp, horizontal = 16.dp)
175+
.padding(16.dp)
150176
.fillMaxWidth()
151177
.testTag("buttons_row")
152178
) {
@@ -179,14 +205,14 @@ private fun PriceEditOptionRow(
179205
value: String,
180206
isEnabled: Boolean,
181207
onClick: () -> Unit,
182-
testTagPrefix: String
208+
testTagPrefix: String,
183209
) {
184210
Column {
185211
Row(
186212
horizontalArrangement = Arrangement.spacedBy(16.dp),
187213
verticalAlignment = Alignment.CenterVertically,
188214
modifier = Modifier
189-
.padding(vertical = 21.dp)
215+
.padding(vertical = 16.dp)
190216
.fillMaxWidth()
191217
.testTag("${testTagPrefix}_setting_row")
192218
) {
@@ -232,7 +258,7 @@ private fun PriceChartOptionRow(
232258
widgetData: PriceWidgetData,
233259
isEnabled: Boolean,
234260
onClick: (GraphPeriod) -> Unit,
235-
testTagPrefix: String
261+
testTagPrefix: String,
236262
) {
237263
Column {
238264
Row(
@@ -268,3 +294,56 @@ private fun PriceChartOptionRow(
268294
)
269295
}
270296
}
297+
298+
@Suppress("MagicNumber")
299+
@Preview(showSystemUi = true)
300+
@Composable
301+
private fun Preview() {
302+
AppThemeSurface {
303+
PriceEditContent(
304+
onBack = {},
305+
priceModel = PriceDTO(
306+
widgets = listOf(
307+
PriceWidgetData(
308+
pair = TradingPair.BTC_USD,
309+
period = GraphPeriod.ONE_DAY,
310+
change = Change(isPositive = true, formatted = "+2.5%"),
311+
price = "$97,500",
312+
pastValues = listOf(95000.0, 96000.0, 95500.0, 97000.0, 97500.0)
313+
),
314+
PriceWidgetData(
315+
pair = TradingPair.BTC_EUR,
316+
period = GraphPeriod.ONE_DAY,
317+
change = Change(isPositive = true, formatted = "+2.3%"),
318+
price = "€89,000",
319+
pastValues = listOf(87000.0, 88000.0, 87500.0, 88500.0, 89000.0)
320+
)
321+
),
322+
source = "Kraken"
323+
),
324+
allPeriodsUsd = listOf(
325+
PriceWidgetData(
326+
pair = TradingPair.BTC_USD,
327+
period = GraphPeriod.ONE_DAY,
328+
change = Change(isPositive = true, formatted = "+2.5%"),
329+
price = "$97,500",
330+
pastValues = listOf(95000.0, 96000.0, 95500.0, 97000.0, 97500.0)
331+
),
332+
PriceWidgetData(
333+
pair = TradingPair.BTC_USD,
334+
period = GraphPeriod.ONE_WEEK,
335+
change = Change(isPositive = true, formatted = "+5.0%"),
336+
price = "$97,500",
337+
pastValues = listOf(93000.0, 94000.0, 95000.0, 96000.0, 97500.0)
338+
)
339+
),
340+
onClickReset = {},
341+
onClickGraph = {},
342+
onClickTradingPair = {},
343+
onClickPreview = {},
344+
onClickSource = {},
345+
preferences = PricePreferences(),
346+
isLoading = false
347+
)
348+
}
349+
}

0 commit comments

Comments
 (0)