Skip to content

Commit 7f697fb

Browse files
authored
Merge pull request #80 from synonymdev/feat/home-pull-to-refresh
Pull to refresh on home screen
2 parents c96add6 + 73da7e6 commit 7f697fb

File tree

4 files changed

+52
-34
lines changed

4 files changed

+52
-34
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: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ 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
20+
import androidx.compose.material.ExperimentalMaterialApi
21+
import androidx.compose.material.pullrefresh.PullRefreshIndicator
22+
import androidx.compose.material.pullrefresh.pullRefresh
23+
import androidx.compose.material.pullrefresh.rememberPullRefreshState
1824
import androidx.compose.material3.VerticalDivider
1925
import androidx.compose.runtime.Composable
2026
import androidx.compose.runtime.LaunchedEffect
@@ -65,6 +71,7 @@ import to.bitkit.ui.utils.screenSlideIn
6571
import to.bitkit.ui.utils.screenSlideOut
6672
import to.bitkit.ui.utils.withAccent
6773
import to.bitkit.viewmodels.AppViewModel
74+
import to.bitkit.viewmodels.MainUiState
6875
import to.bitkit.viewmodels.WalletViewModel
6976

7077
@Composable
@@ -73,7 +80,7 @@ fun HomeScreen(
7380
appViewModel: AppViewModel,
7481
rootNavController: NavController,
7582
) {
76-
val uiState by walletViewModel.uiState.collectAsState()
83+
val uiState: MainUiState by walletViewModel.uiState.collectAsState()
7784
val currentSheet by appViewModel.currentSheet
7885
SheetHost(
7986
shouldExpand = currentSheet != null,
@@ -103,13 +110,14 @@ fun HomeScreen(
103110
val walletNavController = rememberNavController()
104111
NavHost(
105112
navController = walletNavController,
106-
startDestination = HomeRoutes.Home
113+
startDestination = HomeRoutes.Home,
107114
) {
108115
composable<HomeRoutes.Home> {
109116
HomeContentView(
117+
uiState = uiState,
110118
rootNavController = rootNavController,
111119
walletNavController = walletNavController,
112-
onRefresh = walletViewModel::refreshState,
120+
onRefresh = walletViewModel::onPullToRefresh,
113121
)
114122
}
115123
composable<HomeRoutes.Savings>(
@@ -162,16 +170,17 @@ fun HomeScreen(
162170
}
163171
}
164172

173+
@OptIn(ExperimentalMaterialApi::class)
165174
@Composable
166175
private fun HomeContentView(
176+
uiState: MainUiState,
167177
rootNavController: NavController,
168178
walletNavController: NavController,
169179
onRefresh: () -> Unit,
170180
) {
171181
AppScaffold(
172182
navController = rootNavController,
173183
titleText = "Your Name",
174-
onRefresh = onRefresh,
175184
) {
176185
RequestNotificationPermissions()
177186
val balances = LocalBalances.current
@@ -182,11 +191,18 @@ private fun HomeContentView(
182191
showEmptyStateSetting && balances.totalSats == 0uL
183192
}
184193
}
185-
Box(modifier = Modifier.fillMaxSize()) {
194+
val pullRefreshState = rememberPullRefreshState(refreshing = uiState.isRefreshing, onRefresh = onRefresh)
195+
196+
Box(
197+
modifier = Modifier
198+
.fillMaxSize()
199+
.pullRefresh(pullRefreshState)
200+
) {
186201
Column(
187202
modifier = Modifier
188203
.padding(horizontal = 16.dp)
189204
.fillMaxSize()
205+
.verticalScroll(rememberScrollState())
190206
) {
191207
BalanceHeaderView(sats = balances.totalSats.toLong(), modifier = Modifier.fillMaxWidth())
192208
if (!showEmptyState) {
@@ -235,6 +251,12 @@ private fun HomeContentView(
235251
.align(Alignment.BottomCenter)
236252
)
237253
}
254+
255+
PullRefreshIndicator(
256+
refreshing = uiState.isRefreshing,
257+
state = pullRefreshState,
258+
modifier = Modifier.align(Alignment.TopCenter)
259+
)
238260
}
239261
}
240262
}
@@ -275,6 +297,7 @@ object HomeRoutes {
275297
private fun HomeContentViewPreview() {
276298
AppThemeSurface {
277299
HomeContentView(
300+
uiState = MainUiState(),
278301
rootNavController = rememberNavController(),
279302
walletNavController = rememberNavController(),
280303
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)