From ca38fa0f7e318ab87c624559f70f406ff36a195d Mon Sep 17 00:00:00 2001 From: SondreB Date: Mon, 26 Dec 2022 19:19:33 +0100 Subject: [PATCH] Add feed option for sorting and flat/thread feed --- .../feed-private/feed-private.component.html | 4 +- src/app/services/feed.service.ts | 42 ++++++++++++++++--- src/app/services/settings.service.ts | 2 + 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/app/feed-private/feed-private.component.html b/src/app/feed-private/feed-private.component.html index fbb3853..7a7b8b0 100644 --- a/src/app/feed-private/feed-private.component.html +++ b/src/app/feed-private/feed-private.component.html @@ -1,4 +1,4 @@ - +
@@ -65,6 +65,8 @@ {{ activeOptions() }}

+ Flat Feed (turn off threads) + Oldest first Pause feed Hide spam Hide LN invoices diff --git a/src/app/services/feed.service.ts b/src/app/services/feed.service.ts index 2ec1ea1..d9a1ed8 100644 --- a/src/app/services/feed.service.ts +++ b/src/app/services/feed.service.ts @@ -24,6 +24,8 @@ export class FeedService { #filteredEventsChanged: BehaviorSubject = new BehaviorSubject([]); + #threadedEventsChanged: BehaviorSubject = new BehaviorSubject([]); + sortSubject = new BehaviorSubject<'asc' | 'desc'>('asc'); sort$ = this.sortSubject.asObservable(); sortOrder: 'asc' | 'desc' = 'asc'; @@ -37,6 +39,35 @@ export class FeedService { // return this.#eventsChanged.asObservable(); // } + get threadedEvents$(): Observable { + return this.#threadedEventsChanged + .asObservable() + .pipe( + map((data) => { + if (this.settings.options.flatfeed) { + return data; + // return data.filter((events) => !events.tags.find((t) => t[0] === 'e')); + } else { + return data.filter((events) => !events.tags.find((t) => t[0] === 'e')); + } + }) + ) // If there is any 'e' tags then skip. + .pipe(map((data) => data.filter((events) => !this.profileService.blockedPublickKeys().includes(events.pubkey) && !this.profileService.mutedPublicKeys().includes(events.pubkey)))) + .pipe( + map((data) => { + data.sort((a, b) => { + if (this.settings.options.ascending) { + return a.created_at < b.created_at ? -1 : 1; + } else { + return a.created_at > b.created_at ? -1 : 1; + } + }); + + return data; + }) + ); + } + get filteredEvents$(): Observable { // combineLatest([this.sort$, this.events$]) // combineLatest([this.sort$, this.events$]) @@ -67,9 +98,15 @@ export class FeedService { ); } + constructor(private settings: SettingsService, private eventService: EventService, private validator: DataValidation, private storage: StorageService, private profileService: ProfileService, private circlesService: CirclesService) { + console.log('FEED SERVICE CONSTRUCTOR!'); + this.#table = this.storage.table('events'); + } + #updated() { this.#eventsChanged.next(this.events); this.#filteredEventsChanged.next(this.events); + this.#threadedEventsChanged.next(this.events); } async #persist(event: NostrEventDocument) { @@ -134,11 +171,6 @@ export class FeedService { }); } - constructor(private eventService: EventService, private validator: DataValidation, private storage: StorageService, private profileService: ProfileService, private circlesService: CirclesService) { - console.log('FEED SERVICE CONSTRUCTOR!'); - this.#table = this.storage.table('events'); - } - scheduleProfileDownload() { setTimeout(() => { console.log('scheduleProfileDownload:setTimeout'); diff --git a/src/app/services/settings.service.ts b/src/app/services/settings.service.ts index eca0901..898c03b 100644 --- a/src/app/services/settings.service.ts +++ b/src/app/services/settings.service.ts @@ -6,6 +6,8 @@ export interface Options { paused?: boolean; privateFeed?: boolean; publicFeed?: boolean; + flatfeed?: boolean; + ascending?: boolean; } @Injectable({