Skip to content

Commit b910969

Browse files
authored
Merge pull request #87 from synonymdev/feat/component-sync-ln-node
Display View when the lightning node is syncing
2 parents 631f239 + e323ca7 commit b910969

File tree

5 files changed

+172
-64
lines changed

5 files changed

+172
-64
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package to.bitkit.ui.components
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.Spacer
5+
import androidx.compose.foundation.layout.fillMaxSize
6+
import androidx.compose.foundation.layout.height
7+
import androidx.compose.foundation.layout.padding
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.res.stringResource
12+
import androidx.compose.ui.tooling.preview.Preview
13+
import androidx.compose.ui.unit.dp
14+
import to.bitkit.R
15+
import to.bitkit.ui.screens.transfer.components.TransferAnimationView
16+
import to.bitkit.ui.shared.util.gradientBackground
17+
import to.bitkit.ui.theme.AppThemeSurface
18+
import to.bitkit.ui.theme.Colors
19+
20+
@Composable
21+
fun SyncNodeView(modifier: Modifier) {
22+
23+
Column(
24+
modifier = modifier,
25+
horizontalAlignment = Alignment.CenterHorizontally
26+
) {
27+
Spacer(Modifier.height(32.dp))
28+
29+
BodyM(
30+
text = stringResource(R.string.lightning__wait_text_top),
31+
color = Colors.White64,
32+
modifier = Modifier.padding(horizontal = 16.dp)
33+
)
34+
35+
Spacer(modifier = Modifier.weight(1f))
36+
37+
TransferAnimationView(
38+
largeCircleRes = R.drawable.ln_sync_large,
39+
smallCircleRes = R.drawable.ln_sync_small,
40+
contentRes = R.drawable.lightning,
41+
rotateContent = false
42+
)
43+
44+
Spacer(modifier = Modifier.weight(1f))
45+
46+
BodySSB(text = stringResource(R.string.lightning__wait_text_bottom), color = Colors.White32)
47+
48+
Spacer(modifier = Modifier.height(32.dp))
49+
}
50+
}
51+
52+
53+
@Preview(showBackground = true)
54+
@Composable
55+
private fun Preview() {
56+
AppThemeSurface {
57+
SyncNodeView(
58+
modifier = Modifier
59+
.fillMaxSize()
60+
.padding(horizontal = 16.dp)
61+
.gradientBackground()
62+
)
63+
}
64+
}

