From 31bf3232c041f9c6d149af72f0582b245a031d4e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 9 Jul 2025 11:44:37 +0300 Subject: [PATCH] only update shadows when screen is focused --- src/state/cache/post-shadow.ts | 29 ++++++++++++++++++++++++++--- src/state/cache/profile-shadow.ts | 27 +++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/state/cache/post-shadow.ts b/src/state/cache/post-shadow.ts index d7f1eb8b93..06b2f902d1 100644 --- a/src/state/cache/post-shadow.ts +++ b/src/state/cache/post-shadow.ts @@ -1,9 +1,10 @@ -import {useEffect, useMemo, useState} from 'react' +import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import { AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, type AppBskyFeedDefs, } from '@atproto/api' +import {useFocusEffect} from '@react-navigation/native' import {type QueryClient} from '@tanstack/react-query' import EventEmitter from 'eventemitter3' @@ -44,15 +45,37 @@ export function usePostShadow( setShadow(shadows.get(post)) } + const isFocusedRef = useRef(true) + const hasUpdatedWhileUnfocused = useRef(false) + useFocusEffect( + useCallback(() => { + isFocusedRef.current = true + if (hasUpdatedWhileUnfocused.current) { + console.log('catching up') + setShadow(shadows.get(post)) + hasUpdatedWhileUnfocused.current = false + } + return () => { + isFocusedRef.current = false + } + }, [post]), + ) + useEffect(() => { function onUpdate() { - setShadow(shadows.get(post)) + if (isFocusedRef.current) { + console.log('updating post', post.uri) + setShadow(shadows.get(post)) + } else { + console.log('post changed while unfocused', post.uri) + hasUpdatedWhileUnfocused.current = true + } } emitter.addListener(post.uri, onUpdate) return () => { emitter.removeListener(post.uri, onUpdate) } - }, [post, setShadow]) + }, [post]) return useMemo(() => { if (shadow) { diff --git a/src/state/cache/profile-shadow.ts b/src/state/cache/profile-shadow.ts index 1489e65fd9..af8586a042 100644 --- a/src/state/cache/profile-shadow.ts +++ b/src/state/cache/profile-shadow.ts @@ -1,5 +1,6 @@ -import {useEffect, useMemo, useState} from 'react' +import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import {type AppBskyActorDefs, type AppBskyNotificationDefs} from '@atproto/api' +import {useFocusEffect} from '@react-navigation/native' import {type QueryClient} from '@tanstack/react-query' import EventEmitter from 'eventemitter3' @@ -53,9 +54,31 @@ export function useProfileShadow< setShadow(shadows.get(profile)) } + const isFocusedRef = useRef(true) + const hasUpdatedWhileUnfocused = useRef(false) + useFocusEffect( + useCallback(() => { + isFocusedRef.current = true + if (hasUpdatedWhileUnfocused.current) { + console.log('catching up') + setShadow(shadows.get(profile)) + hasUpdatedWhileUnfocused.current = false + } + return () => { + isFocusedRef.current = false + } + }, [profile]), + ) + useEffect(() => { function onUpdate() { - setShadow(shadows.get(profile)) + if (isFocusedRef.current) { + console.log('updating profile', profile.did) + setShadow(shadows.get(profile)) + } else { + console.log('profile updated while unfocused', profile.did) + hasUpdatedWhileUnfocused.current = true + } } emitter.addListener(profile.did, onUpdate) return () => {