1 import { Component, OnDestroy, OnInit } from '@angular/core'
2 import { ActivatedRoute, Router } from '@angular/router'
3 import { Subscription } from 'rxjs/Subscription'
4 import { BehaviorSubject } from 'rxjs/BehaviorSubject'
6 import { NotificationsService } from 'angular2-notifications'
14 import { Search, SearchField, SearchService } from '../../shared'
17 selector: 'my-videos-list',
18 styleUrls: [ './video-list.component.scss' ],
19 templateUrl: './video-list.component.html'
21 export class VideoListComponent implements OnInit, OnDestroy {
22 loading: BehaviorSubject<boolean> = new BehaviorSubject(false)
23 pagination: VideoPagination = {
31 private search: Search
32 private subActivatedRoute: Subscription
33 private subSearch: Subscription
36 private notificationsService: NotificationsService,
37 private router: Router,
38 private route: ActivatedRoute,
39 private videoService: VideoService,
40 private searchService: SearchService
44 // Subscribe to route changes
45 this.subActivatedRoute = this.route.params.subscribe(routeParams => {
46 this.loadRouteParams(routeParams)
48 // Update the search service component
49 this.searchService.updateSearch.next(this.search)
53 // Subscribe to search changes
54 this.subSearch = this.searchService.searchUpdated.subscribe(search => {
57 this.pagination.currentPage = 1
59 this.navigateToNewParams()
64 this.subActivatedRoute.unsubscribe()
65 this.subSearch.unsubscribe()
69 this.loading.next(true)
73 if (this.search.value) {
74 observable = this.videoService.searchVideos(this.search, this.pagination, this.sort)
76 observable = this.videoService.getVideos(this.pagination, this.sort)
80 ({ videos, totalVideos }) => {
82 this.pagination.totalItems = totalVideos
84 this.loading.next(false)
86 error => this.notificationsService.error('Error', error.text)
91 return !this.loading.getValue() && this.videos.length === 0
94 onPageChanged (event: { page: number }) {
95 // Be sure the current page is set
96 this.pagination.currentPage = event.page
98 this.navigateToNewParams()
101 onSort (sort: SortField) {
104 this.navigateToNewParams()
107 private buildRouteParams () {
108 // There is always a sort and a current page
111 page: this.pagination.currentPage
114 // Maybe there is a search
115 if (this.search.value) {
116 params['field'] = this.search.field
117 params['search'] = this.search.value
123 private loadRouteParams (routeParams: { [ key: string ]: any }) {
124 if (routeParams['search'] !== undefined) {
126 value: routeParams['search'],
127 field: routeParams['field'] as SearchField
136 this.sort = routeParams['sort'] as SortField || '-createdAt'
138 if (routeParams['page'] !== undefined) {
139 this.pagination.currentPage = parseInt(routeParams['page'], 10)
141 this.pagination.currentPage = 1
145 private navigateToNewParams () {
146 const routeParams = this.buildRouteParams()
147 this.router.navigate([ '/videos/list', routeParams ])