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