diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/state/cache/post-shadow.ts | 13 | ||||
-rw-r--r-- | src/state/queries/threadgate/index.ts | 15 | ||||
-rw-r--r-- | src/state/queries/threadgate/util.ts | 20 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThread.tsx | 9 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 32 | ||||
-rw-r--r-- | src/view/com/util/post-ctrls/PostCtrls.tsx | 2 |
6 files changed, 68 insertions, 23 deletions
diff --git a/src/state/cache/post-shadow.ts b/src/state/cache/post-shadow.ts index 65300a8ef..4d848ccc4 100644 --- a/src/state/cache/post-shadow.ts +++ b/src/state/cache/post-shadow.ts @@ -21,6 +21,7 @@ export interface PostShadow { repostUri: string | undefined isDeleted: boolean embed: AppBskyEmbedRecord.View | AppBskyEmbedRecordWithMedia.View | undefined + threadgateView: AppBskyFeedDefs.ThreadgateView | undefined } export const POST_TOMBSTONE = Symbol('PostTombstone') @@ -104,6 +105,16 @@ function mergeShadow( } } + let threadgateView: typeof post.threadgate + if ('threadgateView' in shadow && !post.threadgate) { + if ( + AppBskyFeedDefs.isThreadgateView(shadow.threadgateView) || + shadow.threadgateView === undefined + ) { + threadgateView = shadow.threadgateView + } + } + return castAsShadow({ ...post, embed: embed || post.embed, @@ -114,6 +125,8 @@ function mergeShadow( like: 'likeUri' in shadow ? shadow.likeUri : post.viewer?.like, repost: 'repostUri' in shadow ? shadow.repostUri : post.viewer?.repost, }, + // always prefer real post data + threadgate: post.threadgate || threadgateView, }) } diff --git a/src/state/queries/threadgate/index.ts b/src/state/queries/threadgate/index.ts index a88197cd5..faa166e2c 100644 --- a/src/state/queries/threadgate/index.ts +++ b/src/state/queries/threadgate/index.ts @@ -9,10 +9,12 @@ import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' import {networkRetry, retry} from '#/lib/async/retry' import {until} from '#/lib/async/until' +import {updatePostShadow} from '#/state/cache/post-shadow' import {STALE} from '#/state/queries' import {RQKEY_ROOT as postThreadQueryKeyRoot} from '#/state/queries/post-thread' import {ThreadgateAllowUISetting} from '#/state/queries/threadgate/types' import { + createTempThreadgateView, createThreadgateRecord, mergeThreadgateRecords, threadgateAllowUISettingToAllowRecordValue, @@ -342,17 +344,26 @@ export function useToggleReplyVisibilityMutation() { } }) }, - onSuccess() { + onSuccess(_, {postUri, replyUri}) { + updatePostShadow(queryClient, postUri, { + threadgateView: createTempThreadgateView({ + postUri, + hiddenReplies: [replyUri], + }), + }) queryClient.invalidateQueries({ queryKey: [threadgateRecordQueryKeyRoot], }) }, - onError(_, {replyUri, action}) { + onError(_, {postUri, replyUri, action}) { if (action === 'hide') { hiddenReplies.removeHiddenReplyUri(replyUri) } else if (action === 'show') { hiddenReplies.addHiddenReplyUri(replyUri) } + updatePostShadow(queryClient, postUri, { + threadgateView: undefined, + }) }, }) } diff --git a/src/state/queries/threadgate/util.ts b/src/state/queries/threadgate/util.ts index 09ae0a0c1..35c33875e 100644 --- a/src/state/queries/threadgate/util.ts +++ b/src/state/queries/threadgate/util.ts @@ -139,3 +139,23 @@ export function createThreadgateRecord( hiddenReplies: threadgate.hiddenReplies || [], } } + +export function createTempThreadgateView({ + postUri, + hiddenReplies, +}: Pick<AppBskyFeedThreadgate.Record, 'hiddenReplies'> & { + postUri: string +}): AppBskyFeedDefs.ThreadgateView { + const record: AppBskyFeedThreadgate.Record = { + $type: 'app.bsky.feed.threadgate', + post: postUri, + allow: undefined, + hiddenReplies, + createdAt: new Date().toISOString(), + } + return { + $type: 'app.bsky.feed.defs#threadgateView', + uri: postUri, + record, + } +} diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index bd778fd98..3757d76c6 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -129,17 +129,18 @@ export function PostThread({uri}: {uri: string | undefined}) { currentAccount && rootPostUri && currentAccount?.did === new AtUri(rootPostUri).host + const initialThreadgateRecord = rootPost?.threadgate?.record as + | AppBskyFeedThreadgate.Record + | undefined const {data: threadgateRecord} = useThreadgateRecordQuery({ /** * If the user is the OP and the root post has a threadgate, we should load * the threadgate record. Otherwise, fallback to initialData, which is taken * from the response from `getPostThread`. */ - enabled: Boolean(isOP && rootPostUri), + enabled: Boolean(isOP && rootPostUri && initialThreadgateRecord), postUri: rootPostUri, - initialData: rootPost?.threadgate?.record as - | AppBskyFeedThreadgate.Record - | undefined, + initialData: initialThreadgateRecord, }) const moderationOpts = useModerationOpts() diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index da187f5d9..f2cd8e85a 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -399,22 +399,6 @@ let PostThreadItemLoaded = ({ </Text> </Link> ) : null} - {post.likeCount != null && post.likeCount !== 0 ? ( - <Link - style={styles.expandedInfoItem} - href={likesHref} - title={likesTitle}> - <Text - testID="likeCount-expanded" - type="lg" - style={pal.textLight}> - <Text type="xl-bold" style={pal.text}> - {formatCount(post.likeCount)} - </Text>{' '} - <Plural value={post.likeCount} one="like" other="likes" /> - </Text> - </Link> - ) : null} {post.quoteCount != null && post.quoteCount !== 0 ? ( <Link style={styles.expandedInfoItem} @@ -435,6 +419,22 @@ let PostThreadItemLoaded = ({ </Text> </Link> ) : null} + {post.likeCount != null && post.likeCount !== 0 ? ( + <Link + style={styles.expandedInfoItem} + href={likesHref} + title={likesTitle}> + <Text + testID="likeCount-expanded" + type="lg" + style={pal.textLight}> + <Text type="xl-bold" style={pal.text}> + {formatCount(post.likeCount)} + </Text>{' '} + <Plural value={post.likeCount} one="like" other="likes" /> + </Text> + </Link> + ) : null} </View> ) : null} <View style={[s.pl10, s.pr10]}> diff --git a/src/view/com/util/post-ctrls/PostCtrls.tsx b/src/view/com/util/post-ctrls/PostCtrls.tsx index 0cfa3fc4d..a0cef8692 100644 --- a/src/view/com/util/post-ctrls/PostCtrls.tsx +++ b/src/view/com/util/post-ctrls/PostCtrls.tsx @@ -255,7 +255,7 @@ let PostCtrls = ({ <View style={big ? a.align_center : [a.flex_1, a.align_start]}> <RepostButton isReposted={!!post.viewer?.repost} - repostCount={post.repostCount} + repostCount={(post.repostCount ?? 0) + (post.quoteCount ?? 0)} onRepost={onRepost} onQuote={onQuote} big={big} |