@@ -15,6 +15,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
1515import androidx.compose.foundation.layout.height
1616import androidx.compose.foundation.layout.padding
1717import androidx.compose.foundation.layout.systemBarsPadding
18+ import androidx.compose.material.ExperimentalMaterialApi
19+ import androidx.compose.material.pullrefresh.PullRefreshIndicator
20+ import androidx.compose.material.pullrefresh.pullRefresh
21+ import androidx.compose.material.pullrefresh.rememberPullRefreshState
1822import androidx.compose.material3.VerticalDivider
1923import androidx.compose.runtime.Composable
2024import androidx.compose.runtime.LaunchedEffect
@@ -23,6 +27,7 @@ import androidx.compose.runtime.derivedStateOf
2327import androidx.compose.runtime.getValue
2428import androidx.compose.runtime.mutableStateOf
2529import androidx.compose.runtime.remember
30+ import androidx.compose.runtime.rememberCoroutineScope
2631import androidx.compose.runtime.setValue
2732import androidx.compose.ui.Alignment
2833import androidx.compose.ui.Modifier
@@ -35,6 +40,8 @@ import androidx.navigation.NavController
3540import androidx.navigation.compose.NavHost
3641import androidx.navigation.compose.composable
3742import androidx.navigation.compose.rememberNavController
43+ import kotlinx.coroutines.delay
44+ import kotlinx.coroutines.launch
3845import kotlinx.serialization.Serializable
3946import to.bitkit.R
4047import to.bitkit.ext.requiresPermission
@@ -162,6 +169,7 @@ fun HomeScreen(
162169 }
163170}
164171
172+ @OptIn(ExperimentalMaterialApi ::class )
165173@Composable
166174private fun HomeContentView (
167175 rootNavController : NavController ,
@@ -182,7 +190,28 @@ private fun HomeContentView(
182190 showEmptyStateSetting && balances.totalSats == 0uL
183191 }
184192 }
185- Box (modifier = Modifier .fillMaxSize()) {
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+ )
209+
210+ Box (
211+ modifier = Modifier
212+ .fillMaxSize()
213+ .pullRefresh(pullRefreshState)
214+ ) {
186215 Column (
187216 modifier = Modifier
188217 .padding(horizontal = 16 .dp)
@@ -235,6 +264,12 @@ private fun HomeContentView(
235264 .align(Alignment .BottomCenter )
236265 )
237266 }
267+
268+ PullRefreshIndicator (
269+ refreshing = isRefreshing,
270+ state = pullRefreshState,
271+ modifier = Modifier .align(Alignment .TopCenter )
272+ )
238273 }
239274 }
240275}
0 commit comments