Shadows (#4265)
parent
89c9fd3be1
commit
d614f6cb71
|
@ -9,8 +9,10 @@ import {findAllProfilesInQueryData as findAllProfilesInListMembersQueryData} fro
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInListConvosQueryData} from '../queries/messages/list-converations'
|
import {findAllProfilesInQueryData as findAllProfilesInListConvosQueryData} from '../queries/messages/list-converations'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInMyBlockedAccountsQueryData} from '../queries/my-blocked-accounts'
|
import {findAllProfilesInQueryData as findAllProfilesInMyBlockedAccountsQueryData} from '../queries/my-blocked-accounts'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInMyMutedAccountsQueryData} from '../queries/my-muted-accounts'
|
import {findAllProfilesInQueryData as findAllProfilesInMyMutedAccountsQueryData} from '../queries/my-muted-accounts'
|
||||||
|
import {findAllProfilesInQueryData as findAllProfilesInFeedsQueryData} from '../queries/post-feed'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInPostLikedByQueryData} from '../queries/post-liked-by'
|
import {findAllProfilesInQueryData as findAllProfilesInPostLikedByQueryData} from '../queries/post-liked-by'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInPostRepostedByQueryData} from '../queries/post-reposted-by'
|
import {findAllProfilesInQueryData as findAllProfilesInPostRepostedByQueryData} from '../queries/post-reposted-by'
|
||||||
|
import {findAllProfilesInQueryData as findAllProfilesInPostThreadQueryData} from '../queries/post-thread'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInProfileQueryData} from '../queries/profile'
|
import {findAllProfilesInQueryData as findAllProfilesInProfileQueryData} from '../queries/profile'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInProfileFollowersQueryData} from '../queries/profile-followers'
|
import {findAllProfilesInQueryData as findAllProfilesInProfileFollowersQueryData} from '../queries/profile-followers'
|
||||||
import {findAllProfilesInQueryData as findAllProfilesInProfileFollowsQueryData} from '../queries/profile-follows'
|
import {findAllProfilesInQueryData as findAllProfilesInProfileFollowsQueryData} from '../queries/profile-follows'
|
||||||
|
@ -107,4 +109,6 @@ function* findProfilesInCache(
|
||||||
yield* findAllProfilesInSuggestedFollowsQueryData(queryClient, did)
|
yield* findAllProfilesInSuggestedFollowsQueryData(queryClient, did)
|
||||||
yield* findAllProfilesInActorSearchQueryData(queryClient, did)
|
yield* findAllProfilesInActorSearchQueryData(queryClient, did)
|
||||||
yield* findAllProfilesInListConvosQueryData(queryClient, did)
|
yield* findAllProfilesInListConvosQueryData(queryClient, did)
|
||||||
|
yield* findAllProfilesInFeedsQueryData(queryClient, did)
|
||||||
|
yield* findAllProfilesInPostThreadQueryData(queryClient, did)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {useEffect, useRef} from 'react'
|
import {useEffect, useRef} from 'react'
|
||||||
import {AppBskyFeedDefs} from '@atproto/api'
|
import {AppBskyActorDefs, AppBskyFeedDefs} from '@atproto/api'
|
||||||
import {
|
import {
|
||||||
InfiniteData,
|
InfiniteData,
|
||||||
QueryClient,
|
QueryClient,
|
||||||
|
@ -162,3 +162,28 @@ export function* findAllPostsInQueryData(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function* findAllProfilesInQueryData(
|
||||||
|
queryClient: QueryClient,
|
||||||
|
did: string,
|
||||||
|
): Generator<AppBskyActorDefs.ProfileView, void> {
|
||||||
|
const queryDatas = queryClient.getQueriesData<InfiniteData<FeedPage>>({
|
||||||
|
queryKey: [RQKEY_ROOT],
|
||||||
|
})
|
||||||
|
for (const [_queryKey, queryData] of queryDatas) {
|
||||||
|
if (!queryData?.pages) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for (const page of queryData?.pages) {
|
||||||
|
for (const item of page.items) {
|
||||||
|
if (item.subject?.author.did === did) {
|
||||||
|
yield item.subject.author
|
||||||
|
}
|
||||||
|
const quotedPost = getEmbeddedPost(item.subject?.embed)
|
||||||
|
if (quotedPost?.author.did === did) {
|
||||||
|
yield quotedPost.author
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -483,6 +483,45 @@ export function* findAllPostsInQueryData(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function* findAllProfilesInQueryData(
|
||||||
|
queryClient: QueryClient,
|
||||||
|
did: string,
|
||||||
|
): Generator<AppBskyActorDefs.ProfileView, undefined> {
|
||||||
|
const queryDatas = queryClient.getQueriesData<
|
||||||
|
InfiniteData<FeedPageUnselected>
|
||||||
|
>({
|
||||||
|
queryKey: [RQKEY_ROOT],
|
||||||
|
})
|
||||||
|
for (const [_queryKey, queryData] of queryDatas) {
|
||||||
|
if (!queryData?.pages) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for (const page of queryData?.pages) {
|
||||||
|
for (const item of page.feed) {
|
||||||
|
if (item.post.author.did === did) {
|
||||||
|
yield item.post.author
|
||||||
|
}
|
||||||
|
const quotedPost = getEmbeddedPost(item.post.embed)
|
||||||
|
if (quotedPost?.author.did === did) {
|
||||||
|
yield quotedPost.author
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
AppBskyFeedDefs.isPostView(item.reply?.parent) &&
|
||||||
|
item.reply?.parent?.author.did === did
|
||||||
|
) {
|
||||||
|
yield item.reply.parent.author
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
AppBskyFeedDefs.isPostView(item.reply?.root) &&
|
||||||
|
item.reply?.root?.author.did === did
|
||||||
|
) {
|
||||||
|
yield item.reply.root.author
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) {
|
function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) {
|
||||||
// no posts in this feed
|
// no posts in this feed
|
||||||
if (feed.length === 0) return true
|
if (feed.length === 0) return true
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import {
|
import {
|
||||||
|
AppBskyActorDefs,
|
||||||
AppBskyEmbedRecord,
|
AppBskyEmbedRecord,
|
||||||
AppBskyFeedDefs,
|
AppBskyFeedDefs,
|
||||||
AppBskyFeedGetPostThread,
|
AppBskyFeedGetPostThread,
|
||||||
|
@ -11,9 +12,18 @@ import {QueryClient, useQuery, useQueryClient} from '@tanstack/react-query'
|
||||||
import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped'
|
import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped'
|
||||||
import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
|
import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
|
||||||
import {useAgent} from '#/state/session'
|
import {useAgent} from '#/state/session'
|
||||||
import {findAllPostsInQueryData as findAllPostsInSearchQueryData} from 'state/queries/search-posts'
|
import {
|
||||||
import {findAllPostsInQueryData as findAllPostsInNotifsQueryData} from './notifications/feed'
|
findAllPostsInQueryData as findAllPostsInSearchQueryData,
|
||||||
import {findAllPostsInQueryData as findAllPostsInFeedQueryData} from './post-feed'
|
findAllProfilesInQueryData as findAllProfilesInSearchQueryData,
|
||||||
|
} from 'state/queries/search-posts'
|
||||||
|
import {
|
||||||
|
findAllPostsInQueryData as findAllPostsInNotifsQueryData,
|
||||||
|
findAllProfilesInQueryData as findAllProfilesInNotifsQueryData,
|
||||||
|
} from './notifications/feed'
|
||||||
|
import {
|
||||||
|
findAllPostsInQueryData as findAllPostsInFeedQueryData,
|
||||||
|
findAllProfilesInQueryData as findAllProfilesInFeedQueryData,
|
||||||
|
} from './post-feed'
|
||||||
import {embedViewRecordToPostView, getEmbeddedPost} from './util'
|
import {embedViewRecordToPostView, getEmbeddedPost} from './util'
|
||||||
|
|
||||||
const RQKEY_ROOT = 'post-thread'
|
const RQKEY_ROOT = 'post-thread'
|
||||||
|
@ -293,6 +303,39 @@ export function* findAllPostsInQueryData(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function* findAllProfilesInQueryData(
|
||||||
|
queryClient: QueryClient,
|
||||||
|
did: string,
|
||||||
|
): Generator<AppBskyActorDefs.ProfileView, void> {
|
||||||
|
const queryDatas = queryClient.getQueriesData<ThreadNode>({
|
||||||
|
queryKey: [RQKEY_ROOT],
|
||||||
|
})
|
||||||
|
for (const [_queryKey, queryData] of queryDatas) {
|
||||||
|
if (!queryData) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for (const item of traverseThread(queryData)) {
|
||||||
|
if (item.type === 'post' && item.post.author.did === did) {
|
||||||
|
yield item.post.author
|
||||||
|
}
|
||||||
|
const quotedPost =
|
||||||
|
item.type === 'post' ? getEmbeddedPost(item.post.embed) : undefined
|
||||||
|
if (quotedPost?.author.did === did) {
|
||||||
|
yield quotedPost?.author
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let profile of findAllProfilesInFeedQueryData(queryClient, did)) {
|
||||||
|
yield profile
|
||||||
|
}
|
||||||
|
for (let profile of findAllProfilesInNotifsQueryData(queryClient, did)) {
|
||||||
|
yield profile
|
||||||
|
}
|
||||||
|
for (let profile of findAllProfilesInSearchQueryData(queryClient, did)) {
|
||||||
|
yield profile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function* traverseThread(node: ThreadNode): Generator<ThreadNode, void> {
|
function* traverseThread(node: ThreadNode): Generator<ThreadNode, void> {
|
||||||
if (node.type === 'post') {
|
if (node.type === 'post') {
|
||||||
if (node.parent) {
|
if (node.parent) {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
import {AppBskyFeedDefs, AppBskyFeedSearchPosts} from '@atproto/api'
|
import {
|
||||||
|
AppBskyActorDefs,
|
||||||
|
AppBskyFeedDefs,
|
||||||
|
AppBskyFeedSearchPosts,
|
||||||
|
} from '@atproto/api'
|
||||||
import {
|
import {
|
||||||
InfiniteData,
|
InfiniteData,
|
||||||
QueryClient,
|
QueryClient,
|
||||||
|
@ -75,3 +79,30 @@ export function* findAllPostsInQueryData(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function* findAllProfilesInQueryData(
|
||||||
|
queryClient: QueryClient,
|
||||||
|
did: string,
|
||||||
|
): Generator<AppBskyActorDefs.ProfileView, undefined> {
|
||||||
|
const queryDatas = queryClient.getQueriesData<
|
||||||
|
InfiniteData<AppBskyFeedSearchPosts.OutputSchema>
|
||||||
|
>({
|
||||||
|
queryKey: [searchPostsQueryKeyRoot],
|
||||||
|
})
|
||||||
|
for (const [_queryKey, queryData] of queryDatas) {
|
||||||
|
if (!queryData?.pages) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for (const page of queryData?.pages) {
|
||||||
|
for (const post of page.posts) {
|
||||||
|
if (post.author.did === did) {
|
||||||
|
yield post.author
|
||||||
|
}
|
||||||
|
const quotedPost = getEmbeddedPost(post.embed)
|
||||||
|
if (quotedPost?.author.did === did) {
|
||||||
|
yield quotedPost.author
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import React, {useState} from 'react'
|
import React from 'react'
|
||||||
import {View} from 'react-native'
|
import {View} from 'react-native'
|
||||||
import {AppBskyActorDefs, ModerationDecision} from '@atproto/api'
|
import {AppBskyActorDefs, ModerationDecision} from '@atproto/api'
|
||||||
import {msg} from '@lingui/macro'
|
import {msg} from '@lingui/macro'
|
||||||
|
@ -39,7 +39,6 @@ export function AviFollowButton({
|
||||||
})
|
})
|
||||||
const gate = useGate()
|
const gate = useGate()
|
||||||
const {currentAccount, hasSession} = useSession()
|
const {currentAccount, hasSession} = useSession()
|
||||||
const [followed, setFollowed] = useState<string | null>(null)
|
|
||||||
const navigation = useNavigation<NavigationProp>()
|
const navigation = useNavigation<NavigationProp>()
|
||||||
|
|
||||||
const name = sanitizeDisplayName(
|
const name = sanitizeDisplayName(
|
||||||
|
@ -47,13 +46,10 @@ export function AviFollowButton({
|
||||||
moderation.ui('displayName'),
|
moderation.ui('displayName'),
|
||||||
)
|
)
|
||||||
const isFollowing =
|
const isFollowing =
|
||||||
profile.viewer?.following ||
|
profile.viewer?.following || profile.did === currentAccount?.did
|
||||||
profile.did === followed ||
|
|
||||||
profile.did === currentAccount?.did
|
|
||||||
|
|
||||||
function onPress() {
|
function onPress() {
|
||||||
follow()
|
follow()
|
||||||
setFollowed(profile.did)
|
|
||||||
Toast.show(_(msg`Following ${name}`))
|
Toast.show(_(msg`Following ${name}`))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue