Add feed option for sorting and flat/thread feed

This commit is contained in:
SondreB 2022-12-26 19:19:33 +01:00
parent c730188cf4
commit ca38fa0f7e
No known key found for this signature in database
GPG Key ID: D6CC44C75005FDBF
3 changed files with 42 additions and 6 deletions

View File

@ -1,4 +1,4 @@
<span *ngIf="feedService.filteredEvents$ | async as events"> <span *ngIf="feedService.threadedEvents$ | async as events">
<mat-progress-bar *ngIf="events == null" mode="indeterminate"></mat-progress-bar> <mat-progress-bar *ngIf="events == null" mode="indeterminate"></mat-progress-bar>
<div class="page loading-container" *ngIf="!profileService.initialized"> <div class="page loading-container" *ngIf="!profileService.initialized">
@ -65,6 +65,8 @@
<mat-panel-description>{{ activeOptions() }}</mat-panel-description> <mat-panel-description>{{ activeOptions() }}</mat-panel-description>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p> <p>
<mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.flatfeed" (ngModelChange)="optionsUpdated()">Flat Feed (turn off threads)</mat-slide-toggle>
<mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.ascending" (ngModelChange)="optionsUpdated()">Oldest first</mat-slide-toggle>
<mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.paused">Pause feed</mat-slide-toggle> <mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.paused">Pause feed</mat-slide-toggle>
<mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.hideSpam" (ngModelChange)="optionsUpdated()">Hide spam</mat-slide-toggle> <mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.hideSpam" (ngModelChange)="optionsUpdated()">Hide spam</mat-slide-toggle>
<mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.hideInvoice" (ngModelChange)="optionsUpdated()">Hide LN invoices</mat-slide-toggle> <mat-slide-toggle class="options-slider" [(ngModel)]="settings.options.hideInvoice" (ngModelChange)="optionsUpdated()">Hide LN invoices</mat-slide-toggle>

View File

@ -24,6 +24,8 @@ export class FeedService {
#filteredEventsChanged: BehaviorSubject<NostrEventDocument[]> = new BehaviorSubject<NostrEventDocument[]>([]); #filteredEventsChanged: BehaviorSubject<NostrEventDocument[]> = new BehaviorSubject<NostrEventDocument[]>([]);
#threadedEventsChanged: BehaviorSubject<NostrEventDocument[]> = new BehaviorSubject<NostrEventDocument[]>([]);
sortSubject = new BehaviorSubject<'asc' | 'desc'>('asc'); sortSubject = new BehaviorSubject<'asc' | 'desc'>('asc');
sort$ = this.sortSubject.asObservable(); sort$ = this.sortSubject.asObservable();
sortOrder: 'asc' | 'desc' = 'asc'; sortOrder: 'asc' | 'desc' = 'asc';
@ -37,6 +39,35 @@ export class FeedService {
// return this.#eventsChanged.asObservable(); // return this.#eventsChanged.asObservable();
// } // }
get threadedEvents$(): Observable<NostrEventDocument[]> {
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<NostrEventDocument[]> { get filteredEvents$(): Observable<NostrEventDocument[]> {
// combineLatest([this.sort$, this.events$]) // combineLatest([this.sort$, this.events$])
// 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<NostrEventDocument>('events');
}
#updated() { #updated() {
this.#eventsChanged.next(this.events); this.#eventsChanged.next(this.events);
this.#filteredEventsChanged.next(this.events); this.#filteredEventsChanged.next(this.events);
this.#threadedEventsChanged.next(this.events);
} }
async #persist(event: NostrEventDocument) { 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<NostrEventDocument>('events');
}
scheduleProfileDownload() { scheduleProfileDownload() {
setTimeout(() => { setTimeout(() => {
console.log('scheduleProfileDownload:setTimeout'); console.log('scheduleProfileDownload:setTimeout');

View File

@ -6,6 +6,8 @@ export interface Options {
paused?: boolean; paused?: boolean;
privateFeed?: boolean; privateFeed?: boolean;
publicFeed?: boolean; publicFeed?: boolean;
flatfeed?: boolean;
ascending?: boolean;
} }
@Injectable({ @Injectable({