Skip to content

Commit 17e054e

Browse files
committed
feat: implement SyncNodeView
1 parent b8ffe68 commit 17e054e

File tree

2 files changed

+131
-75
lines changed

2 files changed

+131
-75
lines changed

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

Lines changed: 126 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import to.bitkit.ui.components.MoneySSB
3434
import to.bitkit.ui.components.NumberPadActionButton
3535
import to.bitkit.ui.components.NumberPadTextField
3636
import to.bitkit.ui.components.PrimaryButton
37+
import to.bitkit.ui.components.SyncNodeView
3738
import to.bitkit.ui.components.Text13Up
3839
import to.bitkit.ui.components.UnitButton
3940
import to.bitkit.ui.components.VerticalSpacer
@@ -59,6 +60,7 @@ fun SpendingAmountScreen(
5960
) {
6061
val currencies = LocalCurrencies.current
6162
val uiState by viewModel.spendingUiState.collectAsStateWithLifecycle()
63+
val isNodeRunning by viewModel.isNodeRunning.collectAsStateWithLifecycle()
6264

6365
LaunchedEffect(Unit) {
6466
viewModel.updateLimits(retry = true)
@@ -86,6 +88,7 @@ fun SpendingAmountScreen(
8688
)
8789

8890
Content(
91+
isNodeRunning = isNodeRunning,
8992
uiState = uiState,
9093
currencies = currencies,
9194
onBackClick = onBackClick,
@@ -99,6 +102,7 @@ fun SpendingAmountScreen(
99102

100103
@Composable
101104
private fun Content(
105+
isNodeRunning: Boolean,
102106
uiState: TransferToSpendingUiState,
103107
currencies: CurrencyUiState,
104108
onBackClick: () -> Unit,
@@ -114,92 +118,120 @@ private fun Content(
114118
onBackClick = onBackClick,
115119
actions = { CloseNavIcon(onCloseClick) },
116120
)
117-
Column(
118-
modifier = Modifier
119-
.padding(horizontal = 16.dp)
120-
.fillMaxSize()
121-
.imePadding()
122-
.testTag("SpendingAmount")
123-
) {
124-
VerticalSpacer(16.dp)
125-
Display(
126-
text = stringResource(R.string.lightning__spending_amount__title)
127-
.withAccent(accentColor = Colors.Purple)
128-
)
129121

130-
NumberPadTextField(
131-
input = uiState.input,
132-
displayUnit = currencies.displayUnit,
133-
showSecondaryField = false,
134-
primaryDisplay = currencies.primaryDisplay,
122+
if (isNodeRunning) {
123+
SpendingAmountNodeRunning(
124+
uiState = uiState,
125+
currencies = currencies,
126+
onClickQuarter = onClickQuarter,
127+
onClickMaxAmount = onClickMaxAmount,
128+
onConfirmAmount = onConfirmAmount,
129+
onInputChange = onInputChange,
130+
)
131+
} else {
132+
SyncNodeView(
135133
modifier = Modifier
136134
.fillMaxWidth()
137-
.testTag("SpendingAmountNumberField")
135+
.weight(1f)
138136
)
137+
}
138+
}
139+
}
140+
141+
@Composable
142+
private fun SpendingAmountNodeRunning(
143+
uiState: TransferToSpendingUiState,
144+
currencies: CurrencyUiState,
145+
onClickQuarter: () -> Unit,
146+
onClickMaxAmount: () -> Unit,
147+
onConfirmAmount: () -> Unit,
148+
onInputChange: (String) -> Unit,
149+
) {
150+
Column(
151+
modifier = Modifier
152+
.padding(horizontal = 16.dp)
153+
.fillMaxSize()
154+
.imePadding()
155+
.testTag("SpendingAmount")
156+
) {
157+
VerticalSpacer(16.dp)
158+
Display(
159+
text = stringResource(R.string.lightning__spending_amount__title)
160+
.withAccent(accentColor = Colors.Purple)
161+
)
139162

140-
FillHeight()
163+
NumberPadTextField(
164+
input = uiState.input,
165+
displayUnit = currencies.displayUnit,
166+
showSecondaryField = false,
167+
primaryDisplay = currencies.primaryDisplay,
168+
modifier = Modifier
169+
.fillMaxWidth()
170+
.testTag("SpendingAmountNumberField")
171+
)
141172

142-
Row(
143-
verticalAlignment = Alignment.Bottom,
144-
horizontalArrangement = Arrangement.spacedBy(8.dp),
145-
modifier = Modifier
146-
.padding(vertical = 8.dp)
147-
.testTag("SendAmountNumberPad")
148-
) {
149-
Column {
150-
Text13Up(
151-
text = stringResource(R.string.wallet__send_available),
152-
color = Colors.White64,
153-
modifier = Modifier.testTag("SpendingAmountAvailable")
154-
)
155-
Spacer(modifier = Modifier.height(8.dp))
156-
MoneySSB(sats = uiState.balanceAfterFee, modifier = Modifier.testTag("SpendingAmountUnit"))
157-
}
158-
FillWidth()
159-
UnitButton(color = Colors.Purple)
160-
// 25% Button
161-
NumberPadActionButton(
162-
text = stringResource(R.string.lightning__spending_amount__quarter),
163-
color = Colors.Purple,
164-
onClick = onClickQuarter,
165-
modifier = Modifier.testTag("SpendingAmountQuarter")
166-
)
167-
// Max Button
168-
NumberPadActionButton(
169-
text = stringResource(R.string.common__max),
170-
color = Colors.Purple,
171-
onClick = onClickMaxAmount,
172-
modifier = Modifier.testTag("SpendingAmountMax")
173+
FillHeight()
174+
175+
Row(
176+
verticalAlignment = Alignment.Bottom,
177+
horizontalArrangement = Arrangement.spacedBy(8.dp),
178+
modifier = Modifier
179+
.padding(vertical = 8.dp)
180+
.testTag("SendAmountNumberPad")
181+
) {
182+
Column {
183+
Text13Up(
184+
text = stringResource(R.string.wallet__send_available),
185+
color = Colors.White64,
186+
modifier = Modifier.testTag("SpendingAmountAvailable")
173187
)
188+
Spacer(modifier = Modifier.height(8.dp))
189+
MoneySSB(sats = uiState.balanceAfterFee, modifier = Modifier.testTag("SpendingAmountUnit"))
174190
}
175-
HorizontalDivider()
176-
177-
VerticalSpacer(16.dp)
178-
179-
Keyboard(
180-
onClick = { number ->
181-
onInputChange(if (uiState.input == "0") number else uiState.input + number)
182-
},
183-
onClickBackspace = {
184-
onInputChange(if (uiState.input.length > 1) uiState.input.dropLast(1) else "0")
185-
},
186-
isDecimal = currencies.primaryDisplay == PrimaryDisplay.FIAT,
187-
modifier = Modifier
188-
.fillMaxWidth()
191+
FillWidth()
192+
UnitButton(color = Colors.Purple)
193+
// 25% Button
194+
NumberPadActionButton(
195+
text = stringResource(R.string.lightning__spending_amount__quarter),
196+
color = Colors.Purple,
197+
onClick = onClickQuarter,
198+
modifier = Modifier.testTag("SpendingAmountQuarter")
189199
)
200+
// Max Button
201+
NumberPadActionButton(
202+
text = stringResource(R.string.common__max),
203+
color = Colors.Purple,
204+
onClick = onClickMaxAmount,
205+
modifier = Modifier.testTag("SpendingAmountMax")
206+
)
207+
}
208+
HorizontalDivider()
190209

191-
VerticalSpacer(8.dp)
210+
VerticalSpacer(16.dp)
192211

193-
PrimaryButton(
194-
text = stringResource(R.string.common__continue),
195-
onClick = onConfirmAmount,
196-
enabled = uiState.satsAmount != 0L && uiState.satsAmount <= uiState.maxAllowedToSend,
197-
isLoading = uiState.isLoading,
198-
modifier = Modifier.testTag("SpendingAmountContinue")
199-
)
212+
Keyboard(
213+
onClick = { number ->
214+
onInputChange(if (uiState.input == "0") number else uiState.input + number)
215+
},
216+
onClickBackspace = {
217+
onInputChange(if (uiState.input.length > 1) uiState.input.dropLast(1) else "0")
218+
},
219+
isDecimal = currencies.primaryDisplay == PrimaryDisplay.FIAT,
220+
modifier = Modifier
221+
.fillMaxWidth()
222+
)
200223

201-
VerticalSpacer(16.dp)
202-
}
224+
VerticalSpacer(8.dp)
225+
226+
PrimaryButton(
227+
text = stringResource(R.string.common__continue),
228+
onClick = onConfirmAmount,
229+
enabled = uiState.satsAmount != 0L && uiState.satsAmount <= uiState.maxAllowedToSend,
230+
isLoading = uiState.isLoading,
231+
modifier = Modifier.testTag("SpendingAmountContinue")
232+
)
233+
234+
VerticalSpacer(16.dp)
203235
}
204236
}
205237

@@ -208,6 +240,7 @@ private fun Content(
208240
private fun Preview() {
209241
AppThemeSurface {
210242
Content(
243+
isNodeRunning = true,
211244
uiState = TransferToSpendingUiState(input = "5 000"),
212245
currencies = CurrencyUiState(),
213246
onBackClick = {},
@@ -225,6 +258,25 @@ private fun Preview() {
225258
private fun Preview2() {
226259
AppThemeSurface {
227260
Content(
261+
isNodeRunning = true,
262+
uiState = TransferToSpendingUiState(input = "5 000"),
263+
currencies = CurrencyUiState(),
264+
onBackClick = {},
265+
onCloseClick = {},
266+
onClickQuarter = {},
267+
onClickMaxAmount = {},
268+
onConfirmAmount = {},
269+
onInputChange = {},
270+
)
271+
}
272+
}
273+
274+
@Preview(showBackground = true, device = NEXUS_5)
275+
@Composable
276+
private fun Preview3() {
277+
AppThemeSurface {
278+
Content(
279+
isNodeRunning = false,
228280
uiState = TransferToSpendingUiState(input = "5 000"),
229281
currencies = CurrencyUiState(),
230282
onBackClick = {},

app/src/main/java/to/bitkit/viewmodels/TransferViewModel.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
1818
import kotlinx.coroutines.flow.SharingStarted
1919
import kotlinx.coroutines.flow.StateFlow
2020
import kotlinx.coroutines.flow.asStateFlow
21+
import kotlinx.coroutines.flow.first
2122
import kotlinx.coroutines.flow.map
2223
import kotlinx.coroutines.flow.stateIn
2324
import kotlinx.coroutines.flow.update
@@ -63,6 +64,9 @@ class TransferViewModel @Inject constructor(
6364
val lightningSetupStep: StateFlow<Int> = settingsStore.data.map { it.lightningSetupStep }
6465
.stateIn(viewModelScope, SharingStarted.Lazily, 0)
6566

67+
val isNodeRunning = lightningRepo.lightningState.map { it.nodeStatus?.isRunning ?: false }
68+
.stateIn(viewModelScope, SharingStarted.Lazily, false)
69+
6670
private val _selectedChannelIdsState = MutableStateFlow<Set<String>>(emptySet())
6771
val selectedChannelIdsState = _selectedChannelIdsState.asStateFlow()
6872

@@ -137,7 +141,7 @@ class TransferViewModel @Inject constructor(
137141
_spendingUiState.update { it.copy(overrideSats = minAmount, isLoading = false) }
138142
return@launch
139143
}
140-
144+
// TODO Collect isNodeRunning here
141145
blocktankRepo.createOrder(_spendingUiState.value.satsAmount.toULong())
142146
.onSuccess { order ->
143147
settingsStore.update { it.copy(lightningSetupStep = 0) }

0 commit comments

Comments
 (0)