about summary refs log tree commit diff
path: root/src/state/models/feed-view.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models/feed-view.ts')
-rw-r--r--src/state/models/feed-view.ts27
1 files changed, 23 insertions, 4 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