mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-17 20:17:02 +05:30
app: switch to PullToRefresh
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
a28d5085bb
commit
697e806dd8
4 changed files with 43 additions and 27 deletions
|
@ -55,6 +55,7 @@ dependencies {
|
||||||
implementation(Dependencies.ThirdParty.accompanist)
|
implementation(Dependencies.ThirdParty.accompanist)
|
||||||
implementation(Dependencies.ThirdParty.composeFlowLayout)
|
implementation(Dependencies.ThirdParty.composeFlowLayout)
|
||||||
implementation(Dependencies.ThirdParty.Moshi.lib)
|
implementation(Dependencies.ThirdParty.Moshi.lib)
|
||||||
|
implementation(Dependencies.ThirdParty.pullToRefresh)
|
||||||
implementation(Dependencies.ThirdParty.Retrofit.moshi)
|
implementation(Dependencies.ThirdParty.Retrofit.moshi)
|
||||||
implementation(Dependencies.ThirdParty.SQLDelight.androidDriver)
|
implementation(Dependencies.ThirdParty.SQLDelight.androidDriver)
|
||||||
testImplementation(Dependencies.Testing.junit)
|
testImplementation(Dependencies.Testing.junit)
|
||||||
|
|
|
@ -64,9 +64,10 @@ fun LobstersApp() {
|
||||||
HottestPosts(
|
HottestPosts(
|
||||||
posts = hottestPosts,
|
posts = hottestPosts,
|
||||||
listState = hottestPostsListState,
|
listState = hottestPostsListState,
|
||||||
|
modifier = Modifier.padding(bottom = innerPadding.calculateBottomPadding()),
|
||||||
isPostSaved = viewModel::isPostSaved,
|
isPostSaved = viewModel::isPostSaved,
|
||||||
saveAction = viewModel::toggleSave,
|
saveAction = viewModel::toggleSave,
|
||||||
modifier = Modifier.padding(bottom = innerPadding.calculateBottomPadding()),
|
refreshAction = viewModel::reloadPosts,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
composable(Destination.Saved.route) {
|
composable(Destination.Saved.route) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.paging.LoadState
|
import androidx.paging.LoadState
|
||||||
import androidx.paging.compose.LazyPagingItems
|
import androidx.paging.compose.LazyPagingItems
|
||||||
import androidx.paging.compose.items
|
import androidx.paging.compose.items
|
||||||
|
import com.puculek.pulltorefresh.PullToRefresh
|
||||||
import dev.msfjarvis.lobsters.data.local.SavedPost
|
import dev.msfjarvis.lobsters.data.local.SavedPost
|
||||||
import dev.msfjarvis.lobsters.model.LobstersPost
|
import dev.msfjarvis.lobsters.model.LobstersPost
|
||||||
import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher
|
import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher
|
||||||
|
@ -20,39 +21,51 @@ import dev.msfjarvis.lobsters.util.toDbModel
|
||||||
fun HottestPosts(
|
fun HottestPosts(
|
||||||
posts: LazyPagingItems<LobstersPost>,
|
posts: LazyPagingItems<LobstersPost>,
|
||||||
listState: LazyListState,
|
listState: LazyListState,
|
||||||
isPostSaved: (String) -> Boolean,
|
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
isPostSaved: (String) -> Boolean,
|
||||||
saveAction: (SavedPost) -> Unit,
|
saveAction: (SavedPost) -> Unit,
|
||||||
|
refreshAction: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val urlLauncher = LocalUrlLauncher.current
|
val urlLauncher = LocalUrlLauncher.current
|
||||||
|
var isRefreshing by mutableStateOf(false)
|
||||||
|
|
||||||
if (posts.loadState.refresh == LoadState.Loading) {
|
PullToRefresh(
|
||||||
LazyColumn {
|
isRefreshing = isRefreshing,
|
||||||
items(15) {
|
onRefresh = {
|
||||||
LoadingLobstersItem()
|
if (posts.loadState.refresh != LoadState.Loading) {
|
||||||
|
isRefreshing = isRefreshing.not()
|
||||||
|
refreshAction()
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
} else {
|
) {
|
||||||
LazyColumn(
|
if (posts.loadState.refresh == LoadState.Loading) {
|
||||||
state = listState,
|
LazyColumn {
|
||||||
modifier = Modifier.then(modifier),
|
items(15) {
|
||||||
) {
|
LoadingLobstersItem()
|
||||||
items(posts) { item ->
|
}
|
||||||
if (item != null) {
|
}
|
||||||
@Suppress("NAME_SHADOWING")
|
} else {
|
||||||
val item = item.toDbModel()
|
LazyColumn(
|
||||||
var isSaved by remember(item.shortId) { mutableStateOf(isPostSaved(item.shortId)) }
|
state = listState,
|
||||||
|
modifier = Modifier.then(modifier),
|
||||||
|
) {
|
||||||
|
items(posts) { item ->
|
||||||
|
if (item != null) {
|
||||||
|
@Suppress("NAME_SHADOWING")
|
||||||
|
val item = item.toDbModel()
|
||||||
|
var isSaved by remember(item.shortId) { mutableStateOf(isPostSaved(item.shortId)) }
|
||||||
|
|
||||||
LobstersItem(
|
LobstersItem(
|
||||||
post = item,
|
post = item,
|
||||||
isSaved = isSaved,
|
isSaved = isSaved,
|
||||||
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
|
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
|
||||||
onLongClick = { urlLauncher.launch(item.commentsUrl) },
|
onLongClick = { urlLauncher.launch(item.commentsUrl) },
|
||||||
onSaveButtonClick = {
|
onSaveButtonClick = {
|
||||||
isSaved = isSaved.not()
|
isSaved = isSaved.not()
|
||||||
saveAction.invoke(item)
|
saveAction.invoke(item)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ object Dependencies {
|
||||||
|
|
||||||
const val accompanist = "dev.chrisbanes.accompanist:accompanist-coil:0.6.2"
|
const val accompanist = "dev.chrisbanes.accompanist:accompanist-coil:0.6.2"
|
||||||
const val composeFlowLayout = "com.star-zero:compose-flowlayout:0.0.1"
|
const val composeFlowLayout = "com.star-zero:compose-flowlayout:0.0.1"
|
||||||
|
const val pullToRefresh = "com.puculek.pulltorefresh:pull-to-refresh-compose:1.0.0"
|
||||||
|
|
||||||
object Moshi {
|
object Moshi {
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue