Skip to content

Commit 0d84c85

Browse files
committed
pull to refresh
1 parent 42f9d91 commit 0d84c85

File tree

2 files changed

+21
-6
lines changed
  • shared-compose-ui/src/commonMain/kotlin/com/softartdev/notedelight/ui
  • shared/src/commonMain/kotlin/com/softartdev/notedelight/shared/presentation/main

2 files changed

+21
-6
lines changed

shared-compose-ui/src/commonMain/kotlin/com/softartdev/notedelight/ui/MainScreen.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package com.softartdev.notedelight.ui
44

55
import androidx.compose.desktop.ui.tooling.preview.Preview
6-
import androidx.compose.foundation.layout.Box
76
import androidx.compose.foundation.layout.PaddingValues
87
import androidx.compose.foundation.layout.padding
98
import androidx.compose.material.icons.Icons
@@ -18,11 +17,15 @@ import androidx.compose.material3.SnackbarHost
1817
import androidx.compose.material3.SnackbarHostState
1918
import androidx.compose.material3.Text
2019
import androidx.compose.material3.TopAppBar
20+
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
21+
import androidx.compose.material3.pulltorefresh.PullToRefreshState
22+
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
2123
import androidx.compose.runtime.Composable
2224
import androidx.compose.runtime.LaunchedEffect
2325
import androidx.compose.runtime.MutableState
2426
import androidx.compose.runtime.State
2527
import androidx.compose.runtime.collectAsState
28+
import androidx.compose.runtime.derivedStateOf
2629
import androidx.compose.runtime.mutableStateOf
2730
import androidx.compose.runtime.remember
2831
import androidx.compose.ui.Alignment
@@ -57,6 +60,7 @@ fun MainScreen(
5760
noteListState = noteListState,
5861
onItemClicked = mainViewModel::onNoteClicked,
5962
onSettingsClick = mainViewModel::onSettingsClicked,
63+
onRefresh = mainViewModel::updateNotes,
6064
snackbarHostState = snackbarHostState,
6165
)
6266
}
@@ -66,7 +70,10 @@ fun MainScreen(
6670
noteListState: State<NoteListResult>,
6771
onItemClicked: (id: Long) -> Unit = {},
6872
onSettingsClick: () -> Unit = {},
73+
onRefresh: () -> Unit = {},
6974
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
75+
pullToRefreshState: PullToRefreshState = rememberPullToRefreshState(),
76+
refreshState: State<Boolean> = remember { derivedStateOf { noteListState.value is NoteListResult.Loading } }
7077
) = Scaffold(
7178
topBar = {
7279
TopAppBar(
@@ -78,9 +85,18 @@ fun MainScreen(
7885
contentDescription = stringResource(Res.string.settings)
7986
)
8087
}
81-
})
88+
}
89+
)
8290
}, content = { paddingValues: PaddingValues ->
83-
Box(modifier = Modifier.padding(paddingValues)) {
91+
PullToRefreshBox(
92+
modifier = Modifier.padding(paddingValues),
93+
isRefreshing = refreshState.value,
94+
onRefresh = onRefresh,
95+
state = pullToRefreshState
96+
) {
97+
LaunchedEffect(key1 = noteListState.value) {
98+
pullToRefreshState.animateToHidden()
99+
}
84100
when (val noteListResult = noteListState.value) {
85101
is NoteListResult.Loading -> Loader(modifier = Modifier.align(Alignment.Center))
86102
is NoteListResult.Success -> {
@@ -104,8 +120,7 @@ fun MainScreen(
104120
icon = { Icon(Icons.Default.Add, contentDescription = Icons.Default.Add.name) },
105121
modifier = Modifier.clearAndSetSemantics { contentDescription = text }
106122
)
107-
},
108-
snackbarHost = { SnackbarHost(snackbarHostState) },
123+
}, snackbarHost = { SnackbarHost(snackbarHostState) },
109124
)
110125

111126
@Preview

shared/src/commonMain/kotlin/com/softartdev/notedelight/shared/presentation/main/MainViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class MainViewModel(
4747
}
4848
}
4949

50-
private fun updateNotes() {
50+
fun updateNotes() {
5151
job?.cancel()
5252
job = viewModelScope.launch(coroutineDispatchers.io) {
5353
try {

0 commit comments

Comments
 (0)