use a map for cache instead of weakmap for post shadow
This commit is contained in:
Vendored
+9
-11
@@ -26,30 +26,28 @@ export interface PostShadow {
|
|||||||
export const POST_TOMBSTONE = Symbol('PostTombstone')
|
export const POST_TOMBSTONE = Symbol('PostTombstone')
|
||||||
|
|
||||||
const emitter = new EventEmitter()
|
const emitter = new EventEmitter()
|
||||||
const shadows: WeakMap<
|
const shadows: Map<string, Partial<PostShadow>> = new Map()
|
||||||
AppBskyFeedDefs.PostView,
|
|
||||||
Partial<PostShadow>
|
|
||||||
> = new WeakMap()
|
|
||||||
|
|
||||||
export function usePostShadow(
|
export function usePostShadow(
|
||||||
post: AppBskyFeedDefs.PostView,
|
post: AppBskyFeedDefs.PostView,
|
||||||
): Shadow<AppBskyFeedDefs.PostView> | typeof POST_TOMBSTONE {
|
): Shadow<AppBskyFeedDefs.PostView> | typeof POST_TOMBSTONE {
|
||||||
const [shadow, setShadow] = useState(() => shadows.get(post))
|
const {uri} = post
|
||||||
|
const [shadow, setShadow] = useState(() => shadows.get(uri))
|
||||||
const [prevPost, setPrevPost] = useState(post)
|
const [prevPost, setPrevPost] = useState(post)
|
||||||
if (post !== prevPost) {
|
if (post !== prevPost) {
|
||||||
setPrevPost(post)
|
setPrevPost(post)
|
||||||
setShadow(shadows.get(post))
|
setShadow(shadows.get(uri))
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function onUpdate() {
|
function onUpdate() {
|
||||||
setShadow(shadows.get(post))
|
setShadow(shadows.get(uri))
|
||||||
}
|
}
|
||||||
emitter.addListener(post.uri, onUpdate)
|
emitter.addListener(uri, onUpdate)
|
||||||
return () => {
|
return () => {
|
||||||
emitter.removeListener(post.uri, onUpdate)
|
emitter.removeListener(uri, onUpdate)
|
||||||
}
|
}
|
||||||
}, [post, setShadow])
|
}, [uri, setShadow])
|
||||||
|
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
if (shadow) {
|
if (shadow) {
|
||||||
@@ -124,7 +122,7 @@ export function updatePostShadow(
|
|||||||
) {
|
) {
|
||||||
const cachedPosts = findPostsInCache(queryClient, uri)
|
const cachedPosts = findPostsInCache(queryClient, uri)
|
||||||
for (let post of cachedPosts) {
|
for (let post of cachedPosts) {
|
||||||
shadows.set(post, {...shadows.get(post), ...value})
|
shadows.set(post.uri, {...shadows.get(post.uri), ...value})
|
||||||
}
|
}
|
||||||
batchedUpdates(() => {
|
batchedUpdates(() => {
|
||||||
emitter.emit(uri)
|
emitter.emit(uri)
|
||||||
|
|||||||
Reference in New Issue
Block a user