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/content/list.ts2
-rw-r--r--src/state/models/lists/lists-list.ts15
-rw-r--r--src/state/models/root-store.ts8
-rw-r--r--src/state/models/ui/profile.ts5
4 files changed, 29 insertions, 1 deletions
diff --git a/src/state/models/content/list.ts b/src/state/models/content/list.ts
index c5ac72e49..2498cf581 100644
--- a/src/state/models/content/list.ts
+++ b/src/state/models/content/list.ts
@@ -217,6 +217,8 @@ export class ListModel {
         records.map(record => createDel(record.uri)),
       ),
     })
+
+    this.rootStore.emitListDeleted(this.uri)
   }
 
   async subscribe() {
diff --git a/src/state/models/lists/lists-list.ts b/src/state/models/lists/lists-list.ts
index 6618c3bf6..54e2f5fde 100644
--- a/src/state/models/lists/lists-list.ts
+++ b/src/state/models/lists/lists-list.ts
@@ -48,9 +48,24 @@ export class ListsListModel {
     return this.hasLoaded && !this.hasContent
   }
 
+  /**
+   * Removes posts from the feed upon deletion.
+   */
+  onListDeleted(uri: string) {
+    this.lists = this.lists.filter(l => l.uri !== uri)
+  }
+
   // public api
   // =
 
+  /**
+   * Register any event listeners. Returns a cleanup function.
+   */
+  registerListeners() {
+    const sub = this.rootStore.onListDeleted(this.onListDeleted.bind(this))
+    return () => sub.remove()
+  }
+
   async refresh() {
     return this.loadMore(true)
   }
diff --git a/src/state/models/root-store.ts b/src/state/models/root-store.ts
index 389ce86d8..d76ea07c9 100644
--- a/src/state/models/root-store.ts
+++ b/src/state/models/root-store.ts
@@ -188,6 +188,14 @@ export class RootStoreModel {
     DeviceEventEmitter.emit('post-deleted', uri)
   }
 
+  // a list was deleted by the local user
+  onListDeleted(handler: (uri: string) => void): EmitterSubscription {
+    return DeviceEventEmitter.addListener('list-deleted', handler)
+  }
+  emitListDeleted(uri: string) {
+    DeviceEventEmitter.emit('list-deleted', uri)
+  }
+
   // the session has started and been fully hydrated
   onSessionLoaded(handler: () => void): EmitterSubscription {
     return DeviceEventEmitter.addListener('session-loaded', handler)
diff --git a/src/state/models/ui/profile.ts b/src/state/models/ui/profile.ts
index 81daf797f..a0249d768 100644
--- a/src/state/models/ui/profile.ts
+++ b/src/state/models/ui/profile.ts
@@ -87,7 +87,10 @@ export class ProfileUiModel {
   }
 
   get selectedView() {
-    return this.selectorItems[this.selectedViewIndex]
+    // If, for whatever reason, the selected view index is not available, default back to posts
+    // This can happen when the user was focused on a view but performed an action that caused
+    // the view to disappear (e.g. deleting the last list in their list of lists https://imgflip.com/i/7txu1y)
+    return this.selectorItems[this.selectedViewIndex] || Sections.Posts
   }
 
   get uiItems() {