Add URL pagination and keyboard navigation to Liquid pegs list
This commit is contained in:
		
							parent
							
								
									666165ebe9
								
							
						
					
					
						commit
						524619f48e
					
				| @ -1,6 +1,7 @@ | ||||
| import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; | ||||
| import { BehaviorSubject, Observable, Subject, combineLatest, of, timer } from 'rxjs'; | ||||
| import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; | ||||
| import { ActivatedRoute, Router } from '@angular/router'; | ||||
| import { Component, OnInit, ChangeDetectionStrategy, Input, Inject, LOCALE_ID, ChangeDetectorRef } from '@angular/core'; | ||||
| import { BehaviorSubject, Observable, Subject, Subscription, combineLatest, of, timer } from 'rxjs'; | ||||
| import { delayWhen, filter, map, share, shareReplay, switchMap, take, takeUntil, tap, throttleTime } from 'rxjs/operators'; | ||||
| import { ApiService } from '../../../services/api.service'; | ||||
| import { Env, StateService } from '../../../services/state.service'; | ||||
| import { AuditStatus, CurrentPegs, RecentPeg } from '../../../interfaces/node-api.interface'; | ||||
| @ -29,20 +30,31 @@ export class RecentPegsListComponent implements OnInit { | ||||
|   lastReservesBlockUpdate: number = 0; | ||||
|   currentPeg$: Observable<CurrentPegs>; | ||||
|   pegsCount$: Observable<number>; | ||||
|   pegsCount: number; | ||||
|   startingIndexSubject: BehaviorSubject<number> = new BehaviorSubject(0); | ||||
|   currentIndex: number = 0; | ||||
|   lastPegBlockUpdate: number = 0; | ||||
|   lastPegAmount: string = ''; | ||||
|   isLoad: boolean = true; | ||||
|   queryParamSubscription: Subscription; | ||||
|   keyNavigationSubscription: Subscription; | ||||
|   dir: 'rtl' | 'ltr' = 'ltr'; | ||||
| 
 | ||||
|   private destroy$ = new Subject(); | ||||
|    | ||||
| 
 | ||||
|   constructor( | ||||
|     private apiService: ApiService, | ||||
|     private cd: ChangeDetectorRef, | ||||
|     public stateService: StateService, | ||||
|     private websocketService: WebsocketService, | ||||
|     private seoService: SeoService | ||||
|     private seoService: SeoService, | ||||
|     private route: ActivatedRoute, | ||||
|     private router: Router, | ||||
|     @Inject(LOCALE_ID) private locale: string, | ||||
|   ) { | ||||
|     if (this.locale.startsWith('ar') || this.locale.startsWith('fa') || this.locale.startsWith('he')) { | ||||
|       this.dir = 'rtl'; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   ngOnInit(): void { | ||||
| @ -53,6 +65,26 @@ export class RecentPegsListComponent implements OnInit { | ||||
|     if (!this.widget) { | ||||
|       this.seoService.setTitle($localize`:@@a8b0889ea1b41888f1e247f2731cc9322198ca04:Recent Peg-In / Out's`); | ||||
|       this.websocketService.want(['blocks']); | ||||
| 
 | ||||
|       this.queryParamSubscription = this.route.queryParams.pipe( | ||||
|         tap((params) => this.pageChange(+params['page'] || 1)), | ||||
|       ).subscribe(); | ||||
| 
 | ||||
|       this.keyNavigationSubscription = this.stateService.keyNavigation$.subscribe((event) => { | ||||
|         const prevKey = this.dir === 'ltr' ? 'ArrowLeft' : 'ArrowRight'; | ||||
|         const nextKey = this.dir === 'ltr' ? 'ArrowRight' : 'ArrowLeft'; | ||||
|         if (event.key === prevKey && this.page > 1) { | ||||
|           this.page--; | ||||
|           this.pageChange(this.page); | ||||
|           this.cd.markForCheck(); | ||||
|         } | ||||
|         if (event.key === nextKey && this.page < this.pegsCount / this.pageSize) { | ||||
|           this.page++; | ||||
|           this.pageChange(this.page); | ||||
|           this.cd.markForCheck(); | ||||
|         } | ||||
|       }); | ||||
| 
 | ||||
|       this.auditStatus$ = this.stateService.blocks$.pipe( | ||||
|         takeUntil(this.destroy$), | ||||
|         throttleTime(40000), | ||||
| @ -99,7 +131,10 @@ export class RecentPegsListComponent implements OnInit { | ||||
|         tap(() => this.isPegCountLoading = true), | ||||
|         switchMap(_ => this.apiService.pegsCount$()), | ||||
|         map((data) => data.pegs_count), | ||||
|         tap(() => this.isPegCountLoading = false), | ||||
|         tap((pegsCount) => { | ||||
|           this.isPegCountLoading = false; | ||||
|           this.pegsCount = pegsCount; | ||||
|         }), | ||||
|         share() | ||||
|       ); | ||||
| 
 | ||||
| @ -122,16 +157,19 @@ export class RecentPegsListComponent implements OnInit { | ||||
|         tap(() => this.isLoading = false), | ||||
|         share() | ||||
|       ); | ||||
|    | ||||
| 
 | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   ngOnDestroy(): void { | ||||
|     this.destroy$.next(1); | ||||
|     this.destroy$.complete(); | ||||
|     this.queryParamSubscription?.unsubscribe(); | ||||
|     this.keyNavigationSubscription?.unsubscribe(); | ||||
|   } | ||||
| 
 | ||||
|   pageChange(page: number): void { | ||||
|     this.router.navigate([], { queryParams: { page: page } }); | ||||
|     this.startingIndexSubject.next((page - 1) * 15); | ||||
|     this.page = page; | ||||
|   } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user