mirror of
https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy.git
synced 2025-02-09 09:48:45 +01:00
fix(inbox): several fixes (#178)
* fix: chat fonts * fix: chat loading * fix: count messages in inbox unread
This commit is contained in:
parent
f52c4682bf
commit
7aecc6d741
@ -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
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
|
}
|
@ -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(),
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user