about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/lib/api/feed-manip.ts29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/lib/api/feed-manip.ts b/src/lib/api/feed-manip.ts
index 6fdc9a48f..2429419d8 100644
--- a/src/lib/api/feed-manip.ts
+++ b/src/lib/api/feed-manip.ts
@@ -7,7 +7,7 @@ type FeedViewPost = AppBskyFeedDefs.FeedViewPost
 export type FeedTunerFn = (
   tuner: FeedTuner,
   slices: FeedViewPostsSlice[],
-) => void
+) => FeedViewPostsSlice[]
 
 export class FeedViewPostsSlice {
   isFlattenedReply = false
@@ -87,7 +87,7 @@ export class FeedTuner {
     feed: FeedViewPost[],
     tunerFns: FeedTunerFn[] = [],
   ): FeedViewPostsSlice[] {
-    const slices: FeedViewPostsSlice[] = []
+    let slices: FeedViewPostsSlice[] = []
 
     // arrange the posts into thread slices
     for (let i = feed.length - 1; i >= 0; i--) {
@@ -106,7 +106,7 @@ export class FeedTuner {
 
     // run the custom tuners
     for (const tunerFn of tunerFns) {
-      tunerFn(this, slices)
+      slices = tunerFn(this, slices.slice())
     }
 
     // remove any items already "seen"
@@ -148,7 +148,10 @@ export class FeedTuner {
     return slices
   }
 
-  static dedupReposts(tuner: FeedTuner, slices: FeedViewPostsSlice[]) {
+  static dedupReposts(
+    tuner: FeedTuner,
+    slices: FeedViewPostsSlice[],
+  ): FeedViewPostsSlice[] {
     // remove duplicates caused by reposts
     for (let i = 0; i < slices.length; i++) {
       const item1 = slices[i]
@@ -164,9 +167,13 @@ export class FeedTuner {
         }
       }
     }
+    return slices
   }
 
-  static likedRepliesOnly(tuner: FeedTuner, slices: FeedViewPostsSlice[]) {
+  static likedRepliesOnly(
+    tuner: FeedTuner,
+    slices: FeedViewPostsSlice[],
+  ): FeedViewPostsSlice[] {
     // remove any replies without at least 2 likes
     for (let i = slices.length - 1; i >= 0; i--) {
       if (slices[i].isFullThread || !slices[i].rootItem.reply) {
@@ -178,11 +185,16 @@ export class FeedTuner {
         slices.splice(i, 1)
       }
     }
+    return slices
   }
 
   static preferredLangOnly(langsCode2: string[]) {
     const langsCode3 = langsCode2.map(l => LANGUAGES_MAP_CODE2[l]?.code3 || l)
-    return (tuner: FeedTuner, slices: FeedViewPostsSlice[]) => {
+    return (
+      tuner: FeedTuner,
+      slices: FeedViewPostsSlice[],
+    ): FeedViewPostsSlice[] => {
+      const origSlices = slices.concat()
       for (let i = slices.length - 1; i >= 0; i--) {
         let hasPreferredLang = false
         for (const item of slices[i].items) {
@@ -202,6 +214,11 @@ export class FeedTuner {
           slices.splice(i, 1)
         }
       }
+      if (slices.length) {
+        return slices
+      }
+      // fallback: give everything if the language filter left nothing
+      return origSlices
     }
   }
 }