-
Notifications
You must be signed in to change notification settings - Fork 1
/
PullRefreshBox.kt
37 lines (35 loc) · 1.45 KB
/
PullRefreshBox.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.dluvian.voyage.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.pulltorefresh.PullToRefreshContainer
import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import com.dluvian.voyage.core.ComposableContent
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PullRefreshBox(isRefreshing: Boolean, onRefresh: () -> Unit, content: ComposableContent) {
val pullRefreshState = rememberPullToRefreshState()
if (pullRefreshState.isRefreshing) {
LaunchedEffect(Unit) {
if (!isRefreshing) onRefresh()
}
}
LaunchedEffect(isRefreshing) {
if (isRefreshing) pullRefreshState.startRefresh()
else pullRefreshState.endRefresh()
}
Box(Modifier.nestedScroll(pullRefreshState.nestedScrollConnection)) {
content()
PullToRefreshContainer(
modifier = Modifier.align(Alignment.TopCenter),
state = pullRefreshState,
containerColor = PullToRefreshDefaults.containerColor,
contentColor = PullToRefreshDefaults.contentColor
)
}
}