about summary refs log tree commit diff
path: root/src/state/models/feeds/posts.ts
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2023-04-03 15:57:17 -0500
committerGitHub <noreply@github.com>2023-04-03 15:57:17 -0500
commitb12cd53a4dee180e8b538a6713fa775446c30140 (patch)
tree4992948fef5c7f34b192e6eb4564dadcf710f1c2 /src/state/models/feeds/posts.ts
parent2045c615a8f8a39ee9f54638a234f3d45f028399 (diff)
downloadvoidsky-b12cd53a4dee180e8b538a6713fa775446c30140.tar.zst
Improve "Load more" error handling in feeds (#379)
* Add explicit load-more error handling to posts feed

* Add explicit load-more error handling to notifications feed

* Properly set hasMore to false after an error
Diffstat (limited to 'src/state/models/feeds/posts.ts')
-rw-r--r--src/state/models/feeds/posts.ts33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/state/models/feeds/posts.ts b/src/state/models/feeds/posts.ts
index 9e593f313..0046f9781 100644
--- a/src/state/models/feeds/posts.ts
+++ b/src/state/models/feeds/posts.ts
@@ -213,6 +213,7 @@ export class PostsFeedModel {
   hasNewLatest = false
   hasLoaded = false
   error = ''
+  loadMoreError = ''
   params: GetTimeline.QueryParams | GetAuthorFeed.QueryParams
   hasMore = true
   loadMoreCursor: string | undefined
@@ -382,12 +383,10 @@ export class PostsFeedModel {
         await this._appendAll(res)
         this._xIdle()
       } catch (e: any) {
-        this._xIdle() // don't bubble the error to the user
-        this.rootStore.log.error('FeedView: Failed to load more', {
-          params: this.params,
-          e,
+        this._xIdle(undefined, e)
+        runInAction(() => {
+          this.hasMore = false
         })
-        this.hasMore = false
       }
     } finally {
       this.lock.release()
@@ -395,6 +394,15 @@ export class PostsFeedModel {
   })
 
   /**
+   * Attempt to load more again after a failure
+   */
+  async retryLoadMore() {
+    this.loadMoreError = ''
+    this.hasMore = true
+    return this.loadMore()
+  }
+
+  /**
    * Update content in-place
    */
   update = bundleAsync(async () => {
@@ -503,13 +511,20 @@ export class PostsFeedModel {
     this.error = ''
   }
 
-  _xIdle(err?: any) {
+  _xIdle(error?: any, loadMoreError?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = cleanError(err)
-    if (err) {
-      this.rootStore.log.error('Posts feed request failed', err)
+    this.error = cleanError(error)
+    this.loadMoreError = cleanError(loadMoreError)
+    if (error) {
+      this.rootStore.log.error('Posts feed request failed', error)
+    }
+    if (loadMoreError) {
+      this.rootStore.log.error(
+        'Posts feed load-more request failed',
+        loadMoreError,
+      )
     }
   }