From b1148679e32c392bd2bfb8677896e015aa461cf0 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Tue, 30 Jan 2024 01:36:00 +0530 Subject: [PATCH] refactor: workaround poor read/saved state management I need a fresh set of eyes on this absolute mess --- .../claw/android/ui/lists/DatabasePosts.kt | 2 +- .../claw/android/ui/lists/LobstersListItem.kt | 9 ++++-- .../claw/android/ui/lists/NetworkPosts.kt | 9 ++++-- .../claw/android/viewmodel/ClawViewModel.kt | 3 -- .../claw/common/posts/LobstersCard.kt | 28 +++++++++++++++---- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt index 48e920fa..7a62df20 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt @@ -54,7 +54,7 @@ fun DatabasePosts( items.forEach { (month, posts) -> stickyHeader(contentType = "month-header") { MonthHeader(label = month) } items(items = posts, key = { it.shortId }, contentType = { "LobstersItem" }) { item -> - LobstersListItem(item = item, postActions = postActions) + LobstersListItem(item = item, refresh = {}, postActions = postActions) HorizontalDivider() } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt index 9a66136b..47dbd772 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt @@ -20,7 +20,12 @@ import me.saket.swipe.SwipeAction import me.saket.swipe.SwipeableActionsBox @Composable -fun LobstersListItem(item: UIPost, postActions: PostActions, modifier: Modifier = Modifier) { +fun LobstersListItem( + item: UIPost, + postActions: PostActions, + refresh: () -> Unit, + modifier: Modifier = Modifier, +) { val commentsAction = SwipeAction( icon = rememberVectorPainter(Icons.AutoMirrored.Filled.Reply), @@ -28,6 +33,6 @@ fun LobstersListItem(item: UIPost, postActions: PostActions, modifier: Modifier onSwipe = { postActions.viewCommentsPage(item.commentsUrl) }, ) SwipeableActionsBox(endActions = listOf(commentsAction)) { - LobstersCard(post = item, postActions = postActions, modifier = modifier) + LobstersCard(post = item, postActions = postActions, refresh = refresh, modifier = modifier) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt index cfd3f137..40ef9a4f 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt @@ -42,7 +42,7 @@ fun NetworkPosts( ) { ReportDrawnWhen { lazyPagingItems.itemCount > 0 } val refreshLoadState = lazyPagingItems.loadState.refresh - val isRefreshing = refreshLoadState == LoadState.Loading + val isRefreshing = refreshLoadState == LoadState.Loading && lazyPagingItems.itemCount == 0 val pullRefreshState = rememberPullRefreshState(isRefreshing, lazyPagingItems::refresh) Box(modifier = modifier.fillMaxSize().pullRefresh(pullRefreshState)) { if (lazyPagingItems.itemCount == 0 && refreshLoadState is LoadState.Error) { @@ -60,8 +60,11 @@ fun NetworkPosts( ) { index -> val item = lazyPagingItems[index] if (item != null) { - LobstersListItem(item = item, postActions = postActions) - + LobstersListItem( + item = item, + postActions = postActions, + refresh = { lazyPagingItems.refresh() }, + ) HorizontalDivider() } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index dc18da10..3252dbcf 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -84,7 +84,6 @@ constructor( .flow .map(::mapToUIPost) .cachedIn(viewModelScope) - val newestPosts = Pager( config = PagingConfig(pageSize = PAGE_SIZE), @@ -102,12 +101,10 @@ constructor( ) .flow .map(::mapToUIPost) - val savedPosts = savedPostsRepository.savedPosts .map { it.map(UIPost.Companion::fromSavedPost) } .shareIn(viewModelScope, started = SharingStarted.Lazily, Int.MAX_VALUE) - val savedPostsByMonth = savedPosts.map(::groupSavedPosts) var searchQuery by mutableStateOf("") diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt index 2df2ff61..8333dfd8 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt @@ -58,13 +58,23 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList @Composable -fun LobstersCard(post: UIPost, postActions: PostActions, modifier: Modifier = Modifier) { +fun LobstersCard( + post: UIPost, + postActions: PostActions, + refresh: () -> Unit, + modifier: Modifier = Modifier, +) { + var localReadState by remember(post) { mutableStateOf(post.isRead) } var localSavedState by remember(post) { mutableStateOf(post.isSaved) } Box( modifier = modifier .fillMaxWidth() - .clickable { postActions.viewPost(post.shortId, post.url, post.commentsUrl) } + .clickable { + postActions.viewPost(post.shortId, post.url, post.commentsUrl) + localReadState = true + refresh() + } .background(MaterialTheme.colorScheme.background) .padding(start = 16.dp, top = 16.dp, end = 4.dp, bottom = 16.dp) ) { @@ -72,7 +82,7 @@ fun LobstersCard(post: UIPost, postActions: PostActions, modifier: Modifier = Mo horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { - PostDetails(modifier = Modifier.weight(1f), post = post) + PostDetails(post = post, isRead = localReadState, modifier = Modifier.weight(1f)) Column( modifier = Modifier.wrapContentHeight(), verticalArrangement = Arrangement.spacedBy(8.dp), @@ -84,6 +94,7 @@ fun LobstersCard(post: UIPost, postActions: PostActions, modifier: Modifier = Mo Modifier.clickable(role = Role.Button) { localSavedState = !localSavedState postActions.toggleSave(post) + refresh() }, ) HorizontalDivider(modifier = Modifier.width(48.dp)) @@ -92,7 +103,11 @@ fun LobstersCard(post: UIPost, postActions: PostActions, modifier: Modifier = Mo modifier = Modifier.clickable( role = Role.Button, - onClick = { postActions.viewComments(post.shortId) }, + onClick = { + postActions.viewComments(post.shortId) + localReadState = true + refresh() + }, ), ) } @@ -101,9 +116,9 @@ fun LobstersCard(post: UIPost, postActions: PostActions, modifier: Modifier = Mo } @Composable -fun PostDetails(post: UIPost, modifier: Modifier = Modifier) { +fun PostDetails(post: UIPost, isRead: Boolean, modifier: Modifier = Modifier) { Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(8.dp)) { - PostTitle(title = post.title, isRead = post.isRead) + PostTitle(title = post.title, isRead = isRead) TagRow(tags = post.tags.toImmutableList()) Spacer(Modifier.height(4.dp)) Submitter( @@ -269,6 +284,7 @@ private fun LobstersCardPreview() { return LinkMetadata("", "") } }, + refresh = {}, ) } }