aboutsummaryrefslogblamecommitdiffhomepage
path: root/client/src/app/videos/video-list/video-list.component.ts
blob: 7c6d4b992d387463136502c05b85a81e51fe73c9 (plain) (tree)
1
2
3
4
5
6
7



                                                                                
 

                                                                            





                  
                   
                                                                          
                                                                      
                                                            
                                             


                             
                                                     
                       
                                                   
                                                                                                                        

  

                                                                 


                            
                    
    
                  
                        
                       
 
                         

                                 
 
              
                                     
                                              
                           
                                  
                                       
                                        
      

              
                                        
                                  
     
 


                                                                         
 
                                            


                                                        
 


                                                                           

                                      
 
                                 

       
 
                 

                                         

   
               
                            
                     

                                        
 

                          
                            
                                                                                           
            
                                                                           


                         

                                    
                                                 
 
                                 
        



                           








                                                                

   
                           
                     

   

                           
 




                                                
                         

                                       

      
                              
                            
                                       
                                        

     

















                                                                 




                                                                  






                                                        
   
 
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { AsyncPipe } from '@angular/common';
import { ActivatedRoute, Router, ROUTER_DIRECTIVES } from '@angular/router';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

import { PAGINATION_DIRECTIVES } from 'ng2-bootstrap/components/pagination';

import {
  LoaderComponent,
  Pagination,
  SortField,
  Video,
  VideoService
} from '../shared';
import { AuthService, AuthUser, Search, SearchField } from '../../shared';
import { VideoMiniatureComponent } from './video-miniature.component';
import { VideoSortComponent } from './video-sort.component';
import { SearchService } from '../../shared';

@Component({
  selector: 'my-videos-list',
  styles: [ require('./video-list.component.scss') ],
  pipes: [ AsyncPipe ],
  template: require('./video-list.component.html'),
  directives: [ LoaderComponent, PAGINATION_DIRECTIVES, ROUTER_DIRECTIVES, VideoMiniatureComponent, VideoSortComponent ]
})

export class VideoListComponent implements OnInit, OnDestroy {
  loading: BehaviorSubject<boolean> = new BehaviorSubject(false);
  pagination: Pagination = {
    currentPage: 1,
    itemsPerPage: 9,
    totalItems: null
  };
  sort: SortField;
  user: AuthUser = null;
  videos: Video[] = [];

  private search: Search;
  private subActivatedRoute: any;
  private subSearch: any;

  constructor(
    private authService: AuthService,
    private changeDetector: ChangeDetectorRef,
    private router: Router,
    private route: ActivatedRoute,
    private videoService: VideoService,
    private searchService: SearchService
  ) {}

  ngOnInit() {
    if (this.authService.isLoggedIn()) {
      this.user = AuthUser.load();
    }

    // Subscribe to route changes
    this.subActivatedRoute = this.route.params.subscribe(routeParams => {
      this.loadRouteParams(routeParams);

      // Update the search service component
      this.searchService.updateSearch.next(this.search);
      this.getVideos();
    });

    // Subscribe to search changes
    this.subSearch = this.searchService.searchUpdated.subscribe(search => {
      this.search = search;
      // Reset pagination
      this.pagination.currentPage = 1;

      this.navigateToNewParams();
    });
  }

  ngOnDestroy() {
    this.subActivatedRoute.unsubscribe();
    this.subSearch.unsubscribe();
  }

  getVideos() {
    this.loading.next(true);
    this.videos = [];

    this.changeDetector.detectChanges();

    let observable = null;

    if (this.search.value) {
      observable = this.videoService.searchVideos(this.search, this.pagination, this.sort);
    } else {
      observable = this.videoService.getVideos(this.pagination, this.sort);
    }

    observable.subscribe(
      ({ videos, totalVideos }) => {
        this.videos = videos;
        this.pagination.totalItems = totalVideos;

        this.loading.next(false);
      },
      error => alert(error)
    );
  }

  isThereNoVideo() {
    return !this.loading.getValue() && this.videos.length === 0;
  }

  onPageChanged(event: any) {
    // Be sure the current page is set
    this.pagination.currentPage = event.page;

    this.navigateToNewParams();
  }

  onRemoved(video: Video) {
    this.getVideos();
  }

  onSort(sort: SortField) {
    this.sort = sort;

    this.navigateToNewParams();
  }

  private buildRouteParams() {
    // There is always a sort and a current page
    const params: any = {
      sort: this.sort,
      page: this.pagination.currentPage
    };

    // Maybe there is a search
    if (this.search.value) {
      params.field = this.search.field;
      params.search = this.search.value;
    }

    return params;
  }

  private loadRouteParams(routeParams) {
    if (routeParams['search'] !== undefined) {
      this.search = {
        value: routeParams['search'],
        field: <SearchField>routeParams['field']
      };
    } else {
      this.search = {
        value: '',
        field: 'name'
      };
    }

    this.sort = <SortField>routeParams['sort'] || '-createdDate';

    if (routeParams['page'] !== undefined) {
      this.pagination.currentPage = parseInt(routeParams['page']);
    } else {
      this.pagination.currentPage = 1;
    }

    this.changeDetector.detectChanges();
  }

  private navigateToNewParams() {
    const routeParams = this.buildRouteParams();
    this.router.navigate(['/videos/list', routeParams]);
  }
}