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

View file

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

View file

@ -9,11 +9,21 @@ import dev.msfjarvis.claw.api.LobstersApi
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class ClawViewModel @Inject constructor( class ClawViewModel
@Inject
constructor(
api: LobstersApi, api: LobstersApi,
) : ViewModel() { ) : 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 val pagerFlow
get() = pager.flow get() = pager.flow
fun reloadPosts() {
lastPagingSource?.invalidate()
}
} }

View file

@ -14,6 +14,7 @@ kotlin-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-co
kotlin-coroutines-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "coroutines" } kotlin-coroutines-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "coroutines" }
accompanist-insets = { module = "com.google.accompanist:accompanist-insets", version.ref = "accompanist" } accompanist-insets = { module = "com.google.accompanist:accompanist-insets", version.ref = "accompanist" }
accompanist-swiperefresh = { module = "com.google.accompanist:accompanist-swiperefresh", version.ref = "accompanist" }
accompanist-sysuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" } accompanist-sysuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" }
androidx-activity-compose = "androidx.activity:activity-compose:1.4.0-alpha02" androidx-activity-compose = "androidx.activity:activity-compose:1.4.0-alpha02"