Skip to content

Commit b9abd81

Browse files
authored
Merge pull request #188 from synonymdev/feat/widgets-calculator
Widgets - Calculator
2 parents a05034f + 3f3f963 commit b9abd81

File tree

22 files changed

+1006
-27
lines changed

22 files changed

+1006
-27
lines changed

app/src/main/java/to/bitkit/data/WidgetsStore.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import to.bitkit.data.serializers.WidgetsSerializer
1717
import to.bitkit.models.WidgetType
1818
import to.bitkit.models.WidgetWithPosition
1919
import to.bitkit.models.widget.BlocksPreferences
20+
import to.bitkit.models.widget.CalculatorValues
2021
import to.bitkit.models.widget.FactsPreferences
2122
import to.bitkit.models.widget.HeadlinePreferences
2223
import to.bitkit.models.widget.PricePreferences
@@ -45,6 +46,11 @@ class WidgetsStore @Inject constructor(
4546
store.updateData(transform)
4647
}
4748

49+
suspend fun updateCalculatorValues(calculatorValues: CalculatorValues) {
50+
store.updateData {
51+
it.copy(calculatorValues = calculatorValues)
52+
}
53+
}
4854
suspend fun updateArticles(articles: List<ArticleDTO>) {
4955
store.updateData {
5056
it.copy(articles = articles)
@@ -147,6 +153,7 @@ data class WidgetsData(
147153
val blocksPreferences: BlocksPreferences = BlocksPreferences(),
148154
val weatherPreferences: WeatherPreferences = WeatherPreferences(),
149155
val pricePreferences: PricePreferences = PricePreferences(),
156+
val calculatorValues: CalculatorValues = CalculatorValues(),
150157
val articles: List<ArticleDTO> = emptyList(),
151158
val facts: List<String> = emptyList(),
152159
val block: BlockDTO? = null,

app/src/main/java/to/bitkit/models/Currency.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import java.util.Locale
99

1010
const val BITCOIN_SYMBOL = ""
1111
const val SATS_IN_BTC = 100_000_000
12+
const val BTC_PLACEHOLDER = "0.00000000"
13+
const val SATS_PLACEHOLDER = "0"
1214

1315
@Serializable
1416
data class FxRateResponse(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package to.bitkit.models.widget
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
data class CalculatorValues(
7+
val btcValue: String = "",
8+
val fiatValue: String = "",
9+
)

app/src/main/java/to/bitkit/repositories/WidgetsRepo.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import to.bitkit.di.BgDispatcher
2424
import to.bitkit.models.WidgetType
2525
import to.bitkit.models.WidgetWithPosition
2626
import to.bitkit.models.widget.BlocksPreferences
27+
import to.bitkit.models.widget.CalculatorValues
2728
import to.bitkit.models.widget.FactsPreferences
2829
import to.bitkit.models.widget.HeadlinePreferences
2930
import to.bitkit.models.widget.PricePreferences
@@ -202,8 +203,7 @@ class WidgetsRepo @Inject constructor(
202203
}
203204

204205
WidgetType.CALCULATOR -> {
205-
// TODO: Implement when CalculatorService is ready
206-
throw NotImplementedError("Calculator widget not implemented yet")
206+
throw NotImplementedError("Calculator widget doesn't need a service")
207207
}
208208

209209
WidgetType.FACTS -> updateWidget(factsService) { facts ->
@@ -212,6 +212,10 @@ class WidgetsRepo @Inject constructor(
212212
}
213213
}
214214

215+
suspend fun updateCalculatorValues(calculatorValues: CalculatorValues) = withContext(bgDispatcher) {
216+
widgetsStore.updateCalculatorValues(calculatorValues)
217+
}
218+
215219
companion object {
216220
private const val TAG = "WidgetsRepo"
217221
}

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import to.bitkit.ui.screens.widgets.WidgetsIntroScreen
7777
import to.bitkit.ui.screens.widgets.blocks.BlocksEditScreen
7878
import to.bitkit.ui.screens.widgets.blocks.BlocksPreviewScreen
7979
import to.bitkit.ui.screens.widgets.blocks.BlocksViewModel
80+
import to.bitkit.ui.screens.widgets.calculator.CalculatorPreviewScreen
8081
import to.bitkit.ui.screens.widgets.facts.FactsEditScreen
8182
import to.bitkit.ui.screens.widgets.facts.FactsPreviewScreen
8283
import to.bitkit.ui.screens.widgets.facts.FactsViewModel
@@ -1018,7 +1019,7 @@ private fun NavGraphBuilder.widgets(
10181019
onWidgetSelected = { widgetType ->
10191020
when (widgetType) {
10201021
WidgetType.BLOCK -> navController.navigate(Routes.BlocksPreview)
1021-
WidgetType.CALCULATOR -> {}
1022+
WidgetType.CALCULATOR -> navController.navigate(Routes.CalculatorPreview)
10221023
WidgetType.FACTS -> navController.navigate(Routes.FactsPreview)
10231024
WidgetType.NEWS -> navController.navigate(Routes.HeadlinesPreview)
10241025
WidgetType.PRICE -> navController.navigate(Routes.PricePreview)
@@ -1028,6 +1029,13 @@ private fun NavGraphBuilder.widgets(
10281029
fiatSymbol = currencyViewModel.getCurrencySymbol()
10291030
)
10301031
}
1032+
composableWithDefaultTransitions<Routes.CalculatorPreview> {
1033+
CalculatorPreviewScreen(
1034+
onClose = { navController.navigateToHome() },
1035+
onBack = { navController.popBackStack() },
1036+
currencyViewModel = currencyViewModel
1037+
)
1038+
}
10311039
navigation<Routes.Headlines>(
10321040
startDestination = Routes.HeadlinesPreview
10331041
) {
@@ -1141,7 +1149,7 @@ private fun NavGraphBuilder.widgets(
11411149
val parentEntry = remember(it) { navController.getBackStackEntry(Routes.Price) }
11421150
val viewModel = hiltViewModel<PriceViewModel>(parentEntry)
11431151

1144-
PricePreviewScreen (
1152+
PricePreviewScreen(
11451153
priceViewModel = viewModel,
11461154
onClose = { navController.navigateToHome() },
11471155
onBack = { navController.popBackStack() },
@@ -1583,4 +1591,8 @@ object Routes {
15831591

15841592
@Serializable
15851593
data object PriceEdit
1594+
1595+
1596+
@Serializable
1597+
data object CalculatorPreview
15861598
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ fun BalanceHeaderView(
6464

6565
val settings = settingsViewModel ?: return
6666
val currency = currencyViewModel ?: return
67-
val (_, _, _, _, displayUnit, primaryDisplay) = LocalCurrencies.current
67+
val (_, _, _, _, _, displayUnit, primaryDisplay) = LocalCurrencies.current
6868
val converted: ConvertedAmount? = currency.convert(sats = sats)
6969

7070
val isSwipeToHideEnabled by settings.enableSwipeToHideBalance.collectAsStateWithLifecycle()
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package to.bitkit.ui.components
2+
3+
import androidx.annotation.FloatRange
4+
import androidx.compose.foundation.layout.ColumnScope
5+
import androidx.compose.foundation.layout.RowScope
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.height
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.unit.Dp
11+
12+
@Composable
13+
fun VerticalSpacer(height: Dp) {
14+
Spacer(modifier = Modifier.height(height))
15+
}
16+
17+
18+
@Composable
19+
fun HorizontalSpacer(width: Dp) {
20+
Spacer(modifier = Modifier.height(width))
21+
}
22+
23+
@Composable
24+
fun ColumnScope.FillHeight(
25+
@FloatRange weight: Float = 1f,
26+
fill: Boolean = true
27+
) {
28+
Spacer(modifier = Modifier.weight(weight, fill = fill))
29+
}
30+
31+
@Composable
32+
fun RowScope.FillWidth(
33+
@FloatRange weight: Float = 1f,
34+
fill: Boolean = true
35+
) {
36+
Spacer(modifier = Modifier.weight(weight, fill = fill))
37+
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.material3.TextField
77
import androidx.compose.runtime.Composable
88
import androidx.compose.ui.Modifier
99
import androidx.compose.ui.text.font.FontWeight
10+
import androidx.compose.ui.text.input.VisualTransformation
1011
import androidx.compose.ui.text.style.TextAlign
1112
import androidx.compose.ui.unit.sp
1213
import to.bitkit.ui.theme.AppShapes
@@ -25,6 +26,12 @@ fun TextInput(
2526
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
2627
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
2728
keyboardActions: KeyboardActions = KeyboardActions.Default,
29+
leadingIcon: @Composable (() -> Unit)? = null,
30+
trailingIcon: @Composable (() -> Unit)? = null,
31+
prefix: @Composable (() -> Unit)? = null,
32+
suffix: @Composable (() -> Unit)? = null,
33+
supportingText: @Composable (() -> Unit)? = null,
34+
visualTransformation: VisualTransformation = VisualTransformation.None,
2835
) {
2936
TextField(
3037
placeholder = {
@@ -52,6 +59,12 @@ fun TextInput(
5259
shape = AppShapes.small,
5360
keyboardOptions = keyboardOptions,
5461
keyboardActions = keyboardActions,
62+
leadingIcon = leadingIcon,
63+
trailingIcon = trailingIcon,
64+
prefix = prefix,
65+
suffix = suffix,
66+
supportingText = supportingText,
67+
visualTransformation = visualTransformation,
5568
modifier = modifier
5669
)
5770
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fun RowScope.WalletBalanceView(
3636
) {
3737
val settings = settingsViewModel ?: return
3838
val currency = currencyViewModel ?: return
39-
val (_, _, _, _, displayUnit, primaryDisplay) = LocalCurrencies.current
39+
val (_, _, _, _, _, displayUnit, primaryDisplay) = LocalCurrencies.current
4040
val converted: ConvertedAmount? = currency.convert(sats = sats)
4141

4242
val hideBalance by settings.hideBalance.collectAsStateWithLifecycle()

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

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import androidx.compose.material3.Icon
3232
import androidx.compose.material3.VerticalDivider
3333
import androidx.compose.runtime.Composable
3434
import androidx.compose.runtime.LaunchedEffect
35-
import androidx.compose.runtime.collectAsState
3635
import androidx.compose.runtime.derivedStateOf
3736
import androidx.compose.runtime.getValue
3837
import androidx.compose.runtime.mutableStateOf
@@ -47,7 +46,6 @@ import androidx.compose.ui.res.stringResource
4746
import androidx.compose.ui.tooling.preview.Preview
4847
import androidx.compose.ui.unit.dp
4948
import androidx.hilt.navigation.compose.hiltViewModel
50-
import androidx.lifecycle.Lifecycle
5149
import androidx.lifecycle.compose.collectAsStateWithLifecycle
5250
import androidx.navigation.NavController
5351
import androidx.navigation.compose.NavHost
@@ -66,12 +64,12 @@ import to.bitkit.ui.appViewModel
6664
import to.bitkit.ui.components.BalanceHeaderView
6765
import to.bitkit.ui.components.BottomSheetType
6866
import to.bitkit.ui.components.EmptyStateView
69-
import to.bitkit.ui.components.SheetHost
7067
import to.bitkit.ui.components.SuggestionCard
7168
import to.bitkit.ui.components.TabBar
7269
import to.bitkit.ui.components.TertiaryButton
7370
import to.bitkit.ui.components.Text13Up
7471
import to.bitkit.ui.components.WalletBalanceView
72+
import to.bitkit.ui.currencyViewModel
7573
import to.bitkit.ui.navigateToActivityItem
7674
import to.bitkit.ui.navigateToQrScanner
7775
import to.bitkit.ui.navigateToTransferFunding
@@ -82,19 +80,13 @@ import to.bitkit.ui.navigateToTransferSpendingAmount
8280
import to.bitkit.ui.navigateToTransferSpendingIntro
8381
import to.bitkit.ui.scaffold.AppScaffold
8482
import to.bitkit.ui.screens.wallets.activity.AllActivityScreen
85-
import to.bitkit.ui.screens.wallets.activity.DateRangeSelectorSheet
86-
import to.bitkit.ui.screens.wallets.activity.TagSelectorSheet
8783
import to.bitkit.ui.screens.wallets.activity.components.ActivityListSimple
88-
import to.bitkit.ui.screens.wallets.receive.ReceiveQrSheet
89-
import to.bitkit.ui.screens.wallets.send.SendOptionsView
9084
import to.bitkit.ui.screens.widgets.blocks.BlockCard
85+
import to.bitkit.ui.screens.widgets.calculator.components.CalculatorCard
9186
import to.bitkit.ui.screens.widgets.facts.FactsCard
9287
import to.bitkit.ui.screens.widgets.headlines.HeadlineCard
9388
import to.bitkit.ui.screens.widgets.price.PriceCard
9489
import to.bitkit.ui.screens.widgets.weather.WeatherCard
95-
import to.bitkit.ui.settings.backups.BackupSheet
96-
import to.bitkit.ui.settings.backups.BackupNavigationSheet
97-
import to.bitkit.ui.settings.pin.PinNavigationSheet
9890
import to.bitkit.ui.settingsViewModel
9991
import to.bitkit.ui.shared.util.clickableAlpha
10092
import to.bitkit.ui.shared.util.shareText
@@ -106,7 +98,6 @@ import to.bitkit.ui.utils.withAccent
10698
import to.bitkit.viewmodels.ActivityListViewModel
10799
import to.bitkit.viewmodels.AppViewModel
108100
import to.bitkit.viewmodels.MainUiState
109-
import to.bitkit.viewmodels.SendEvent
110101
import to.bitkit.viewmodels.SettingsViewModel
111102
import to.bitkit.viewmodels.WalletViewModel
112103

@@ -395,7 +386,10 @@ private fun HomeContentView(
395386
)
396387
Spacer(modifier = Modifier.height(16.dp))
397388

398-
Column(modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(16.dp)) { //TODO IMPLEMENT DRAGABLE IN OTHER PR
389+
Column(
390+
modifier = Modifier.fillMaxWidth(),
391+
verticalArrangement = Arrangement.spacedBy(16.dp)
392+
) { //TODO IMPLEMENT DRAGABLE IN OTHER PR
399393
homeUiState.widgetsWithPosition.map { widgetsWithPosition ->
400394
when (widgetsWithPosition.type) {
401395
WidgetType.BLOCK -> {
@@ -418,7 +412,17 @@ private fun HomeContentView(
418412
)
419413
}
420414
}
421-
WidgetType.CALCULATOR -> Unit //TODO IMPLEMENT
415+
416+
WidgetType.CALCULATOR -> {
417+
currencyViewModel?.let {
418+
CalculatorCard(
419+
currencyViewModel = it,
420+
modifier = Modifier.fillMaxWidth(),
421+
showWidgetTitle = homeUiState.showWidgetTitles
422+
)
423+
}
424+
}
425+
422426
WidgetType.FACTS -> {
423427
homeUiState.currentFact?.run {
424428
FactsCard(
@@ -429,6 +433,7 @@ private fun HomeContentView(
429433
)
430434
}
431435
}
436+
432437
WidgetType.NEWS -> {
433438
homeUiState.currentArticle?.run {
434439
HeadlineCard(
@@ -454,6 +459,7 @@ private fun HomeContentView(
454459
)
455460
}
456461
}
462+
457463
WidgetType.WEATHER -> {
458464
homeUiState.currentWeather?.run {
459465
WeatherCard(

0 commit comments

Comments
 (0)