fix(inbox): several fixes (#178)

* fix: chat fonts

* fix: chat loading

* fix: count messages in inbox unread
This commit is contained in:
Diego Beraldin 2023-11-29 21:22:42 +01:00 committed by GitHub
parent f52c4682bf
commit 7aecc6d741
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 67 additions and 23 deletions

View File

@ -93,12 +93,18 @@ internal fun getTypography(
fontSize = 14.sp, fontSize = 14.sp,
letterSpacing = (0.25).sp, letterSpacing = (0.25).sp,
), ),
labelMedium = TextStyle(
fontFamily = fontFamily,
fontWeight = FontWeight.Normal,
fontSize = 12.sp,
letterSpacing = (0.5).sp,
),
// button // button
labelLarge = TextStyle( labelLarge = TextStyle(
fontFamily = fontFamily, fontFamily = fontFamily,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 14.sp, fontSize = 14.sp,
letterSpacing = (0.15).sp, // original: 1.25 letterSpacing = (0.1).sp,
), ),
// caption // caption
bodySmall = TextStyle( bodySmall = TextStyle(
@ -111,7 +117,7 @@ internal fun getTypography(
labelSmall = TextStyle( labelSmall = TextStyle(
fontFamily = fontFamily, fontFamily = fontFamily,
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 10.sp, fontSize = 11.sp,
letterSpacing = (0.5).sp, // original: 1.5 letterSpacing = (0.5).sp, // original: 1.5
), ),
) )

View File

@ -11,3 +11,9 @@ data class PrivateMessageModel(
val updateDate: String? = null, val updateDate: String? = null,
val read: Boolean = false, val read: Boolean = false,
) : JavaSerializable ) : JavaSerializable
fun PrivateMessageModel.otherUser(currentUserId: Int): UserModel? = when (currentUserId) {
creator?.id -> recipient
recipient?.id -> creator
else -> null
}

View File

