33package com.softartdev.notedelight.ui
44
55import androidx.compose.desktop.ui.tooling.preview.Preview
6- import androidx.compose.foundation.layout.Box
76import androidx.compose.foundation.layout.PaddingValues
87import androidx.compose.foundation.layout.padding
98import androidx.compose.material.icons.Icons
@@ -18,11 +17,15 @@ import androidx.compose.material3.SnackbarHost
1817import androidx.compose.material3.SnackbarHostState
1918import androidx.compose.material3.Text
2019import 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
2123import androidx.compose.runtime.Composable
2224import androidx.compose.runtime.LaunchedEffect
2325import androidx.compose.runtime.MutableState
2426import androidx.compose.runtime.State
2527import androidx.compose.runtime.collectAsState
28+ import androidx.compose.runtime.derivedStateOf
2629import androidx.compose.runtime.mutableStateOf
2730import androidx.compose.runtime.remember
2831import 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
0 commit comments