From f3b8edaf4356cb073a081a6639cb581497537f8a Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Sun, 24 Mar 2024 22:54:31 +0100 Subject: [PATCH] fix: multi community behaviour (#627) closes #206; closes #207 --- .../core/commonui/lemmyui/CommunityItem.kt | 9 ++++++++- .../ManageSubscriptionsScreen.kt | 14 +++++--------- .../detail/MultiCommunityMviModel.kt | 1 + .../detail/MultiCommunityScreen.kt | 11 +++++------ .../detail/MultiCommunityViewModel.kt | 14 ++++++++------ .../editor/MultiCommunityEditorScreen.kt | 19 ++++++++++++++----- .../editor/MultiCommunityEditorViewModel.kt | 2 +- .../utils/DefaultMultiCommunityPaginator.kt | 2 +- 8 files changed, 43 insertions(+), 29 deletions(-) diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt index 0a46c3258..499548baf 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/CommunityItem.kt @@ -52,6 +52,7 @@ fun CommunityItem( community: CommunityModel, modifier: Modifier = Modifier, small: Boolean = false, + noPadding: Boolean = false, autoLoadImages: Boolean = true, preferNicknames: Boolean = true, showSubscribers: Boolean = false, @@ -71,7 +72,13 @@ fun CommunityItem( var optionsMenuOpen by remember { mutableStateOf(false) } Row( - modifier = modifier.padding(Spacing.s), + modifier = modifier.then( + if (noPadding) { + Modifier + } else { + Modifier.padding(Spacing.s) + } + ), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(Spacing.xs), ) { diff --git a/unit/managesubscriptions/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/managesubscriptions/ManageSubscriptionsScreen.kt b/unit/managesubscriptions/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/managesubscriptions/ManageSubscriptionsScreen.kt index 4aba3d1e9..dd3d7ff93 100644 --- a/unit/managesubscriptions/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/managesubscriptions/ManageSubscriptionsScreen.kt +++ b/unit/managesubscriptions/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/managesubscriptions/ManageSubscriptionsScreen.kt @@ -253,7 +253,7 @@ class ManageSubscriptionsScreen : Screen { ) { Text( text = LocalXmlStrings.current.manageSubscriptionsHeaderMulticommunities, - style = MaterialTheme.typography.headlineSmall, + style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onBackground, ) Spacer(modifier = Modifier.weight(1f)) @@ -293,7 +293,7 @@ class ManageSubscriptionsScreen : Screen { ) this += Option( OptionId.Delete, - LocalXmlStrings.current.communityActionUnsubscribe, + LocalXmlStrings.current.commentActionDelete, ) }, onOptionSelected = rememberCallbackArgs(model) { optionId -> @@ -322,7 +322,7 @@ class ManageSubscriptionsScreen : Screen { ) { Text( text = LocalXmlStrings.current.manageSubscriptionsHeaderSubscriptions, - style = MaterialTheme.typography.headlineSmall, + style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onBackground, ) } @@ -361,16 +361,12 @@ class ManageSubscriptionsScreen : Screen { onOptionSelected = rememberCallbackArgs(model) { optionId -> when (optionId) { OptionId.Unsubscribe -> { - model.reduce( - ManageSubscriptionsMviModel.Intent.Unsubscribe(community.id), - ) + model.reduce(ManageSubscriptionsMviModel.Intent.Unsubscribe(community.id)) } OptionId.Favorite -> { model.reduce( - ManageSubscriptionsMviModel.Intent.ToggleFavorite( - community.id - ) + ManageSubscriptionsMviModel.Intent.ToggleFavorite(community.id) ) } diff --git a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityMviModel.kt b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityMviModel.kt index d1be9f67f..4a7ff6cff 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityMviModel.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityMviModel.kt @@ -28,6 +28,7 @@ interface MultiCommunityMviModel : data class UiState( val currentUserId: Int? = null, + val initial: Boolean = true, val refreshing: Boolean = false, val loading: Boolean = false, val canFetchMore: Boolean = true, diff --git a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityScreen.kt b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityScreen.kt index e9728917b..4cbde4e6e 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityScreen.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityScreen.kt @@ -105,9 +105,7 @@ class MultiCommunityScreen( @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) @Composable override fun Content() { - val model = getScreenModel(parameters = { - parametersOf(communityId) - }) + val model = getScreenModel(parameters = { parametersOf(communityId) }) val uiState by model.uiState.collectAsState() val topAppBarState = rememberTopAppBarState() val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(topAppBarState) @@ -287,8 +285,9 @@ class MultiCommunityScreen( } } items( - uiState.posts, - { it.id.toString() + (it.updateDate ?: it.publishDate) }) { post -> + items = uiState.posts, + key = { it.id.toString() + (it.updateDate ?: it.publishDate) }, + ) { post -> LaunchedEffect(post.id) { if (settings.markAsReadWhileScrolling && !post.read) { model.reduce(MultiCommunityMviModel.Intent.MarkAsRead(post.id)) @@ -578,7 +577,7 @@ class MultiCommunityScreen( } } - if (uiState.posts.isEmpty() && !uiState.loading) { + if (uiState.posts.isEmpty() && !uiState.initial) { item { Text( modifier = Modifier.fillMaxWidth().padding(top = Spacing.xs), diff --git a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt index c69c51e97..47de860b1 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/detail/MultiCommunityViewModel.kt @@ -89,6 +89,9 @@ class MultiCommunityViewModel( notificationCenter.subscribe(NotificationCenterEvent.CopyText::class).onEach { emitEffect(MultiCommunityMviModel.Effect.TriggerCopy(it.value)) }.launchIn(this) + identityRepository.isLogged.onEach { logged -> + updateState { it.copy(isLogged = logged ?: false) } + }.launchIn(this) if (uiState.value.currentUserId == null) { val auth = identityRepository.authToken.value.orEmpty() @@ -106,7 +109,7 @@ class MultiCommunityViewModel( ) } paginator.setCommunities(uiState.value.community.communityIds) - refresh() + refresh(initial = true) } } } @@ -143,9 +146,7 @@ class MultiCommunityViewModel( if (intent.feedback) { hapticFeedback.vibrate() } - toggleUpVote( - post = uiState.value.posts.first { it.id == intent.id }, - ) + toggleUpVote(post = uiState.value.posts.first { it.id == intent.id }) } MultiCommunityMviModel.Intent.ClearRead -> clearRead() @@ -163,10 +164,10 @@ class MultiCommunityViewModel( } } - private fun refresh() { + private fun refresh(initial: Boolean = false) { hideReadPosts = false paginator.reset() - updateState { it.copy(canFetchMore = true, refreshing = true) } + updateState { it.copy(canFetchMore = true, refreshing = true, initial = initial) } loadNextPage() } @@ -221,6 +222,7 @@ class MultiCommunityViewModel( loading = false, canFetchMore = canFetchMore, refreshing = false, + initial = newPosts.isEmpty(), ) } } diff --git a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt index 462914fa7..35418de1e 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorScreen.kt @@ -273,8 +273,14 @@ class MultiCommunityEditorScreen( } Spacer(modifier = Modifier.height(Spacing.s)) - Column { - Text(text = LocalXmlStrings.current.multiCommunityEditorCommunities) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = Spacing.s), + ) { + Text( + text = LocalXmlStrings.current.multiCommunityEditorCommunities + ) // search field TextField( @@ -314,8 +320,9 @@ class MultiCommunityEditorScreen( ) } LazyColumn( - modifier = Modifier.fillMaxWidth() - .padding(horizontal = Spacing.m) + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = Spacing.s) .weight(1f), verticalArrangement = Arrangement.spacedBy(Spacing.xxs), ) { @@ -326,8 +333,10 @@ class MultiCommunityEditorScreen( verticalAlignment = Alignment.CenterVertically, ) { CommunityItem( - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .weight(1f) .background(MaterialTheme.colorScheme.background), + noPadding = true, community = community, preferNicknames = uiState.preferNicknames, ) diff --git a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorViewModel.kt b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorViewModel.kt index a683aeb38..2c5ec135f 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorViewModel.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/editor/MultiCommunityEditorViewModel.kt @@ -105,7 +105,7 @@ class MultiCommunityEditorViewModel( private fun filterCommunities(): List> { val searchText = uiState.value.searchText val res = if (searchText.isNotEmpty()) { - communities.filter { it.first.name.contains(searchText) } + communities.filter { it.first.name.contains(other = searchText, ignoreCase = true) } } else { communities } diff --git a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/utils/DefaultMultiCommunityPaginator.kt b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/utils/DefaultMultiCommunityPaginator.kt index 944783807..05499b11e 100644 --- a/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/utils/DefaultMultiCommunityPaginator.kt +++ b/unit/multicommunity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/multicommunity/utils/DefaultMultiCommunityPaginator.kt @@ -40,5 +40,5 @@ class DefaultMultiCommunityPaginator( addAll(elements) } } - }.sortedBy { it.publishDate } + }.sortedByDescending { it.publishDate } }