about summary refs log tree commit diff
path: root/src/state
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 /src/state
parent61f0be705d614a31331945e1c4b9361d71b81403 (diff)
downloadvoidsky-d5c78b9183ac78620f59538fed61c8130ae1c47a.tar.zst
Prep threadgate shadow hack (#4970)
Co-authored-by: Hailey <me@haileyok.com>
Diffstat (limited to 'src/state')
-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
3 files changed, 46 insertions, 2 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,
+  }
+}