about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2024-08-21 22:16:03 -0500
committerGitHub <noreply@github.com>2024-08-21 20:16:03 -0700
commitd5c78b9183ac78620f59538fed61c8130ae1c47a (patch)
tree53ad7c63b9263e508df587aa6d837c4036f394e9
parent61f0be705d614a31331945e1c4b9361d71b81403 (diff)
downloadvoidsky-d5c78b9183ac78620f59538fed61c8130ae1c47a.tar.zst
Prep threadgate shadow hack (#4970)
Co-authored-by: Hailey <me@haileyok.com>
-rw-r--r--src/state/cache/post-shadow.ts13
-rw-r--r--src/state/queries/threadgate/index.ts15
-rw-r--r--src/state/queries/threadgate/util.ts20
-rw-r--r--src/view/com/post-thread/PostThread.tsx9
-rw-r--r--src/view/com/post-thread/PostThreadItem.tsx32
-rw-r--r--src/view/com/util/post-ctrls/PostCtrls.tsx2
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}