about summary refs log tree commit diff
path: root/src/state/cache/post-shadow.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/cache/post-shadow.ts')
-rw-r--r--src/state/cache/post-shadow.ts17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/state/cache/post-shadow.ts b/src/state/cache/post-shadow.ts
index c06ed60c4..c49097700 100644
--- a/src/state/cache/post-shadow.ts
+++ b/src/state/cache/post-shadow.ts
@@ -1,6 +1,8 @@
 import {useEffect, useState, useCallback, useRef} from 'react'
 import EventEmitter from 'eventemitter3'
 import {AppBskyFeedDefs} from '@atproto/api'
+import {Shadow} from './types'
+export type {Shadow} from './types'
 
 const emitter = new EventEmitter()
 
@@ -22,7 +24,7 @@ interface CacheEntry {
 export function usePostShadow(
   post: AppBskyFeedDefs.PostView,
   ifAfterTS: number,
-): AppBskyFeedDefs.PostView | typeof POST_TOMBSTONE {
+): Shadow<AppBskyFeedDefs.PostView> | typeof POST_TOMBSTONE {
   const [state, setState] = useState<CacheEntry>({
     ts: Date.now(),
     value: fromPost(post),
@@ -53,13 +55,21 @@ export function usePostShadow(
     firstRun.current = false
   }, [post])
 
-  return state.ts > ifAfterTS ? mergeShadow(post, state.value) : post
+  return state.ts > ifAfterTS
+    ? mergeShadow(post, state.value)
+    : {...post, isShadowed: true}
 }
 
 export function updatePostShadow(uri: string, value: Partial<PostShadow>) {
   emitter.emit(uri, value)
 }
 
+export function isPostShadowed(
+  v: AppBskyFeedDefs.PostView | Shadow<AppBskyFeedDefs.PostView>,
+): v is Shadow<AppBskyFeedDefs.PostView> {
+  return 'isShadowed' in v && !!v.isShadowed
+}
+
 function fromPost(post: AppBskyFeedDefs.PostView): PostShadow {
   return {
     likeUri: post.viewer?.like,
@@ -73,7 +83,7 @@ function fromPost(post: AppBskyFeedDefs.PostView): PostShadow {
 function mergeShadow(
   post: AppBskyFeedDefs.PostView,
   shadow: PostShadow,
-): AppBskyFeedDefs.PostView | typeof POST_TOMBSTONE {
+): Shadow<AppBskyFeedDefs.PostView> | typeof POST_TOMBSTONE {
   if (shadow.isDeleted) {
     return POST_TOMBSTONE
   }
@@ -86,5 +96,6 @@ function mergeShadow(
       like: shadow.likeUri,
       repost: shadow.repostUri,
     },
+    isShadowed: true,
   }
 }