1 import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
2 import { ActivatedRoute, Router } from '@angular/router';
3 import { BehaviorSubject } from 'rxjs/BehaviorSubject';
10 import { AuthService } from '../../core';
11 import { AuthUser, RestPagination, Search, SearchField } from '../../shared';
12 import { SearchService } from '../../shared';
15 selector: 'my-videos-list',
16 styleUrls: [ './video-list.component.scss' ],
17 templateUrl: './video-list.component.html'
20 export class VideoListComponent implements OnInit, OnDestroy {
21 loading: BehaviorSubject<boolean> = new BehaviorSubject(false);
22 pagination: RestPagination = {
28 user: AuthUser = null;
31 private search: Search;
32 private subActivatedRoute: any;
33 private subSearch: any;
36 private authService: AuthService,
37 private changeDetector: ChangeDetectorRef,
38 private router: Router,
39 private route: ActivatedRoute,
40 private videoService: VideoService,
41 private searchService: SearchService
45 if (this.authService.isLoggedIn()) {
46 this.user = AuthUser.load();
49 // Subscribe to route changes
50 this.subActivatedRoute = this.route.params.subscribe(routeParams => {
51 this.loadRouteParams(routeParams);
53 // Update the search service component
54 this.searchService.updateSearch.next(this.search);
58 // Subscribe to search changes
59 this.subSearch = this.searchService.searchUpdated.subscribe(search => {
62 this.pagination.currentPage = 1;
64 this.navigateToNewParams();
69 this.subActivatedRoute.unsubscribe();
70 this.subSearch.unsubscribe();
74 this.loading.next(true);
77 this.changeDetector.detectChanges();
79 let observable = null;
81 if (this.search.value) {
82 observable = this.videoService.searchVideos(this.search, this.pagination, this.sort);
84 observable = this.videoService.getVideos(this.pagination, this.sort);
88 ({ videos, totalVideos }) => {
90 this.pagination.totalItems = totalVideos;
92 this.loading.next(false);
94 error => alert(error.text)
99 return !this.loading.getValue() && this.videos.length === 0;
102 onPageChanged(event: any) {
103 // Be sure the current page is set
104 this.pagination.currentPage = event.page;
106 this.navigateToNewParams();
109 onRemoved(video: Video) {
113 onSort(sort: SortField) {
116 this.navigateToNewParams();
119 private buildRouteParams() {
120 // There is always a sort and a current page
121 const params: any = {
123 page: this.pagination.currentPage
126 // Maybe there is a search
127 if (this.search.value) {
128 params.field = this.search.field;
129 params.search = this.search.value;
135 private loadRouteParams(routeParams) {
136 if (routeParams['search'] !== undefined) {
138 value: routeParams['search'],
139 field: <SearchField>routeParams['field']
148 this.sort = <SortField>routeParams['sort'] || '-createdDate';
150 if (routeParams['page'] !== undefined) {
151 this.pagination.currentPage = parseInt(routeParams['page']);
153 this.pagination.currentPage = 1;
156 this.changeDetector.detectChanges();
159 private navigateToNewParams() {
160 const routeParams = this.buildRouteParams();
161 this.router.navigate(['/videos/list', routeParams]);