diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/state/models/feed-view.ts | 27 | ||||
-rw-r--r-- | src/view/com/util/images/AutoSizedImage.tsx | 1 | ||||
-rw-r--r-- | src/view/screens/Home.tsx | 3 |
3 files changed, 25 insertions, 6 deletions
diff --git a/src/state/models/feed-view.ts b/src/state/models/feed-view.ts index 50906f3b2..f2832887a 100644 --- a/src/state/models/feed-view.ts +++ b/src/state/models/feed-view.ts @@ -202,6 +202,7 @@ export class FeedModel { _loadMorePromise: Promise<void> | undefined _loadLatestPromise: Promise<void> | undefined _updatePromise: Promise<void> | undefined + _prefetchedRefresh: GetTimeline.Response | GetAuthorFeed.Response | undefined // data feed: FeedItemModel[] = [] @@ -221,6 +222,7 @@ export class FeedModel { _loadMorePromise: false, _loadLatestPromise: false, _updatePromise: false, + _prefetchedRefresh: false, }, {autoBind: true}, ) @@ -278,7 +280,15 @@ export class FeedModel { * Reset and load */ async refresh() { - return this.setup(true) + if (this._prefetchedRefresh) { + await this._pendingWork() + this._replaceAll(this._prefetchedRefresh) + this.setHasNewLatest(false) + this._xIdle() + } else { + await this.setup(true) + } + this._prefetchedRefresh = undefined } /** @@ -330,10 +340,19 @@ export class FeedModel { } await this._pendingWork() const res = await this._getFeed({limit: 1}) - this.setHasNewLatest( - res.data.feed[0] && - (this.feed.length === 0 || res.data.feed[0].uri !== this.pollCursor), + const prefetchedLatestUri = this._prefetchedRefresh?.data.feed[0]?.uri + const currentLatestUri = prefetchedLatestUri || this.pollCursor + const receivedLatestUri = res.data.feed[0] + ? res.data.feed[0].uri + : undefined + const hasNewLatest = Boolean( + receivedLatestUri && + (this.feed.length === 0 || receivedLatestUri !== currentLatestUri), ) + this.setHasNewLatest(hasNewLatest) + if (hasNewLatest && prefetchedLatestUri !== receivedLatestUri) { + this._prefetchedRefresh = await this._getFeed({limit: PAGE_SIZE}) + } } // state transitions diff --git a/src/view/com/util/images/AutoSizedImage.tsx b/src/view/com/util/images/AutoSizedImage.tsx index a60ddb89c..7243e6fb3 100644 --- a/src/view/com/util/images/AutoSizedImage.tsx +++ b/src/view/com/util/images/AutoSizedImage.tsx @@ -38,7 +38,6 @@ export function AutoSizedImage({ Image.getSize( uri, (width: number, height: number) => { - console.log('gotSize') if (!aborted) { setImgInfo({width, height}) } diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index c5d5ca616..059abfb37 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -51,6 +51,7 @@ export const Home = observer(function Home({ if (hasSetup) { console.log('Updating home feed') store.me.mainFeed.update() + doPoll() } else { store.nav.setTitle(navIdx, 'Home') console.log('Fetching home feed') @@ -88,7 +89,7 @@ export const Home = observer(function Home({ onPressTryAgain={onPressTryAgain} onScroll={onMainScroll} /> - {store.me.mainFeed.hasNewLatest ? ( + {store.me.mainFeed.hasNewLatest && !store.me.mainFeed.isRefreshing ? ( <TouchableOpacity style={[ styles.loadLatest, |