Skip to content

Commit 73da7e6

Browse files
committed
feat: Add pull to refresh on home screen
1 parent c0f0dd8 commit 73da7e6

File tree

4 files changed

+36
-53
lines changed

4 files changed

+36
-53
lines changed

app/src/main/java/to/bitkit/ui/scaffold/AppScaffold.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.imePadding
66
import androidx.compose.foundation.layout.padding
77
import androidx.compose.material.icons.Icons
88
import androidx.compose.material.icons.filled.Bolt
9-
import androidx.compose.material.icons.filled.Refresh
109
import androidx.compose.material.icons.outlined.Settings
1110
import androidx.compose.material3.ExperimentalMaterial3Api
1211
import androidx.compose.material3.Icon
@@ -26,7 +25,6 @@ import to.bitkit.ui.navigateToSettings
2625
fun AppScaffold(
2726
navController: NavController,
2827
titleText: String,
29-
onRefresh: () -> Unit,
3028
content: @Composable () -> Unit,
3129
) {
3230
Scaffold(
@@ -37,12 +35,6 @@ fun AppScaffold(
3735
Title(text = titleText)
3836
},
3937
actions = {
40-
IconButton(onRefresh) {
41-
Icon(
42-
imageVector = Icons.Default.Refresh,
43-
contentDescription = stringResource(R.string.sync),
44-
)
45-
}
4638
IconButton(onClick = navController::navigateToNodeState) {
4739
Icon(
4840
imageVector = Icons.Default.Bolt,

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

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import androidx.compose.foundation.layout.fillMaxWidth
1515
import androidx.compose.foundation.layout.height
1616
import androidx.compose.foundation.layout.padding
1717
import androidx.compose.foundation.layout.systemBarsPadding
18+
import androidx.compose.foundation.rememberScrollState
19+
import androidx.compose.foundation.verticalScroll
1820
import androidx.compose.material.ExperimentalMaterialApi
1921
import androidx.compose.material.pullrefresh.PullRefreshIndicator
2022
import androidx.compose.material.pullrefresh.pullRefresh
@@ -27,7 +29,6 @@ import androidx.compose.runtime.derivedStateOf
2729
import androidx.compose.runtime.getValue
2830
import androidx.compose.runtime.mutableStateOf
2931
import androidx.compose.runtime.remember
30-
import androidx.compose.runtime.rememberCoroutineScope
3132
import androidx.compose.runtime.setValue
3233
import androidx.compose.ui.Alignment
3334
import androidx.compose.ui.Modifier
@@ -40,8 +41,6 @@ import androidx.navigation.NavController
4041
import androidx.navigation.compose.NavHost
4142
import androidx.navigation.compose.composable
4243
import androidx.navigation.compose.rememberNavController
43-
import kotlinx.coroutines.delay
44-
import kotlinx.coroutines.launch
4544
import kotlinx.serialization.Serializable
4645
import to.bitkit.R
4746
import to.bitkit.ext.requiresPermission
@@ -72,6 +71,7 @@ import to.bitkit.ui.utils.screenSlideIn
7271
import to.bitkit.ui.utils.screenSlideOut
7372
import to.bitkit.ui.utils.withAccent
7473
import to.bitkit.viewmodels.AppViewModel
74+
import to.bitkit.viewmodels.MainUiState
7575
import to.bitkit.viewmodels.WalletViewModel
7676

7777
@Composable
@@ -80,7 +80,7 @@ fun HomeScreen(
8080
appViewModel: AppViewModel,
8181
rootNavController: NavController,
8282
) {
83-
val uiState by walletViewModel.uiState.collectAsState()
83+
val uiState: MainUiState by walletViewModel.uiState.collectAsState()
8484
val currentSheet by appViewModel.currentSheet
8585
SheetHost(
8686
shouldExpand = currentSheet != null,
@@ -110,13 +110,14 @@ fun HomeScreen(
110110
val walletNavController = rememberNavController()
111111
NavHost(
112112
navController = walletNavController,
113-
startDestination = HomeRoutes.Home
113+
startDestination = HomeRoutes.Home,
114114
) {
115115
composable<HomeRoutes.Home> {
116116
HomeContentView(
117+
uiState = uiState,
117118
rootNavController = rootNavController,
118119
walletNavController = walletNavController,
119-
onRefresh = walletViewModel::refreshState,
120+
onRefresh = walletViewModel::onPullToRefresh,
120121
)
121122
}
122123
composable<HomeRoutes.Savings>(
@@ -172,14 +173,14 @@ fun HomeScreen(
172173
@OptIn(ExperimentalMaterialApi::class)
173174
@Composable
174175
private fun HomeContentView(
176+
uiState: MainUiState,
175177
rootNavController: NavController,
176178
walletNavController: NavController,
177179
onRefresh: () -> Unit,
178180
) {
179181
AppScaffold(
180182
navController = rootNavController,
181183
titleText = "Your Name",
182-
onRefresh = onRefresh,
183184
) {
184185
RequestNotificationPermissions()
185186
val balances = LocalBalances.current
@@ -190,22 +191,7 @@ private fun HomeContentView(
190191
showEmptyStateSetting && balances.totalSats == 0uL
191192
}
192193
}
193-
194-
val scope = rememberCoroutineScope()
195-
var isRefreshing by remember { mutableStateOf(false) }
196-
197-
fun refresh() = scope.launch {
198-
// TODO use viewmodel state?!
199-
isRefreshing = true
200-
onRefresh()
201-
delay(1500)
202-
isRefreshing = false
203-
}
204-
205-
val pullRefreshState = rememberPullRefreshState(
206-
refreshing = isRefreshing,
207-
onRefresh = ::refresh
208-
)
194+
val pullRefreshState = rememberPullRefreshState(refreshing = uiState.isRefreshing, onRefresh = onRefresh)
209195

210196
Box(
211197
modifier = Modifier
@@ -216,6 +202,7 @@ private fun HomeContentView(
216202
modifier = Modifier
217203
.padding(horizontal = 16.dp)
218204
.fillMaxSize()
205+
.verticalScroll(rememberScrollState())
219206
) {
220207
BalanceHeaderView(sats = balances.totalSats.toLong(), modifier = Modifier.fillMaxWidth())
221208
if (!showEmptyState) {
@@ -266,7 +253,7 @@ private fun HomeContentView(
266253
}
267254

268255
PullRefreshIndicator(
269-
refreshing = isRefreshing,
256+
refreshing = uiState.isRefreshing,
270257
state = pullRefreshState,
271258
modifier = Modifier.align(Alignment.TopCenter)
272259
)
@@ -310,6 +297,7 @@ object HomeRoutes {
310297
private fun HomeContentViewPreview() {
311298
AppThemeSurface {
312299
HomeContentView(
300+
uiState = MainUiState(),
313301
rootNavController = rememberNavController(),
314302
walletNavController = rememberNavController(),
315303
onRefresh = {},

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

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.height
88
import androidx.compose.foundation.layout.padding
99
import androidx.compose.foundation.layout.wrapContentWidth
1010
import androidx.compose.foundation.lazy.LazyColumn
11-
import androidx.compose.foundation.lazy.items
1211
import androidx.compose.foundation.lazy.itemsIndexed
1312
import androidx.compose.material3.ExperimentalMaterial3Api
1413
import androidx.compose.material3.HorizontalDivider
@@ -177,32 +176,22 @@ fun ActivityList(
177176
onActivityItemClick: (String) -> Unit,
178177
) {
179178
if (items != null) {
180-
LazyColumn(
179+
Column(
181180
horizontalAlignment = Alignment.CenterHorizontally,
182181
modifier = Modifier.fillMaxWidth()
183182
) {
184-
items(
185-
items = items,
186-
key = {
187-
when (it) {
188-
is Activity.Onchain -> it.v1.id
189-
is Activity.Lightning -> it.v1.id
190-
}
191-
}
192-
) { item ->
183+
items.forEach { item ->
193184
ActivityRow(item, onActivityItemClick)
194185
HorizontalDivider(color = Colors.White10)
195186
}
196-
item {
197-
if (items.isEmpty()) {
198-
BodyMSB(stringResource(R.string.wallet__activity_no), Modifier.padding(16.dp))
199-
} else {
200-
TertiaryButton(
201-
text = stringResource(R.string.wallet__activity_show_all),
202-
onClick = onAllActivityClick,
203-
modifier = Modifier.wrapContentWidth().padding(top = 8.dp)
204-
)
205-
}
187+
if (items.isEmpty()) {
188+
BodyMSB(stringResource(R.string.wallet__activity_no), Modifier.padding(16.dp))
189+
} else {
190+
TertiaryButton(
191+
text = stringResource(R.string.wallet__activity_show_all),
192+
onClick = onAllActivityClick,
193+
modifier = Modifier.wrapContentWidth().padding(top = 8.dp)
194+
)
206195
}
207196
}
208197
} else {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,19 @@ class WalletViewModel @Inject constructor(
218218
}
219219
}
220220

221+
fun onPullToRefresh() {
222+
viewModelScope.launch {
223+
_uiState.update { it.copy(isRefreshing = true) }
224+
try {
225+
sync()
226+
} catch (e: Throwable) {
227+
ToastEventBus.send(e)
228+
} finally {
229+
_uiState.update { it.copy(isRefreshing = false) }
230+
}
231+
}
232+
}
233+
221234
private suspend fun registerForNotificationsIfNeeded() {
222235
val token = firebaseMessaging.token.await()
223236
val cachedToken = keychain.loadString(Keychain.Key.PUSH_NOTIFICATION_TOKEN.name)
@@ -483,6 +496,7 @@ data class MainUiState(
483496
val nodeLifecycleState: NodeLifecycleState = NodeLifecycleState.Stopped,
484497
val peers: List<LnPeer> = emptyList(),
485498
val channels: List<ChannelDetails> = emptyList(),
499+
val isRefreshing: Boolean = false,
486500
)
487501

488502
// endregion

0 commit comments

Comments
 (0)