11/** @format */
22
3- import { Component , OnInit } from "@angular/core" ;
3+ import { Component , OnDestroy , OnInit } from "@angular/core" ;
44import { ActivatedRoute , RouterLink } from "@angular/router" ;
5- import { map , Observable } from "rxjs" ;
5+ import { map , Observable , Subscription } from "rxjs" ;
66import { Program } from "@office/program/models/program.model" ;
77import { ProgramCardComponent } from "../../shared/program-card/program-card.component" ;
88import { AsyncPipe } from "@angular/common" ;
9+ import { NavService } from "@office/services/nav.service" ;
10+ import Fuse from "fuse.js" ;
911
1012@Component ( {
1113 selector : "app-main" ,
@@ -14,13 +16,38 @@ import { AsyncPipe } from "@angular/common";
1416 standalone : true ,
1517 imports : [ RouterLink , ProgramCardComponent , AsyncPipe ] ,
1618} )
17- export class ProgramMainComponent implements OnInit {
18- constructor ( private readonly route : ActivatedRoute ) { }
19+ export class ProgramMainComponent implements OnInit , OnDestroy {
20+ constructor ( private readonly route : ActivatedRoute , private readonly navService : NavService ) { }
1921
20- programs$ : Observable < Program [ ] > = this . route . data . pipe (
21- map ( r => r [ "data" ] ) ,
22- map ( r => r [ "results" ] )
23- ) ;
22+ programCount = 0 ;
2423
25- ngOnInit ( ) : void { }
24+ programs : Program [ ] = [ ] ;
25+ searchedPrograms : Program [ ] = [ ] ;
26+ subscriptions$ : Subscription [ ] = [ ] ;
27+
28+ ngOnInit ( ) : void {
29+ this . navService . setNavTitle ( "Программы" ) ;
30+
31+ const querySearch$ = this . route . queryParams . pipe ( map ( q => q [ "search" ] ) ) . subscribe ( search => {
32+ const fuse = new Fuse ( this . programs , {
33+ keys : [ "name" ] ,
34+ } ) ;
35+
36+ this . searchedPrograms = search ? fuse . search ( search ) . map ( el => el . item ) : this . programs ;
37+ } ) ;
38+
39+ querySearch$ && this . subscriptions$ . push ( querySearch$ ) ;
40+
41+ const programs$ = this . route . data . pipe ( map ( r => r [ "data" ] ) ) . subscribe ( programs => {
42+ this . programCount = programs . count ;
43+ this . programs = programs . results ?? [ ] ;
44+ this . searchedPrograms = programs . results ?? [ ] ;
45+ } ) ;
46+
47+ programs$ && this . subscriptions$ . push ( programs$ ) ;
48+ }
49+
50+ ngOnDestroy ( ) : void {
51+ this . subscriptions$ . forEach ( $ => $ ?. unsubscribe ( ) ) ;
52+ }
2653}
0 commit comments