X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fsearch%2Fsearch.component.ts;h=c4a4b1fdebf7a472916c81bc22f1c86e10e8cd27;hb=033bc0efc2ab2c517b4d7d53d09930b85f092b50;hp=ed84e24d9fbb8cf3d512d636552066b0304b7eee;hpb=aa55a4da422330fe2816f1764b64f6607a0ca4aa;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/search/search.component.ts b/client/src/app/search/search.component.ts index ed84e24d9..c4a4b1fde 100644 --- a/client/src/app/search/search.component.ts +++ b/client/src/app/search/search.component.ts @@ -1,16 +1,15 @@ import { Component, OnDestroy, OnInit } from '@angular/core' import { ActivatedRoute, Router } from '@angular/router' -import { RedirectService } from '@app/core' -import { NotificationsService } from 'angular2-notifications' +import { AuthService, Notifier, ServerService } from '@app/core' import { forkJoin, Subscription } from 'rxjs' import { SearchService } from '@app/search/search.service' import { ComponentPagination } from '@app/shared/rest/component-pagination.model' import { I18n } from '@ngx-translate/i18n-polyfill' -import { Video } from '../../../../shared' import { MetaService } from '@ngx-meta/core' import { AdvancedSearch } from '@app/search/advanced-search.model' import { VideoChannel } from '@app/shared/video-channel/video-channel.model' import { immutableAssign } from '@app/shared/misc/utils' +import { Video } from '@app/shared/video/video.model' @Component({ selector: 'my-search', @@ -18,8 +17,7 @@ import { immutableAssign } from '@app/shared/misc/utils' templateUrl: './search.component.html' }) export class SearchComponent implements OnInit, OnDestroy { - videos: Video[] = [] - videoChannels: VideoChannel[] = [] + results: (Video | VideoChannel)[] = [] pagination: ComponentPagination = { currentPage: 1, @@ -31,7 +29,8 @@ export class SearchComponent implements OnInit, OnDestroy { currentSearch: string private subActivatedRoute: Subscription - private isInitialLoad = true + private isInitialLoad = false // set to false to show the search filters on first arrival + private firstSearch = true private channelsPerPage = 2 @@ -40,9 +39,10 @@ export class SearchComponent implements OnInit, OnDestroy { private route: ActivatedRoute, private router: Router, private metaService: MetaService, - private redirectService: RedirectService, - private notificationsService: NotificationsService, - private searchService: SearchService + private notifier: Notifier, + private searchService: SearchService, + private authService: AuthService, + private serverService: ServerService ) { } ngOnInit () { @@ -50,15 +50,12 @@ export class SearchComponent implements OnInit, OnDestroy { queryParams => { const querySearch = queryParams['search'] - // New empty search - if (this.currentSearch && !querySearch) return this.redirectService.redirectToHomepage() - // Search updated, reset filters if (this.currentSearch !== querySearch) { this.resetPagination() this.advancedSearch.reset() - this.currentSearch = querySearch + this.currentSearch = querySearch || undefined this.updateTitle() } @@ -71,7 +68,7 @@ export class SearchComponent implements OnInit, OnDestroy { this.search() }, - err => this.notificationsService.error('Error', err.text) + err => this.notifier.error(err.text) ) } @@ -79,6 +76,22 @@ export class SearchComponent implements OnInit, OnDestroy { if (this.subActivatedRoute) this.subActivatedRoute.unsubscribe() } + isVideoBlur (video: Video) { + return video.isVideoNSFWForUser(this.authService.getUser(), this.serverService.getConfig()) + } + + isVideoChannel (d: VideoChannel | Video): d is VideoChannel { + return d instanceof VideoChannel + } + + isVideo (v: VideoChannel | Video): v is Video { + return v instanceof Video + } + + isUserLoggedIn () { + return this.authService.isLoggedIn() + } + search () { forkJoin([ this.searchService.searchVideos(this.currentSearch, this.pagination, this.advancedSearch), @@ -86,23 +99,24 @@ export class SearchComponent implements OnInit, OnDestroy { ]) .subscribe( ([ videosResult, videoChannelsResult ]) => { - this.videos = this.videos.concat(videosResult.videos) + this.results = this.results + .concat(videoChannelsResult.data) + .concat(videosResult.videos) this.pagination.totalItems = videosResult.totalVideos + videoChannelsResult.total - this.videoChannels = this.videoChannels.concat(videoChannelsResult.data) - - // Focus on channels - if (this.channelsPerPage !== 10 && this.videos.length < this.pagination.itemsPerPage) { + // Focus on channels if there are no enough videos + if (this.firstSearch === true && videosResult.videos.length < this.pagination.itemsPerPage) { this.resetPagination() + this.firstSearch = false this.channelsPerPage = 10 this.search() } + + this.firstSearch = false }, - error => { - this.notificationsService.error(this.i18n('Error'), error.message) - } + err => this.notifier.error(err.message) ) } @@ -121,23 +135,29 @@ export class SearchComponent implements OnInit, OnDestroy { this.updateUrlFromAdvancedSearch() } + numberOfFilters () { + return this.advancedSearch.size() + } + private resetPagination () { this.pagination.currentPage = 1 this.pagination.totalItems = null this.channelsPerPage = 2 - this.videos = [] - this.videoChannels = [] + this.results = [] } private updateTitle () { - this.metaService.setTitle(this.i18n('Search') + ' ' + this.currentSearch) + const suffix = this.currentSearch ? ' ' + this.currentSearch : '' + this.metaService.setTitle(this.i18n('Search') + suffix) } private updateUrlFromAdvancedSearch () { + const search = this.currentSearch || undefined + this.router.navigate([], { relativeTo: this.route, - queryParams: Object.assign({}, this.advancedSearch.toUrlObject(), { search: this.currentSearch }) + queryParams: Object.assign({}, this.advancedSearch.toUrlObject(), { search }) }) } }