@ -32,6 +32,7 @@ val inboxTabModule = module {
identityRepository = get(), identityRepository = get(),
siteRepository = get(), siteRepository = get(),
commentRepository = get(), commentRepository = get(),
messageRepository = get(),
themeRepository = get(), themeRepository = get(),
settingsRepository = get(), settingsRepository = get(),
hapticFeedback = get(), hapticFeedback = get(),
@ -45,6 +46,7 @@ val inboxTabModule = module {
userRepository = get(), userRepository = get(),
identityRepository = get(), identityRepository = get(),
commentRepository = get(), commentRepository = get(),
messageRepository = get(),
themeRepository = get(), themeRepository = get(),
settingsRepository = get(), settingsRepository = get(),
hapticFeedback = get(), hapticFeedback = get(),

View File

@ -11,6 +11,7 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.Ident
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommentRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommentRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PrivateMessageRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.InboxCoordinator import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.InboxCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.main.InboxMviModel import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.main.InboxMviModel
@ -27,6 +28,7 @@ class InboxMentionsViewModel(
private val commentRepository: CommentRepository, private val commentRepository: CommentRepository,
private val themeRepository: ThemeRepository, private val themeRepository: ThemeRepository,
private val settingsRepository: SettingsRepository, private val settingsRepository: SettingsRepository,
private val messageRepository: PrivateMessageRepository,
private val hapticFeedback: HapticFeedback, private val hapticFeedback: HapticFeedback,
private val coordinator: InboxCoordinator, private val coordinator: InboxCoordinator,
private val notificationCenter: NotificationCenter, private val notificationCenter: NotificationCenter,
@ -288,6 +290,11 @@ class InboxMentionsViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count() userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount = val replyCount =
userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count() userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count()
val messageCount =
messageRepository.getAll(auth, page = 1, limit = 50).orEmpty().groupBy {
listOf(it.creator?.id ?: 0, it.recipient?.id ?: 0).sorted()
.joinToString()
}.count()
mentionCount + replyCount mentionCount + replyCount
} else { } else {
0 0

View File

@ -121,13 +121,13 @@ internal fun ChatCard(
append("@$creatorHost") append("@$creatorHost")
} }
}, },
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface, color = MaterialTheme.colorScheme.onSurface,
) )
ScaledContent { ScaledContent {
// last message text // last message text
PostCardTitle( PostCardTitle(
modifier = Modifier.heightIn(max = 80.dp), modifier = Modifier.heightIn(max = 76.dp),
text = lastMessage, text = lastMessage,
autoLoadImages = autoLoadImages, autoLoadImages = autoLoadImages,
onClick = rememberCallback { onClick = rememberCallback {
@ -152,7 +152,7 @@ internal fun ChatCard(
) )
Text( Text(
text = lastMessageDate.prettifyDate(), text = lastMessageDate.prettifyDate(),
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface, color = MaterialTheme.colorScheme.onSurface,
) )
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))

View File

@ -37,6 +37,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCo
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailScreen import com.github.diegoberaldin.raccoonforlemmy.core.commonui.userdetail.UserDetailScreen
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.otherUser
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxMessagesViewModel import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.di.getInboxMessagesViewModel
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.ui.InboxTab
import com.github.diegoberaldin.raccoonforlemmy.resources.MR import com.github.diegoberaldin.raccoonforlemmy.resources.MR
@ -95,7 +96,7 @@ class InboxMessagesScreen : Tab {
verticalArrangement = Arrangement.spacedBy(Spacing.xs), verticalArrangement = Arrangement.spacedBy(Spacing.xs),
) { ) {
if (uiState.chats.isEmpty() && uiState.initial) { if (uiState.chats.isEmpty() && uiState.initial) {
items(1) { items(3) {
ChatCardPlaceholder() ChatCardPlaceholder()
} }
} }
@ -112,15 +113,12 @@ class InboxMessagesScreen : Tab {
} }
items( items(
items = uiState.chats, items = uiState.chats,
key = { it.id.toString() + uiState.unreadOnly }, key = {
it.id.toString() + it.updateDate + uiState.unreadOnly
},
) { chat -> ) { chat ->
val otherUser = if (chat.creator?.id == uiState.currentUserId) {
chat.recipient
} else {
chat.creator
}
ChatCard( ChatCard(
user = otherUser, user = chat.otherUser(uiState.currentUserId),
autoLoadImages = uiState.autoLoadImages, autoLoadImages = uiState.autoLoadImages,
lastMessage = chat.content.orEmpty(), lastMessage = chat.content.orEmpty(),
lastMessageDate = chat.publishDate, lastMessageDate = chat.publishDate,
@ -130,7 +128,7 @@ class InboxMessagesScreen : Tab {
) )
}, },
onOpen = rememberCallback { onOpen = rememberCallback {
val userId = otherUser?.id val userId = chat.otherUser(uiState.currentUserId)?.id
if (userId != null) { if (userId != null) {
navigationCoordinator.pushScreen( navigationCoordinator.pushScreen(
InboxChatScreen(userId) InboxChatScreen(userId)

View File

@ -6,6 +6,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationC
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.otherUser
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PrivateMessageRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PrivateMessageRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository
@ -107,11 +108,9 @@ class InboxMessagesViewModel(
page = currentPage, page = currentPage,
unreadOnly = unreadOnly, unreadOnly = unreadOnly,
)?.groupBy { )?.groupBy {
val creatorId = it.creator?.id ?: 0 it.otherUser(currentState.currentUserId)?.id ?: 0
val recipientId = it.recipient?.id ?: 0 }?.mapNotNull { entry ->
listOf(creatorId, recipientId).sorted().toString() val messages = entry.value.sortedBy { m -> m.publishDate }
}?.mapNotNull {
val messages = it.value.sortedBy { m -> m.publishDate }
messages.lastOrNull() messages.lastOrNull()
} }
if (!itemList.isNullOrEmpty()) { if (!itemList.isNullOrEmpty()) {
@ -121,7 +120,13 @@ class InboxMessagesViewModel(
val newItems = if (refreshing) { val newItems = if (refreshing) {
itemList.orEmpty() itemList.orEmpty()
} else { } else {
it.chats + itemList.orEmpty() it.chats + itemList.orEmpty().filter { outerChat ->
val outerOtherUser = outerChat.otherUser(currentState.currentUserId)
currentState.chats.none { chat ->
val otherUser = chat.otherUser(currentState.currentUserId)
outerOtherUser == otherUser
}
}
} }
it.copy( it.copy(
chats = newItems, chats = newItems,
@ -141,7 +146,12 @@ class InboxMessagesViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count() userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount = val replyCount =
userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count() userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count()
mentionCount + replyCount val messageCount =
messageRepository.getAll(auth, page = 1, limit = 50).orEmpty().groupBy {
listOf(it.creator?.id ?: 0, it.recipient?.id ?: 0).sorted()
.joinToString()
}.count()
mentionCount + replyCount + messageCount
} else { } else {
0 0
} }

View File

@ -11,6 +11,7 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.Ident
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommentRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommentRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PrivateMessageRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.InboxCoordinator import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.InboxCoordinator
@ -27,6 +28,7 @@ class InboxRepliesViewModel(
private val userRepository: UserRepository, private val userRepository: UserRepository,
private val siteRepository: SiteRepository, private val siteRepository: SiteRepository,
private val commentRepository: CommentRepository, private val commentRepository: CommentRepository,
private val messageRepository: PrivateMessageRepository,
private val themeRepository: ThemeRepository, private val themeRepository: ThemeRepository,
private val hapticFeedback: HapticFeedback, private val hapticFeedback: HapticFeedback,
private val coordinator: InboxCoordinator, private val coordinator: InboxCoordinator,
@ -294,6 +296,11 @@ class InboxRepliesViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count() userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount = val replyCount =
userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count() userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count()
val messageCount =
messageRepository.getAll(auth, page = 1, limit = 50).orEmpty().groupBy {
listOf(it.creator?.id ?: 0, it.recipient?.id ?: 0).sorted()
.joinToString()
}.count()
mentionCount + replyCount mentionCount + replyCount
} else { } else {
0 0

View File

@ -3,6 +3,7 @@ package com.github.diegoberaldin.raccoonforlemmy
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PrivateMessageRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO import kotlinx.coroutines.IO
@ -15,6 +16,7 @@ class MainViewModel(
private val mvi: DefaultMviModel<MainScreenMviModel.Intent, MainScreenMviModel.UiState, MainScreenMviModel.Effect>, private val mvi: DefaultMviModel<MainScreenMviModel.Intent, MainScreenMviModel.UiState, MainScreenMviModel.Effect>,
private val identityRepository: IdentityRepository, private val identityRepository: IdentityRepository,
private val userRepository: UserRepository, private val userRepository: UserRepository,
private val messageRepository: PrivateMessageRepository,
) : MainScreenMviModel, ) : MainScreenMviModel,
MviModel<MainScreenMviModel.Intent, MainScreenMviModel.UiState, MainScreenMviModel.Effect> by mvi { MviModel<MainScreenMviModel.Intent, MainScreenMviModel.UiState, MainScreenMviModel.Effect> by mvi {
@ -30,7 +32,12 @@ class MainViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count() userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount = val replyCount =
userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count() userRepository.getReplies(auth, page = 1, limit = 50).orEmpty().count()
mentionCount + replyCount val messageCount =
messageRepository.getAll(auth, page = 1, limit = 50).orEmpty().groupBy {
listOf(it.creator?.id ?: 0, it.recipient?.id ?: 0).sorted()
.joinToString()
}.count()
mentionCount + replyCount + messageCount
} else { } else {
0 0
} }

View File

@ -11,6 +11,7 @@ internal val internalSharedModule = module {
mvi = DefaultMviModel(MainScreenMviModel.UiState()), mvi = DefaultMviModel(MainScreenMviModel.UiState()),
identityRepository = get(), identityRepository = get(),
userRepository = get(), userRepository = get(),
messageRepository = get(),
) )
} }
} }