[🐴] don't include blocked convos in unread count (#4082)

* don't include blocked convos in unread count

* Use moderateProfile

* Handle blocked state in chat list

* Fix logic formatting, add todo

---------

Co-authored-by: Eric Bailey <git@esb.lol>
zio/stable
Samuel Newman 2024-05-17 20:46:01 +01:00 committed by GitHub
parent dd0f57e3e3
commit f42f7fa035
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 8 deletions

View File

@ -169,7 +169,7 @@ function ChatListItemReady({
)}
</TimeElapsed>
)}
{convo.muted && (
{(convo.muted || moderation.blocked) && (
<Text
style={[
a.text_sm,
@ -200,7 +200,8 @@ function ChatListItemReady({
convo.unreadCount > 0
? a.font_bold
: t.atoms.text_contrast_high,
convo.muted && t.atoms.text_contrast_medium,
(convo.muted || moderation.blocked) &&
t.atoms.text_contrast_medium,
]}>
{lastMessage}
</Text>
@ -211,7 +212,8 @@ function ChatListItemReady({
a.absolute,
a.rounded_full,
{
backgroundColor: convo.muted
backgroundColor:
convo.muted || moderation.blocked
? t.palette.contrast_200
: t.palette.primary_500,
height: 7,

View File

@ -1,5 +1,9 @@
import {useCallback, useMemo} from 'react'
import {ChatBskyConvoDefs, ChatBskyConvoListConvos} from '@atproto/api'
import {
ChatBskyConvoDefs,
ChatBskyConvoListConvos,
moderateProfile,
} from '@atproto/api'
import {
InfiniteData,
QueryClient,
@ -8,8 +12,9 @@ import {
} from '@tanstack/react-query'
import {useCurrentConvoId} from '#/state/messages/current-convo-id'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const'
import {useAgent} from '#/state/session'
import {useAgent, useSession} from '#/state/session'
import {decrementBadgeCount} from 'lib/notifications/notifications'
export const RQKEY = ['convo-list']
@ -36,16 +41,29 @@ export function useListConvos({refetchInterval}: {refetchInterval: number}) {
export function useUnreadMessageCount() {
const {currentConvoId} = useCurrentConvoId()
const {currentAccount} = useSession()
const convos = useListConvos({
refetchInterval: 30_000,
})
const moderationOpts = useModerationOpts()
const count =
convos.data?.pages
.flatMap(page => page.convos)
.filter(convo => convo.id !== currentConvoId)
.reduce((acc, convo) => {
return acc + (!convo.muted && convo.unreadCount > 0 ? 1 : 0)
const otherMember = convo.members.find(
member => member.did !== currentAccount?.did,
)
if (!otherMember || !moderationOpts) return acc
// TODO could shadow this outside this hook and get optimistic block state
const moderation = moderateProfile(otherMember, moderationOpts)
const shouldIgnore = convo.muted || moderation.blocked
const unreadCount = !shouldIgnore && convo.unreadCount > 0 ? 1 : 0
return acc + unreadCount
}, 0) ?? 0
return useMemo(() => {