app/src/main/java/to/bitkit/ui/screens/transfer/components/TransferAnimationView.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import to.bitkit.ui.theme.AppThemeSurface
2727
fun TransferAnimationView(
2828
@DrawableRes largeCircleRes: Int,
2929
@DrawableRes smallCircleRes: Int,
30+
@DrawableRes contentRes: Int = R.drawable.transfer,
31+
rotateContent: Boolean = true
3032
) {
3133
Box(
3234
contentAlignment = Alignment.Center,
@@ -73,12 +75,16 @@ fun TransferAnimationView(
7375
.rotate(rotationSmall)
7476
)
7577
Image(
76-
painter = painterResource(R.drawable.transfer),
78+
painter = painterResource(contentRes),
7779
contentDescription = null,
7880
contentScale = ContentScale.Fit,
7981
modifier = Modifier
8082
.fillMaxWidth()
81-
.rotate(rotationArrows)
83+
.apply {
84+
if (rotateContent) {
85+
rotate(rotationArrows)
86+
}
87+
}
8288
)
8389
}
8490
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ fun HomeScreen(
9090
is BottomSheetType.Send -> {
9191
SendOptionsView(
9292
appViewModel = appViewModel,
93+
walletViewModel = walletViewModel,
9394
startDestination = sheet.route,
9495
onComplete = { txSheet ->
9596
appViewModel.hideSheet()

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

Lines changed: 95 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import androidx.compose.runtime.Composable
1313
import androidx.compose.ui.Alignment
1414
import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.res.stringResource
16+
import androidx.compose.ui.tooling.preview.Preview
1617
import androidx.compose.ui.unit.dp
1718
import to.bitkit.R
19+
import to.bitkit.models.NodeLifecycleState
1820
import to.bitkit.models.PrimaryDisplay
1921
import to.bitkit.ui.LocalBalances
2022
import to.bitkit.ui.LocalCurrencies
@@ -23,13 +25,15 @@ import to.bitkit.ui.components.Keyboard
2325
import to.bitkit.ui.components.MoneySSB
2426
import to.bitkit.ui.components.OutlinedColorButton
2527
import to.bitkit.ui.components.PrimaryButton
28+
import to.bitkit.ui.components.SyncNodeView
2629
import to.bitkit.ui.components.Text13Up
2730
import to.bitkit.ui.components.UnitButton
2831
import to.bitkit.ui.scaffold.SheetTopBar
29-
import to.bitkit.ui.shared.util.DarkModePreview
32+
import to.bitkit.ui.shared.util.gradientBackground
3033
import to.bitkit.ui.theme.AppThemeSurface
3134
import to.bitkit.ui.theme.Colors
3235
import to.bitkit.viewmodels.CurrencyUiState
36+
import to.bitkit.viewmodels.MainUiState
3337
import to.bitkit.viewmodels.SendEvent
3438
import to.bitkit.viewmodels.SendMethod
3539
import to.bitkit.viewmodels.SendUiState
@@ -38,101 +42,132 @@ import to.bitkit.viewmodels.SendUiState
3842
@Composable
3943
fun SendAmountScreen(
4044
uiState: SendUiState,
45+
walletUiState: MainUiState,
4146
currencyUiState: CurrencyUiState = LocalCurrencies.current,
4247
onBack: () -> Unit,
4348
onEvent: (SendEvent) -> Unit,
4449
) {
4550
Column(
46-
modifier = Modifier.fillMaxSize()
51+
modifier = Modifier
52+
.fillMaxSize()
53+
.gradientBackground()
4754
) {
4855
SheetTopBar(stringResource(R.string.title_send_amount)) {
4956
onEvent(SendEvent.AmountReset)
5057
onBack()
5158
}
5259

53-
Spacer(Modifier.height(16.dp))
60+
if (walletUiState.nodeLifecycleState is NodeLifecycleState.Running) {
61+
Spacer(Modifier.height(16.dp))
5462

55-
Column(
56-
modifier = Modifier.padding(horizontal = 16.dp)
57-
) {
58-
BalanceHeaderView(sats = uiState.amountInput.toLong(), modifier = Modifier.fillMaxWidth())
59-
60-
Spacer(modifier = Modifier.height(24.dp))
61-
62-
Text13Up(
63-
text = stringResource(R.string.wallet__send_available),
64-
color = Colors.White64,
65-
)
66-
Spacer(modifier = Modifier.height(4.dp))
67-
68-
Row(
69-
verticalAlignment = Alignment.CenterVertically,
63+
Column(
64+
modifier = Modifier.padding(horizontal = 16.dp)
7065
) {
71-
val balances = LocalBalances.current
72-
val availableAmount = when (uiState.payMethod) {
73-
SendMethod.ONCHAIN -> balances.totalOnchainSats.toLong()
74-
SendMethod.LIGHTNING -> balances.totalLightningSats.toLong()
75-
}
76-
MoneySSB(sats = availableAmount.toLong())
66+
BalanceHeaderView(sats = uiState.amountInput.toLong(), modifier = Modifier.fillMaxWidth())
7767

78-
Spacer(modifier = Modifier.weight(1f))
68+
Spacer(modifier = Modifier.height(24.dp))
69+
70+
Text13Up(
71+
text = stringResource(R.string.wallet__send_available),
72+
color = Colors.White64,
73+
)
74+
Spacer(modifier = Modifier.height(4.dp))
7975

80-
OutlinedColorButton(
81-
onClick = { onEvent(SendEvent.PaymentMethodSwitch) },
82-
enabled = uiState.isUnified,
83-
color = when (uiState.payMethod) {
84-
SendMethod.ONCHAIN -> Colors.Brand
85-
SendMethod.LIGHTNING -> Colors.Purple
86-
},
87-
modifier = Modifier.height(28.dp)
76+
Row(
77+
verticalAlignment = Alignment.CenterVertically,
8878
) {
89-
Text13Up(
90-
text = when (uiState.payMethod) {
91-
SendMethod.ONCHAIN -> stringResource(R.string.savings)
92-
SendMethod.LIGHTNING -> stringResource(R.string.spending)
93-
},
79+
val balances = LocalBalances.current
80+
val availableAmount = when (uiState.payMethod) {
81+
SendMethod.ONCHAIN -> balances.totalOnchainSats.toLong()
82+
SendMethod.LIGHTNING -> balances.totalLightningSats.toLong()
83+
}
84+
MoneySSB(sats = availableAmount.toLong())
85+
86+
Spacer(modifier = Modifier.weight(1f))
87+
88+
OutlinedColorButton(
89+
onClick = { onEvent(SendEvent.PaymentMethodSwitch) },
90+
enabled = uiState.isUnified,
9491
color = when (uiState.payMethod) {
9592
SendMethod.ONCHAIN -> Colors.Brand
9693
SendMethod.LIGHTNING -> Colors.Purple
97-
}
94+
},
95+
modifier = Modifier.height(28.dp)
96+
) {
97+
Text13Up(
98+
text = when (uiState.payMethod) {
99+
SendMethod.ONCHAIN -> stringResource(R.string.savings)
100+
SendMethod.LIGHTNING -> stringResource(R.string.spending)
101+
},
102+
color = when (uiState.payMethod) {
103+
SendMethod.ONCHAIN -> Colors.Brand
104+
SendMethod.LIGHTNING -> Colors.Purple
105+
}
106+
)
107+
}
108+
Spacer(modifier = Modifier.width(8.dp))
109+
UnitButton(
110+
modifier = Modifier.height(28.dp)
98111
)
99112
}
100-
Spacer(modifier = Modifier.width(8.dp))
101-
UnitButton(
102-
modifier = Modifier.height(28.dp)
103-
)
104-
}
105113

106-
Spacer(modifier = Modifier.weight(1f))
114+
Spacer(modifier = Modifier.weight(1f))
107115

108-
HorizontalDivider(modifier = Modifier.padding(vertical = 24.dp))
116+
HorizontalDivider(modifier = Modifier.padding(vertical = 24.dp))
109117

110-
Keyboard(
111-
onClick = { number -> onEvent(SendEvent.AmountChange(number)) },
112-
isDecimal = currencyUiState.primaryDisplay == PrimaryDisplay.FIAT,
113-
modifier = Modifier.fillMaxWidth(),
114-
)
118+
Keyboard(
119+
onClick = { number -> onEvent(SendEvent.AmountChange(number)) },
120+
isDecimal = currencyUiState.primaryDisplay == PrimaryDisplay.FIAT,
121+
modifier = Modifier.fillMaxWidth(),
122+
)
115123

116-
Spacer(modifier = Modifier.height(41.dp))
124+
Spacer(modifier = Modifier.height(41.dp))
117125

118-
PrimaryButton(
119-
text = stringResource(R.string.continue_button),
120-
enabled = uiState.isAmountInputValid,
121-
onClick = { onEvent(SendEvent.AmountContinue(uiState.amountInput)) },
122-
)
126+
PrimaryButton(
127+
text = stringResource(R.string.continue_button),
128+
enabled = uiState.isAmountInputValid,
129+
onClick = { onEvent(SendEvent.AmountContinue(uiState.amountInput)) },
130+
)
123131

124-
Spacer(modifier = Modifier.height(16.dp))
132+
Spacer(modifier = Modifier.height(16.dp))
133+
}
134+
} else {
135+
SyncNodeView(modifier = Modifier
136+
.fillMaxWidth()
137+
.weight(1f))
125138
}
126139
}
127140
}
128141

129-
@DarkModePreview
142+
@Preview(showBackground = true)
130143
@Composable
131-
private fun SendAmountViewPreview() {
144+
private fun Preview1() {
132145
AppThemeSurface {
133146
SendAmountScreen(
134147
uiState = SendUiState(
135148
payMethod = SendMethod.LIGHTNING,
149+
amountInput = "100"
150+
),
151+
walletUiState = MainUiState(
152+
nodeLifecycleState = NodeLifecycleState.Running
153+
),
154+
onBack = {},
155+
onEvent = {},
156+
)
157+
}
158+
}
159+
160+
@Preview(showBackground = true)
161+
@Composable
162+
private fun Preview2() {
163+
AppThemeSurface {
164+
SendAmountScreen(
165+
uiState = SendUiState(
166+
payMethod = SendMethod.LIGHTNING,
167+
amountInput = "100"
168+
),
169+
walletUiState = MainUiState(
170+
nodeLifecycleState = NodeLifecycleState.Initializing
136171
),
137172
onBack = {},
138173
onEvent = {},

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package to.bitkit.ui.screens.wallets.send
22

33
import androidx.compose.foundation.Image
4-
import androidx.compose.foundation.background
54
import androidx.compose.foundation.layout.Column
65
import androidx.compose.foundation.layout.Spacer
76
import androidx.compose.foundation.layout.fillMaxHeight
@@ -39,14 +38,15 @@ import to.bitkit.ui.screens.scanner.QrScanningScreen
3938
import to.bitkit.ui.shared.util.gradientBackground
4039
import to.bitkit.ui.theme.AppThemeSurface
4140
import to.bitkit.ui.theme.Colors
42-
import to.bitkit.ui.theme.Colors.Black25
4341
import to.bitkit.viewmodels.AppViewModel
4442
import to.bitkit.viewmodels.SendEffect
4543
import to.bitkit.viewmodels.SendEvent
44+
import to.bitkit.viewmodels.WalletViewModel
4645

4746
@Composable
4847
fun SendOptionsView(
4948
appViewModel: AppViewModel,
49+
walletViewModel: WalletViewModel,
5050
startDestination: SendRoute = SendRoute.Options,
5151
onComplete: (NewTransactionSheetDetails?) -> Unit,
5252
) {
@@ -88,8 +88,10 @@ fun SendOptionsView(
8888
}
8989
composable<SendRoute.Amount> {
9090
val uiState by appViewModel.sendUiState.collectAsStateWithLifecycle()
91+
val walletUiState by walletViewModel.uiState.collectAsStateWithLifecycle()
9192
SendAmountScreen(
9293
uiState = uiState,
94+
walletUiState = walletUiState,
9395
onBack = { navController.popBackStack() },
9496
onEvent = { appViewModel.setSendEvent(it) }
9597
)

0 commit comments

Comments
 (0)