Server-side thread mutes (#4518)
* update atproto/api * move thread mutes to server side * rm log * move muted threads provider to inside did key * use map instead of object
This commit is contained in:
@@ -26,7 +26,6 @@ import {
|
||||
useQueryClient,
|
||||
} from '@tanstack/react-query'
|
||||
|
||||
import {useMutedThreads} from '#/state/muted-threads'
|
||||
import {useAgent} from '#/state/session'
|
||||
import {useModerationOpts} from '../../preferences/moderation-opts'
|
||||
import {STALE} from '..'
|
||||
@@ -54,7 +53,6 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
|
||||
const agent = useAgent()
|
||||
const queryClient = useQueryClient()
|
||||
const moderationOpts = useModerationOpts()
|
||||
const threadMutes = useMutedThreads()
|
||||
const unreads = useUnreadNotificationsApi()
|
||||
const enabled = opts?.enabled !== false
|
||||
const lastPageCountRef = useRef(0)
|
||||
@@ -82,7 +80,6 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
|
||||
cursor: pageParam,
|
||||
queryClient,
|
||||
moderationOpts,
|
||||
threadMutes,
|
||||
fetchAdditionalData: true,
|
||||
})
|
||||
).page
|
||||
|
||||
@@ -9,7 +9,6 @@ import EventEmitter from 'eventemitter3'
|
||||
|
||||
import BroadcastChannel from '#/lib/broadcast'
|
||||
import {logger} from '#/logger'
|
||||
import {useMutedThreads} from '#/state/muted-threads'
|
||||
import {useAgent, useSession} from '#/state/session'
|
||||
import {resetBadgeCount} from 'lib/notifications/notifications'
|
||||
import {useModerationOpts} from '../../preferences/moderation-opts'
|
||||
@@ -48,7 +47,6 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||
const agent = useAgent()
|
||||
const queryClient = useQueryClient()
|
||||
const moderationOpts = useModerationOpts()
|
||||
const threadMutes = useMutedThreads()
|
||||
|
||||
const [numUnread, setNumUnread] = React.useState('')
|
||||
|
||||
@@ -147,7 +145,6 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||
limit: 40,
|
||||
queryClient,
|
||||
moderationOpts,
|
||||
threadMutes,
|
||||
|
||||
// only fetch subjects when the page is going to be used
|
||||
// in the notifications query, otherwise skip it
|
||||
@@ -192,7 +189,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||
}
|
||||
},
|
||||
}
|
||||
}, [setNumUnread, queryClient, moderationOpts, threadMutes, agent])
|
||||
}, [setNumUnread, queryClient, moderationOpts, agent])
|
||||
checkUnreadRef.current = api.checkUnread
|
||||
|
||||
return (
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import {
|
||||
AppBskyEmbedRecord,
|
||||
AppBskyFeedDefs,
|
||||
AppBskyFeedLike,
|
||||
AppBskyFeedPost,
|
||||
@@ -28,7 +27,6 @@ export async function fetchPage({
|
||||
limit,
|
||||
queryClient,
|
||||
moderationOpts,
|
||||
threadMutes,
|
||||
fetchAdditionalData,
|
||||
}: {
|
||||
agent: BskyAgent
|
||||
@@ -36,7 +34,6 @@ export async function fetchPage({
|
||||
limit: number
|
||||
queryClient: QueryClient
|
||||
moderationOpts: ModerationOpts | undefined
|
||||
threadMutes: string[]
|
||||
fetchAdditionalData: boolean
|
||||
}): Promise<{page: FeedPage; indexedAt: string | undefined}> {
|
||||
const res = await agent.listNotifications({
|
||||
@@ -67,11 +64,6 @@ export async function fetchPage({
|
||||
}
|
||||
}
|
||||
|
||||
// apply thread muting
|
||||
notifsGrouped = notifsGrouped.filter(
|
||||
notif => !isThreadMuted(notif, threadMutes),
|
||||
)
|
||||
|
||||
let seenAt = res.data.seenAt ? new Date(res.data.seenAt) : new Date()
|
||||
if (Number.isNaN(seenAt.getTime())) {
|
||||
seenAt = new Date()
|
||||
@@ -207,45 +199,3 @@ function getSubjectUri(
|
||||
return notif.reasonSubject
|
||||
}
|
||||
}
|
||||
|
||||
export function isThreadMuted(notif: FeedNotification, threadMutes: string[]) {
|
||||
// If there's a subject we want to use that. This will always work on the notifications tab
|
||||
if (notif.subject) {
|
||||
const record = notif.subject.record as AppBskyFeedPost.Record
|
||||
// Check for a quote record
|
||||
if (
|
||||
(record.reply && threadMutes.includes(record.reply.root.uri)) ||
|
||||
(notif.subject.uri && threadMutes.includes(notif.subject.uri))
|
||||
) {
|
||||
return true
|
||||
} else if (
|
||||
AppBskyEmbedRecord.isMain(record.embed) &&
|
||||
threadMutes.includes(record.embed.record.uri)
|
||||
) {
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
// Otherwise we just do the best that we can
|
||||
const record = notif.notification.record
|
||||
if (AppBskyFeedPost.isRecord(record)) {
|
||||
if (record.reply && threadMutes.includes(record.reply.root.uri)) {
|
||||
// We can always filter replies
|
||||
return true
|
||||
} else if (
|
||||
AppBskyEmbedRecord.isMain(record.embed) &&
|
||||
threadMutes.includes(record.embed.record.uri)
|
||||
) {
|
||||
// We can also filter quotes if the quoted post is the root
|
||||
return true
|
||||
}
|
||||
} else if (
|
||||
AppBskyFeedRepost.isRecord(record) &&
|
||||
threadMutes.includes(record.subject.uri)
|
||||
) {
|
||||
// Finally we can filter reposts, again if the post is the root
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user