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

View File

@ -10,4 +10,10 @@ data class PrivateMessageModel(
val publishDate: String? = null,
val updateDate: String? = null,
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(),
siteRepository = get(),
commentRepository = get(),
messageRepository = get(),
themeRepository = get(),
settingsRepository = get(),
hapticFeedback = get(),
@ -45,6 +46,7 @@ val inboxTabModule = module {
userRepository = get(),
identityRepository = get(),
commentRepository = get(),
messageRepository = get(),
themeRepository = get(),
settingsRepository = 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.SortType
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.feature.inbox.InboxCoordinator
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.main.InboxMviModel
@ -27,6 +28,7 @@ class InboxMentionsViewModel(
private val commentRepository: CommentRepository,
private val themeRepository: ThemeRepository,
private val settingsRepository: SettingsRepository,
private val messageRepository: PrivateMessageRepository,
private val hapticFeedback: HapticFeedback,
private val coordinator: InboxCoordinator,
private val notificationCenter: NotificationCenter,
@ -288,6 +290,11 @@ class InboxMentionsViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount =
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
} else {
0

View File

@ -121,13 +121,13 @@ internal fun ChatCard(
append("@$creatorHost")
}
},
style = MaterialTheme.typography.labelMedium,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface,
)
ScaledContent {
// last message text
PostCardTitle(
modifier = Modifier.heightIn(max = 80.dp),
modifier = Modifier.heightIn(max = 76.dp),
text = lastMessage,
autoLoadImages = autoLoadImages,
onClick = rememberCallback {
@ -152,7 +152,7 @@ internal fun ChatCard(
)
Text(
text = lastMessageDate.prettifyDate(),
style = MaterialTheme.typography.labelMedium,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface,
)
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.utils.compose.rememberCallback
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.ui.InboxTab
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
@ -95,7 +96,7 @@ class InboxMessagesScreen : Tab {
verticalArrangement = Arrangement.spacedBy(Spacing.xs),
) {
if (uiState.chats.isEmpty() && uiState.initial) {
items(1) {
items(3) {
ChatCardPlaceholder()
}
}
@ -112,15 +113,12 @@ class InboxMessagesScreen : Tab {
}
items(
items = uiState.chats,
key = { it.id.toString() + uiState.unreadOnly },
key = {
it.id.toString() + it.updateDate + uiState.unreadOnly
},
) { chat ->
val otherUser = if (chat.creator?.id == uiState.currentUserId) {
chat.recipient
} else {
chat.creator
}
ChatCard(
user = otherUser,
user = chat.otherUser(uiState.currentUserId),
autoLoadImages = uiState.autoLoadImages,
lastMessage = chat.content.orEmpty(),
lastMessageDate = chat.publishDate,
@ -130,7 +128,7 @@ class InboxMessagesScreen : Tab {
)
},
onOpen = rememberCallback {
val userId = otherUser?.id
val userId = chat.otherUser(uiState.currentUserId)?.id
if (userId != null) {
navigationCoordinator.pushScreen(
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.persistence.repository.SettingsRepository
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.SiteRepository
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.UserRepository
@ -107,11 +108,9 @@ class InboxMessagesViewModel(
page = currentPage,
unreadOnly = unreadOnly,
)?.groupBy {
val creatorId = it.creator?.id ?: 0
val recipientId = it.recipient?.id ?: 0
listOf(creatorId, recipientId).sorted().toString()
}?.mapNotNull {
val messages = it.value.sortedBy { m -> m.publishDate }
it.otherUser(currentState.currentUserId)?.id ?: 0
}?.mapNotNull { entry ->
val messages = entry.value.sortedBy { m -> m.publishDate }
messages.lastOrNull()
}
if (!itemList.isNullOrEmpty()) {
@ -121,7 +120,13 @@ class InboxMessagesViewModel(
val newItems = if (refreshing) {
itemList.orEmpty()
} 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(
chats = newItems,
@ -141,7 +146,12 @@ class InboxMessagesViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount =
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 {
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.SortType
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.UserRepository
import com.github.diegoberaldin.raccoonforlemmy.feature.inbox.InboxCoordinator
@ -27,6 +28,7 @@ class InboxRepliesViewModel(
private val userRepository: UserRepository,
private val siteRepository: SiteRepository,
private val commentRepository: CommentRepository,
private val messageRepository: PrivateMessageRepository,
private val themeRepository: ThemeRepository,
private val hapticFeedback: HapticFeedback,
private val coordinator: InboxCoordinator,
@ -294,6 +296,11 @@ class InboxRepliesViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount =
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
} else {
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.MviModel
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 kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
@ -15,6 +16,7 @@ class MainViewModel(
private val mvi: DefaultMviModel<MainScreenMviModel.Intent, MainScreenMviModel.UiState, MainScreenMviModel.Effect>,
private val identityRepository: IdentityRepository,
private val userRepository: UserRepository,
private val messageRepository: PrivateMessageRepository,
) : MainScreenMviModel,
MviModel<MainScreenMviModel.Intent, MainScreenMviModel.UiState, MainScreenMviModel.Effect> by mvi {
@ -30,7 +32,12 @@ class MainViewModel(
userRepository.getMentions(auth, page = 1, limit = 50).orEmpty().count()
val replyCount =
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 {
0
}

View File

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