33import { Injectable , OnDestroy } from '@angular/core' ;
44import { StorageService } from './storage.service' ;
55import { SourcesService } from './sources.service' ;
6+ import { ISettingsDict , SettingsService } from './settings.service' ;
67
78const STORAGE_FEED_DATA = 'storage_list_feed_data' ;
89const STORAGE_FEED_DATA_TIMESTAMP = 'storage_list_feed_data_timestamp' ;
@@ -14,8 +15,9 @@ export class FeedService implements OnDestroy {
1415
1516 public entries : any = [ ] ;
1617 public lastUpdated : number = 0 ;
18+ public hidden : number = 0 ;
1719
18- constructor ( private sourcesService : SourcesService , private storageService : StorageService ) {
20+ constructor ( private settingsService : SettingsService , private sourcesService : SourcesService , private storageService : StorageService ) {
1921 this . storageService . onReady . subscribe ( ( ) => {
2022 this . initFeedData ( this . storageService . onReady . value ) ;
2123 } ) ;
@@ -51,7 +53,7 @@ export class FeedService implements OnDestroy {
5153 public async syncEntriesWithUpstream ( event : any ) : Promise < void > {
5254 try {
5355 const feedList = this . sourcesService . getSources ( ) ;
54- const tempFeedMasterData = await Promise . all (
56+ let tempFeedMasterData = await Promise . all (
5557 feedList . map ( async ( feed ) => {
5658 const nextPollDate = feed . lastRetrieved + ( feed . pollingFrequency * 1000 ) ; // Milliseconds
5759 let feedData : Array < any > | null = null ;
@@ -73,11 +75,15 @@ export class FeedService implements OnDestroy {
7375 ) ;
7476
7577 // Flatten the array of arrays and update master feed
76- this . entries = this . sortByDate ( tempFeedMasterData . flat ( ) ) ;
78+ tempFeedMasterData = this . sortByDate ( tempFeedMasterData . flat ( ) ) ;
79+ this . entries = this . filterArticles ( tempFeedMasterData , this . settingsService . getSettings ( ) ) ;
80+ this . hidden = tempFeedMasterData . length - this . entries . length ;
7781 this . storageService . set ( STORAGE_FEED_DATA , JSON . stringify ( this . entries ) ) ;
7882 console . log ( '[FeedService] Rebuilt master feed from upstream' ) ;
7983 this . lastUpdated = Date . now ( ) ;
8084 this . storageService . set ( STORAGE_FEED_DATA_TIMESTAMP , this . lastUpdated ) ;
85+ if ( this . hidden > 0 )
86+ this . sourcesService . presentWarnToast ( `${ this . hidden } articles muted` ) ;
8187 event . target . complete ( ) ;
8288 } catch ( error ) {
8389 console . error ( '[FeedService] An error occurred:' , error ) ;
@@ -103,6 +109,11 @@ export class FeedService implements OnDestroy {
103109 }
104110
105111 this . entries = this . sortByDate ( this . entries ) ;
112+ const fullLength = this . entries . length ;
113+ this . entries = this . filterArticles ( this . entries , this . settingsService . getSettings ( ) ) ;
114+ this . hidden = fullLength - this . entries . length ;
115+ if ( this . hidden > 0 )
116+ this . sourcesService . presentWarnToast ( `${ this . hidden } articles muted` ) ;
106117 this . storageService . set ( STORAGE_FEED_DATA , JSON . stringify ( this . entries ) ) ;
107118 console . log ( '[FeedService] Appended feed ' + feedUrl + ' from cache' ) ;
108119 }
@@ -115,9 +126,19 @@ export class FeedService implements OnDestroy {
115126 console . warn ( `[FeedService] ${ item . url } not found for bookmark status change` ) ;
116127 }
117128
118- private sortByDate ( array : Array < any > ) : Array < any > {
129+ public sortByDate ( array : Array < any > ) : Array < any > {
119130 return array . sort ( ( a : any , b : any ) => {
120131 return new Date ( b . isoDate ) . valueOf ( ) - new Date ( a . isoDate ) . valueOf ( ) ;
121132 } ) ;
122133 }
134+
135+ public filterArticles ( array : Array < any > , settings : ISettingsDict ) : Array < any > {
136+ const muted = settings . mutedWords . map ( w => w . toLowerCase ( ) ) ;
137+ return array . filter ( a => {
138+ const content = ( a . title + ' ' + a . content ) . toLowerCase ( ) ;
139+ return ! muted . some ( word => content . includes ( word ) ) ;
140+ } ) ;
141+ }
142+
143+
123144}
0 commit comments