about summary refs log tree commit diff
path: root/src/state/models/feeds
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models/feeds')
-rw-r--r--src/state/models/feeds/notifications.ts54
-rw-r--r--src/state/models/feeds/posts.ts22
2 files changed, 66 insertions, 10 deletions
diff --git a/src/state/models/feeds/notifications.ts b/src/state/models/feeds/notifications.ts
index 220e04bce..02f58819f 100644
--- a/src/state/models/feeds/notifications.ts
+++ b/src/state/models/feeds/notifications.ts
@@ -15,6 +15,16 @@ import {bundleAsync} from 'lib/async/bundle'
 import {RootStoreModel} from '../root-store'
 import {PostThreadModel} from '../content/post-thread'
 import {cleanError} from 'lib/strings/errors'
+import {
+  PostLabelInfo,
+  PostModeration,
+  ModerationBehaviorCode,
+} from 'lib/labeling/types'
+import {
+  getPostModeration,
+  filterAccountLabels,
+  filterProfileLabels,
+} from 'lib/labeling/helpers'
 
 const GROUPABLE_REASONS = ['like', 'repost', 'follow']
 const PAGE_SIZE = 30
@@ -90,6 +100,24 @@ export class NotificationsFeedItemModel {
     }
   }
 
+  get labelInfo(): PostLabelInfo {
+    const addedInfo = this.additionalPost?.thread?.labelInfo
+    return {
+      postLabels: (this.labels || []).concat(addedInfo?.postLabels || []),
+      accountLabels: filterAccountLabels(this.author.labels).concat(
+        addedInfo?.accountLabels || [],
+      ),
+      profileLabels: filterProfileLabels(this.author.labels).concat(
+        addedInfo?.profileLabels || [],
+      ),
+      isMuted: this.author.viewer?.muted || addedInfo?.isMuted || false,
+    }
+  }
+
+  get moderation(): PostModeration {
+    return getPostModeration(this.rootStore, this.labelInfo)
+  }
+
   get numUnreadInGroup(): number {
     if (this.additional?.length) {
       return (
@@ -520,16 +548,22 @@ export class NotificationsFeedModel {
   _filterNotifications(
     items: NotificationsFeedItemModel[],
   ): NotificationsFeedItemModel[] {
-    return items.filter(item => {
-      const hideByLabel =
-        this.rootStore.preferences.getLabelPreference(item.labels).pref ===
-        'hide'
-      let mutedThread = !!(
-        item.reasonSubjectRootUri &&
-        this.rootStore.mutedThreads.uris.has(item.reasonSubjectRootUri)
-      )
-      return !hideByLabel && !mutedThread
-    })
+    return items
+      .filter(item => {
+        const hideByLabel =
+          item.moderation.list.behavior === ModerationBehaviorCode.Hide
+        let mutedThread = !!(
+          item.reasonSubjectRootUri &&
+          this.rootStore.mutedThreads.uris.has(item.reasonSubjectRootUri)
+        )
+        return !hideByLabel && !mutedThread
+      })
+      .map(item => {
+        if (item.additional?.length) {
+          item.additional = this._filterNotifications(item.additional)
+        }
+        return item
+      })
   }
 
   async _fetchItemModels(
diff --git a/src/state/models/feeds/posts.ts b/src/state/models/feeds/posts.ts
index cbff707d0..62c6da3de 100644
--- a/src/state/models/feeds/posts.ts
+++ b/src/state/models/feeds/posts.ts
@@ -20,6 +20,13 @@ import {
 } from 'lib/api/build-suggested-posts'
 import {FeedTuner, FeedViewPostsSlice} from 'lib/api/feed-manip'
 import {updateDataOptimistically} from 'lib/async/revertible'
+import {PostLabelInfo, PostModeration} from 'lib/labeling/types'
+import {
+  getEmbedLabels,
+  getPostModeration,
+  filterAccountLabels,
+  filterProfileLabels,
+} from 'lib/labeling/helpers'
 
 type FeedViewPost = AppBskyFeedDefs.FeedViewPost
 type ReasonRepost = AppBskyFeedDefs.ReasonRepost
@@ -83,6 +90,21 @@ export class PostsFeedItemModel {
     return this.rootStore.mutedThreads.uris.has(this.rootUri)
   }
 
+  get labelInfo(): PostLabelInfo {
+    return {
+      postLabels: (this.post.labels || []).concat(
+        getEmbedLabels(this.post.embed),
+      ),
+      accountLabels: filterAccountLabels(this.post.author.labels),
+      profileLabels: filterProfileLabels(this.post.author.labels),
+      isMuted: this.post.author.viewer?.muted || false,
+    }
+  }
+
+  get moderation(): PostModeration {
+    return getPostModeration(this.rootStore, this.labelInfo)
+  }
+
   copy(v: FeedViewPost) {
     this.post = v.post
     this.reply = v.reply