about summary refs log tree commit diff
path: root/src/state
diff options
context:
space:
mode:
Diffstat (limited to 'src/state')
-rw-r--r--src/state/models/feed-view.ts25
-rw-r--r--src/state/models/post-thread-view.ts16
-rw-r--r--src/state/models/root-store.ts10
3 files changed, 50 insertions, 1 deletions
diff --git a/src/state/models/feed-view.ts b/src/state/models/feed-view.ts
index 5697108a1..2b3fba64c 100644
--- a/src/state/models/feed-view.ts
+++ b/src/state/models/feed-view.ts
@@ -166,6 +166,7 @@ export class FeedItemModel {
       did: this.post.author.did,
       rkey: new AtUri(this.post.uri).rkey,
     })
+    this.rootStore.emitPostDeleted(this.post.uri)
   }
 }
 
@@ -256,6 +257,14 @@ export class FeedModel {
   }
 
   /**
+   * Register any event listeners. Returns a cleanup function.
+   */
+  registerListeners() {
+    const sub = this.rootStore.onPostDeleted(this.onPostDeleted.bind(this))
+    return () => sub.remove()
+  }
+
+  /**
    * Reset and load
    */
   async refresh() {
@@ -303,7 +312,7 @@ export class FeedModel {
   }
 
   /**
-   * Check if new postrs are available
+   * Check if new posts are available
    */
   async checkForLatest() {
     if (this.hasNewLatest) {
@@ -322,6 +331,20 @@ export class FeedModel {
     this.setHasNewLatest(hasNewLatest)
   }
 
+  /**
+   * Removes posts from the feed upon deletion.
+   */
+  onPostDeleted(uri: string) {
+    console.log('hit', uri)
+    let i
+    do {
+      i = this.feed.findIndex(item => item.post.uri === uri)
+      if (i !== -1) {
+        this.feed.splice(i, 1)
+      }
+    } while (i !== -1)
+  }
+
   // state transitions
   // =
 
diff --git a/src/state/models/post-thread-view.ts b/src/state/models/post-thread-view.ts
index 1fc188723..584658e14 100644
--- a/src/state/models/post-thread-view.ts
+++ b/src/state/models/post-thread-view.ts
@@ -173,6 +173,7 @@ export class PostThreadViewPostModel {
       did: this.post.author.did,
       rkey: new AtUri(this.post.uri).rkey,
     })
+    this.rootStore.emitPostDeleted(this.post.uri)
   }
 }
 
@@ -230,6 +231,14 @@ export class PostThreadViewModel {
   }
 
   /**
+   * Register any event listeners. Returns a cleanup function.
+   */
+  registerListeners() {
+    const sub = this.rootStore.onPostDeleted(this.onPostDeleted.bind(this))
+    return () => sub.remove()
+  }
+
+  /**
    * Reset and load
    */
   async refresh() {
@@ -246,6 +255,13 @@ export class PostThreadViewModel {
     this._load()
   }
 
+  /**
+   * Refreshes when posts are deleted
+   */
+  onPostDeleted(_uri: string) {
+    this.refresh()
+  }
+
   // state transitions
   // =
 
diff --git a/src/state/models/root-store.ts b/src/state/models/root-store.ts
index 5646157cb..73f1c452f 100644
--- a/src/state/models/root-store.ts
+++ b/src/state/models/root-store.ts
@@ -5,6 +5,7 @@
 import {makeAutoObservable} from 'mobx'
 import {sessionClient as AtpApi, SessionServiceClient} from '@atproto/api'
 import {createContext, useContext} from 'react'
+import {DeviceEventEmitter, EmitterSubscription} from 'react-native'
 import {isObj, hasProp} from '../lib/type-guards'
 import {LogModel} from './log'
 import {SessionModel} from './session'
@@ -102,6 +103,15 @@ export class RootStoreModel {
     this.nav.clear()
     this.me.clear()
   }
+
+  onPostDeleted(handler: (uri: string) => void): EmitterSubscription {
+    return DeviceEventEmitter.addListener('post-deleted', handler)
+  }
+
+  emitPostDeleted(uri: string) {
+    console.log('emit')
+    DeviceEventEmitter.emit('post-deleted', uri)
+  }
 }
 
 const throwawayInst = new RootStoreModel(AtpApi.service('http://localhost')) // this will be replaced by the loader, we just need to supply a value at init