···2424yarn ios # Run on iOS
25252626# Testing & Quality
2727+# IMPORTANT: Always use these yarn scripts, never call the underlying tools directly
2728yarn test # Run Jest tests
2829yarn lint # Run ESLint
2930yarn typecheck # Run TypeScript type checking
+18-20
src/view/com/posts/PostFeed.tsx
···11-import {
22- type JSX,
33- memo,
44- useCallback,
55- useEffect,
66- useMemo,
77- useRef,
88- useState,
99-} from 'react'
11+import {memo, useCallback, useEffect, useMemo, useRef, useState} from 'react'
102import {
113 ActivityIndicator,
124 AppState,
···220212 scrollElRef?: ListRef
221213 onHasNew?: (v: boolean) => void
222214 onScrolledDownChange?: (isScrolledDown: boolean) => void
223223- renderEmptyState: () => JSX.Element
224224- renderEndOfFeed?: () => JSX.Element
215215+ renderEmptyState: () => React.ReactElement
216216+ renderEndOfFeed?: () => React.ReactElement
225217 testID?: string
226218 headerOffset?: number
227219 progressViewOffset?: number
228220 desktopFixedHeightOffset?: number
229229- ListHeaderComponent?: () => JSX.Element
221221+ ListHeaderComponent?: () => React.ReactElement
230222 extraData?: any
231223 savedFeedConfig?: AppBskyActorDefs.SavedFeed
232224 initialNumToRender?: number
···309301 }
310302 })
311303304304+ const isScrolledDownRef = useRef(false)
305305+ const handleScrolledDownChange = (isScrolledDown: boolean) => {
306306+ isScrolledDownRef.current = isScrolledDown
307307+ onScrolledDownChange?.(isScrolledDown)
308308+ }
309309+312310 const myDid = currentAccount?.did || ''
313311 const onPostCreated = useCallback(() => {
314312 // NOTE
315315- // only invalidate if there's 1 page
316316- // more than 1 page can trigger some UI freakouts on iOS and android
317317- // -prf
313313+ // only invalidate if at the top of the feed
314314+ // changing content when scrolled can trigger some UI freakouts on iOS and android
315315+ // -sfn
318316 if (
319319- data?.pages.length === 1 &&
317317+ !isScrolledDownRef.current &&
320318 (feed === 'following' ||
321319 feed === `author|${myDid}|posts_and_author_threads`)
322320 ) {
323323- queryClient.invalidateQueries({queryKey: RQKEY(feed)})
321321+ void queryClient.invalidateQueries({queryKey: RQKEY(feed)})
324322 }
325325- }, [queryClient, feed, data, myDid])
323323+ }, [queryClient, feed, myDid])
326324 useEffect(() => {
327325 return listenPostCreated(onPostCreated)
328326 }, [onPostCreated])
···981979 }
982980 }
983981 },
984984- [feedFeedback, feed, liveNowConfig, getPostPosition],
982982+ [feedFeedback, feed, liveNowConfig, getPostPosition, ax],
985983 )
986984987985 return (
···1001999 contentContainerStyle={{
10021000 minHeight: Dimensions.get('window').height * 1.5,
10031001 }}
10041004- onScrolledDownChange={onScrolledDownChange}
10021002+ onScrolledDownChange={handleScrolledDownChange}
10051003 onEndReached={onEndReached}
10061004 onEndReachedThreshold={2} // number of posts left to trigger load more
10071005 removeClippedSubviews={true}