android: add swipe refresh

This commit is contained in:
Harsh Shandilya 2021-09-25 18:36:30 +05:30
parent 8e96225a9d
commit 3b2367273b
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
5 changed files with 28 additions and 19 deletions

View file

@ -13,6 +13,7 @@ dependencies {
implementation(projects.api)
implementation(projects.common)
implementation(libs.accompanist.insets)
implementation(libs.accompanist.swiperefresh)
implementation(libs.accompanist.sysuicontroller)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.appcompat)

View file

@ -4,15 +4,12 @@ import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.CircularProgressIndicator
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.material.primarySurface
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
@ -20,6 +17,8 @@ import androidx.paging.LoadState
import androidx.paging.compose.collectAsLazyPagingItems
import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.statusBarsPadding
import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
import dev.msfjarvis.claw.common.theme.LobstersTheme
@ -46,19 +45,18 @@ fun LobstersApp(
topBar = { ClawAppBar(modifier = Modifier.statusBarsPadding()) },
modifier = Modifier,
) {
if (items.loadState.refresh != LoadState.Loading) {
NetworkPosts(
items = items,
launchUrl = urlLauncher::launch,
modifier = Modifier.padding(top = 16.dp),
)
} else {
Box(
modifier = Modifier.fillMaxSize(),
) {
CircularProgressIndicator(
modifier = Modifier.size(64.dp).align(Alignment.Center),
color = MaterialTheme.colors.secondary,
val isRefreshing = items.loadState.refresh == LoadState.Loading
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing),
onRefresh = viewModel::reloadPosts,
) {
if (items.itemCount == 0) {
Box(modifier = Modifier.fillMaxSize())
} else {
NetworkPosts(
items = items,
launchUrl = urlLauncher::launch,
modifier = Modifier.padding(top = 16.dp),
)
}
}

View file

@ -10,7 +10,6 @@ import androidx.paging.compose.items
import dev.msfjarvis.claw.android.ext.toDbModel
import dev.msfjarvis.claw.api.model.LobstersPost
import dev.msfjarvis.claw.common.posts.LobstersCard
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
@Composable
fun NetworkPosts(

View file

@ -9,11 +9,21 @@ import dev.msfjarvis.claw.api.LobstersApi
import javax.inject.Inject
@HiltViewModel
class ClawViewModel @Inject constructor(
class ClawViewModel
@Inject
constructor(
api: LobstersApi,
) : ViewModel() {
private val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) }
var lastPagingSource: LobstersPagingSource? = null
private val pager =
Pager(PagingConfig(20)) {
LobstersPagingSource(api::getHottestPosts).also { lastPagingSource = it }
}
val pagerFlow
get() = pager.flow
fun reloadPosts() {
lastPagingSource?.invalidate()
}
}