mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 21:07:04 +05:30
android: add swipe refresh
This commit is contained in:
parent
8e96225a9d
commit
3b2367273b
5 changed files with 28 additions and 19 deletions
|
@ -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)
|
||||||
|
|
|
@ -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,19 +45,18 @@ 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
|
||||||
NetworkPosts(
|
SwipeRefresh(
|
||||||
items = items,
|
state = rememberSwipeRefreshState(isRefreshing),
|
||||||
launchUrl = urlLauncher::launch,
|
onRefresh = viewModel::reloadPosts,
|
||||||
modifier = Modifier.padding(top = 16.dp),
|
) {
|
||||||
)
|
if (items.itemCount == 0) {
|
||||||
} else {
|
Box(modifier = Modifier.fillMaxSize())
|
||||||
Box(
|
} else {
|
||||||
modifier = Modifier.fillMaxSize(),
|
NetworkPosts(
|
||||||
) {
|
items = items,
|
||||||
CircularProgressIndicator(
|
launchUrl = urlLauncher::launch,
|
||||||
modifier = Modifier.size(64.dp).align(Alignment.Center),
|
modifier = Modifier.padding(top = 16.dp),
|
||||||
color = MaterialTheme.colors.secondary,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue