about summary refs log tree commit diff
path: root/src/state/models
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models')
-rw-r--r--src/state/models/feed-view.ts15
-rw-r--r--src/state/models/get-assertions-view.ts9
-rw-r--r--src/state/models/log.ts39
-rw-r--r--src/state/models/me.ts15
-rw-r--r--src/state/models/members-view.ts9
-rw-r--r--src/state/models/memberships-view.ts9
-rw-r--r--src/state/models/notifications-view.ts21
-rw-r--r--src/state/models/post-thread-view.ts5
-rw-r--r--src/state/models/post.ts8
-rw-r--r--src/state/models/profile-ui.ts16
-rw-r--r--src/state/models/profile-view.ts9
-rw-r--r--src/state/models/reposted-by-view.ts9
-rw-r--r--src/state/models/root-store.ts2
-rw-r--r--src/state/models/session.ts17
-rw-r--r--src/state/models/suggested-actors-view.ts9
-rw-r--r--src/state/models/suggested-invites-view.ts11
-rw-r--r--src/state/models/user-followers-view.ts7
-rw-r--r--src/state/models/user-follows-view.ts7
-rw-r--r--src/state/models/votes-view.ts9
19 files changed, 129 insertions, 97 deletions
diff --git a/src/state/models/feed-view.ts b/src/state/models/feed-view.ts
index c8827b1fb..28f1d77a3 100644
--- a/src/state/models/feed-view.ts
+++ b/src/state/models/feed-view.ts
@@ -320,11 +320,14 @@ export class FeedModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = cleanError(err)
+    this.error = err ? cleanError(err.toString()) : ''
+    if (err) {
+      this.rootStore.log.error('Posts feed request failed', err)
+    }
   }
 
   // loader functions
@@ -352,7 +355,7 @@ export class FeedModel {
       await this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(e.toString())
+      this._xIdle(e)
     }
   }
 
@@ -363,7 +366,7 @@ export class FeedModel {
       await this._prependAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(e.toString())
+      this._xIdle(e)
     }
   }
 
@@ -380,7 +383,7 @@ export class FeedModel {
       await this._appendAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load feed: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
@@ -408,7 +411,7 @@ export class FeedModel {
       } while (numToFetch > 0)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to update feed: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/get-assertions-view.ts b/src/state/models/get-assertions-view.ts
index 4778ef132..bdb2c0894 100644
--- a/src/state/models/get-assertions-view.ts
+++ b/src/state/models/get-assertions-view.ts
@@ -80,11 +80,14 @@ export class GetAssertionsView {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch assertions', err)
+    }
   }
 
   // loader functions
@@ -99,7 +102,7 @@ export class GetAssertionsView {
       this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(e.toString())
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/log.ts b/src/state/models/log.ts
index 42172a3b1..67f4a210c 100644
--- a/src/state/models/log.ts
+++ b/src/state/models/log.ts
@@ -1,4 +1,5 @@
 import {makeAutoObservable} from 'mobx'
+import {XRPCError, XRPCInvalidResponseError} from '@atproto/xrpc'
 import {isObj, hasProp} from '../lib/type-guards'
 
 interface LogEntry {
@@ -51,9 +52,7 @@ export class LogModel {
   }
 
   debug(summary: string, details?: any) {
-    if (details && typeof details !== 'string') {
-      details = JSON.stringify(details, null, 2)
-    }
+    details = detailsToStr(details)
     console.debug(summary, details || '')
     this.add({
       id: genId(),
@@ -65,10 +64,8 @@ export class LogModel {
   }
 
   warn(summary: string, details?: any) {
-    if (details && typeof details !== 'string') {
-      details = JSON.stringify(details, null, 2)
-    }
-    console.warn(summary, details || '')
+    details = detailsToStr(details)
+    console.debug(summary, details || '')
     this.add({
       id: genId(),
       type: 'warn',
@@ -79,10 +76,8 @@ export class LogModel {
   }
 
   error(summary: string, details?: any) {
-    if (details && typeof details !== 'string') {
-      details = JSON.stringify(details, null, 2)
-    }
-    console.error(summary, details || '')
+    details = detailsToStr(details)
+    console.debug(summary, details || '')
     this.add({
       id: genId(),
       type: 'error',
@@ -92,3 +87,25 @@ export class LogModel {
     })
   }
 }
+
+function detailsToStr(details?: any) {
+  if (details && typeof details !== 'string') {
+    if (
+      details instanceof XRPCInvalidResponseError ||
+      details.constructor.name === 'XRPCInvalidResponseError'
+    ) {
+      return `The server gave an ill-formatted response.\nMethod: ${
+        details.lexiconNsid
+      }.\nError: ${details.validationError.toString()}`
+    } else if (
+      details instanceof XRPCError ||
+      details.constructor.name === 'XRPCError'
+    ) {
+      return `An XRPC error occurred.\nStatus: ${details.status}\nError: ${details.error}\nMessage: ${details.message}`
+    } else if (details instanceof Error) {
+      return details.toString()
+    }
+    return JSON.stringify(details, null, 2)
+  }
+  return details
+}
diff --git a/src/state/models/me.ts b/src/state/models/me.ts
index ae1e6aed2..0ae52db8f 100644
--- a/src/state/models/me.ts
+++ b/src/state/models/me.ts
@@ -104,22 +104,13 @@ export class MeModel {
       })
       await Promise.all([
         this.memberships?.setup().catch(e => {
-          this.rootStore.log.error(
-            'Failed to setup memberships model',
-            e.toString(),
-          )
+          this.rootStore.log.error('Failed to setup memberships model', e)
         }),
         this.mainFeed.setup().catch(e => {
-          this.rootStore.log.error(
-            'Failed to setup main feed model',
-            e.toString(),
-          )
+          this.rootStore.log.error('Failed to setup main feed model', e)
         }),
         this.notifications.setup().catch(e => {
-          this.rootStore.log.error(
-            'Failed to setup notifications model',
-            e.toString(),
-          )
+          this.rootStore.log.error('Failed to setup notifications model', e)
         }),
       ])
     } else {
diff --git a/src/state/models/members-view.ts b/src/state/models/members-view.ts
index 35eafb583..73295f479 100644
--- a/src/state/models/members-view.ts
+++ b/src/state/models/members-view.ts
@@ -104,11 +104,14 @@ export class MembersViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch members', err)
+    }
   }
 
   // loader functions
@@ -123,7 +126,7 @@ export class MembersViewModel {
       this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load feed: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/memberships-view.ts b/src/state/models/memberships-view.ts
index 99bb25645..661b3f6ae 100644
--- a/src/state/models/memberships-view.ts
+++ b/src/state/models/memberships-view.ts
@@ -82,11 +82,14 @@ export class MembershipsViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch memberships', err)
+    }
   }
 
   // loader functions
@@ -101,7 +104,7 @@ export class MembershipsViewModel {
       this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load feed: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/notifications-view.ts b/src/state/models/notifications-view.ts
index 38a8ca133..44f92dd2f 100644
--- a/src/state/models/notifications-view.ts
+++ b/src/state/models/notifications-view.ts
@@ -151,7 +151,7 @@ export class NotificationsViewItemModel implements GroupedNotification {
       await this.additionalPost.setup().catch(e => {
         this.rootStore.log.error(
           'Failed to load post needed by notification',
-          e.toString(),
+          e,
         )
       })
     }
@@ -266,10 +266,7 @@ export class NotificationsViewModel {
       })
       this.rootStore.me.clearNotificationCount()
     } catch (e: any) {
-      this.rootStore.log.warn(
-        'Failed to update notifications read state',
-        e.toString(),
-      )
+      this.rootStore.log.warn('Failed to update notifications read state', e)
     }
   }
 
@@ -282,11 +279,15 @@ export class NotificationsViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
     this.error = cleanError(err)
+    this.error = err ? cleanError(err) : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch notifications', err)
+    }
   }
 
   // loader functions
@@ -314,7 +315,7 @@ export class NotificationsViewModel {
       await this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load notifications: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
@@ -332,7 +333,7 @@ export class NotificationsViewModel {
       await this._appendAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load notifications: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
@@ -359,7 +360,7 @@ export class NotificationsViewModel {
       } while (numToFetch > 0)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to update notifications: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
@@ -386,7 +387,7 @@ export class NotificationsViewModel {
     await Promise.all(promises).catch(e => {
       this.rootStore.log.error(
         'Uncaught failure during notifications-view _appendAll()',
-        e.toString(),
+        e,
       )
     })
     runInAction(() => {
diff --git a/src/state/models/post-thread-view.ts b/src/state/models/post-thread-view.ts
index 2ada18a40..b7c33cfbd 100644
--- a/src/state/models/post-thread-view.ts
+++ b/src/state/models/post-thread-view.ts
@@ -236,11 +236,14 @@ export class PostThreadViewModel {
     this.notFound = false
   }
 
-  private _xIdle(err: any = undefined) {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
     this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch assertions', err)
+    }
     this.notFound = err instanceof GetPostThread.NotFoundError
   }
 
diff --git a/src/state/models/post.ts b/src/state/models/post.ts
index 1c49e32f2..497c8e4c9 100644
--- a/src/state/models/post.ts
+++ b/src/state/models/post.ts
@@ -63,10 +63,14 @@ export class PostModel implements RemoveIndex<Post.Record> {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.hasLoaded = true
     this.error = cleanError(err)
+    this.error = err ? cleanError(err) : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch post', err)
+    }
   }
 
   // loader functions
@@ -87,7 +91,7 @@ export class PostModel implements RemoveIndex<Post.Record> {
       this._replaceAll(res.value)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(e.toString())
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/profile-ui.ts b/src/state/models/profile-ui.ts
index 081160e65..fb90fb694 100644
--- a/src/state/models/profile-ui.ts
+++ b/src/state/models/profile-ui.ts
@@ -114,28 +114,20 @@ export class ProfileUiModel {
     await Promise.all([
       this.profile
         .setup()
-        .catch(err =>
-          this.rootStore.log.error('Failed to fetch profile', err.toString()),
-        ),
+        .catch(err => this.rootStore.log.error('Failed to fetch profile', err)),
       this.feed
         .setup()
-        .catch(err =>
-          this.rootStore.log.error('Failed to fetch feed', err.toString()),
-        ),
+        .catch(err => this.rootStore.log.error('Failed to fetch feed', err)),
     ])
     if (this.isUser) {
       await this.memberships
         .setup()
-        .catch(err =>
-          this.rootStore.log.error('Failed to fetch members', err.toString()),
-        )
+        .catch(err => this.rootStore.log.error('Failed to fetch members', err))
     }
     if (this.isScene) {
       await this.members
         .setup()
-        .catch(err =>
-          this.rootStore.log.error('Failed to fetch members', err.toString()),
-        )
+        .catch(err => this.rootStore.log.error('Failed to fetch members', err))
     }
   }
 
diff --git a/src/state/models/profile-view.ts b/src/state/models/profile-view.ts
index 1c825a482..2670627c3 100644
--- a/src/state/models/profile-view.ts
+++ b/src/state/models/profile-view.ts
@@ -178,11 +178,14 @@ export class ProfileViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch profile', err)
+    }
   }
 
   // loader functions
@@ -198,7 +201,7 @@ export class ProfileViewModel {
       this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(e.toString())
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/reposted-by-view.ts b/src/state/models/reposted-by-view.ts
index 624d86ec0..1ded30976 100644
--- a/src/state/models/reposted-by-view.ts
+++ b/src/state/models/reposted-by-view.ts
@@ -94,11 +94,14 @@ export class RepostedByViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch reposted by view', err)
+    }
   }
 
   // loader functions
@@ -127,7 +130,7 @@ export class RepostedByViewModel {
       this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load feed: ${e.toString()}`)
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/root-store.ts b/src/state/models/root-store.ts
index 0166b67e6..5349f10d0 100644
--- a/src/state/models/root-store.ts
+++ b/src/state/models/root-store.ts
@@ -59,7 +59,7 @@ export class RootStoreModel {
       if (isNetworkError(e)) {
         this.session.setOnline(false) // connection lost
       }
-      this.log.error('Failed to fetch latest state', e.toString())
+      this.log.error('Failed to fetch latest state', e)
     }
   }
 
diff --git a/src/state/models/session.ts b/src/state/models/session.ts
index 3efb5d2a6..13e0fcbe0 100644
--- a/src/state/models/session.ts
+++ b/src/state/models/session.ts
@@ -124,7 +124,7 @@ export class SessionModel {
     } catch (e: any) {
       this.rootStore.log.error(
         `Invalid service URL: ${this.data.service}. Resetting session.`,
-        e.toString(),
+        e,
       )
       this.clear()
       return false
@@ -160,10 +160,7 @@ export class SessionModel {
           this.rootStore.me.clear()
         }
         this.rootStore.me.load().catch(e => {
-          this.rootStore.log.error(
-            'Failed to fetch local user information',
-            e.toString(),
-          )
+          this.rootStore.log.error('Failed to fetch local user information', e)
         })
         return // success
       }
@@ -207,10 +204,7 @@ export class SessionModel {
       this.configureApi()
       this.setOnline(true, false)
       this.rootStore.me.load().catch(e => {
-        this.rootStore.log.error(
-          'Failed to fetch local user information',
-          e.toString(),
-        )
+        this.rootStore.log.error('Failed to fetch local user information', e)
       })
     }
   }
@@ -246,10 +240,7 @@ export class SessionModel {
       this.rootStore.onboard.start()
       this.configureApi()
       this.rootStore.me.load().catch(e => {
-        this.rootStore.log.error(
-          'Failed to fetch local user information',
-          e.toString(),
-        )
+        this.rootStore.log.error('Failed to fetch local user information', e)
       })
     }
   }
diff --git a/src/state/models/suggested-actors-view.ts b/src/state/models/suggested-actors-view.ts
index f52830cfd..358a8491a 100644
--- a/src/state/models/suggested-actors-view.ts
+++ b/src/state/models/suggested-actors-view.ts
@@ -58,11 +58,14 @@ export class SuggestedActorsViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch suggested actors', err)
+    }
   }
 
   // loader functions
@@ -88,7 +91,7 @@ export class SuggestedActorsViewModel {
       )
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(e.toString())
+      this._xIdle(e)
     }
   }
 
diff --git a/src/state/models/suggested-invites-view.ts b/src/state/models/suggested-invites-view.ts
index eb0665bca..fadc956cc 100644
--- a/src/state/models/suggested-invites-view.ts
+++ b/src/state/models/suggested-invites-view.ts
@@ -83,11 +83,14 @@ export class SuggestedInvitesView {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch suggested invites', err)
+    }
   }
 
   // loader functions
@@ -101,7 +104,7 @@ export class SuggestedInvitesView {
     } catch (e: any) {
       this.rootStore.log.error(
         'Failed to fetch current scene members in suggested invites',
-        e.toString(),
+        e,
       )
       this._xIdle(
         'Failed to fetch the current scene members. Check your internet connection and try again.',
@@ -113,7 +116,7 @@ export class SuggestedInvitesView {
     } catch (e: any) {
       this.rootStore.log.error(
         'Failed to fetch current followers in suggested invites',
-        e.toString(),
+        e,
       )
       this._xIdle(
         'Failed to fetch the your current followers. Check your internet connection and try again.',
diff --git a/src/state/models/user-followers-view.ts b/src/state/models/user-followers-view.ts
index 2d8d7cf13..6cb8dfeb6 100644
--- a/src/state/models/user-followers-view.ts
+++ b/src/state/models/user-followers-view.ts
@@ -76,11 +76,14 @@ export class UserFollowersViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch user followers', err)
+    }
   }
 
   // loader functions
diff --git a/src/state/models/user-follows-view.ts b/src/state/models/user-follows-view.ts
index 8cbafddf9..341f0f806 100644
--- a/src/state/models/user-follows-view.ts
+++ b/src/state/models/user-follows-view.ts
@@ -76,11 +76,14 @@ export class UserFollowsViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch user follows', err)
+    }
   }
 
   // loader functions
diff --git a/src/state/models/votes-view.ts b/src/state/models/votes-view.ts
index c92d8ae22..937667b44 100644
--- a/src/state/models/votes-view.ts
+++ b/src/state/models/votes-view.ts
@@ -91,11 +91,14 @@ export class VotesViewModel {
     this.error = ''
   }
 
-  private _xIdle(err: string = '') {
+  private _xIdle(err?: any) {
     this.isLoading = false
     this.isRefreshing = false
     this.hasLoaded = true
-    this.error = err
+    this.error = err ? err.toString() : ''
+    if (err) {
+      this.rootStore.log.error('Failed to fetch votes', err)
+    }
   }
 
   // loader functions
@@ -124,7 +127,7 @@ export class VotesViewModel {
       this._replaceAll(res)
       this._xIdle()
     } catch (e: any) {
-      this._xIdle(`Failed to load feed: ${e.toString()}`)
+      this._xIdle(e)
     }
   }