+import { Subscription } from 'rxjs'
+import { first, switchMap } from 'rxjs/operators'
import { Component, ComponentFactoryResolver, Injector, OnDestroy, OnInit } from '@angular/core'
-import { ActivatedRoute, Router } from '@angular/router'
+import { ActivatedRoute, Params, Router } from '@angular/router'
import { AuthService, LocalStorageService, Notifier, RedirectService, ScreenService, ServerService, UserService } from '@app/core'
import { HooksService } from '@app/core/plugins/hooks.service'
import { immutableAssign } from '@app/helpers'
import { VideoService } from '@app/shared/shared-main'
import { AbstractVideoList } from '@app/shared/shared-video-miniature'
import { VideoSortField } from '@shared/models'
-import { Subscription } from 'rxjs'
import { VideoTrendingHeaderComponent } from './video-trending-header.component'
@Component({
titlePage: string
defaultSort: VideoSortField = '-trending'
- useUserVideoPreferences = true
+ loadUserVideoPreferences = true
private algorithmChangeSub: Subscription
protected storageService: LocalStorageService,
protected cfr: ComponentFactoryResolver,
private videoService: VideoService,
+ private redirectService: RedirectService,
private hooks: HooksService
) {
super()
- this.defaultSort = this.parseAlgorithm(RedirectService.DEFAULT_TRENDING_ALGORITHM)
+ this.defaultSort = this.parseAlgorithm(this.redirectService.getDefaultTrendingAlgorithm())
this.headerComponentInjector = this.getInjector()
}
this.generateSyndicationList()
- this.algorithmChangeSub = this.route.queryParams.subscribe(
- queryParams => {
- const algorithm = queryParams['alg'] || RedirectService.DEFAULT_TRENDING_ALGORITHM
+ // Subscribe to alg change after we loaded the data
+ // The initial alg load is handled by the parent class
+ this.algorithmChangeSub = this.onDataSubject
+ .pipe(
+ first(),
+ switchMap(() => this.route.queryParams)
+ ).subscribe(queryParams => {
+ const oldSort = this.sort
+
+ this.loadPageRouteParams(queryParams)
- this.sort = this.parseAlgorithm(algorithm)
- this.reloadVideos()
+ if (oldSort !== this.sort) this.reloadVideos()
}
- )
+ )
}
ngOnDestroy () {
getInjector () {
return Injector.create({
- providers: [{
+ providers: [ {
provide: 'data',
useValue: {
model: this.defaultSort
}
- }]
+ } ]
})
}
+ protected loadPageRouteParams (queryParams: Params) {
+ const algorithm = queryParams['alg'] || this.redirectService.getDefaultTrendingAlgorithm()
+
+ this.sort = this.parseAlgorithm(algorithm)
+ }
+
private parseAlgorithm (algorithm: string): VideoSortField {
switch (algorithm) {
case 'most-viewed':
return '-trending'
+
case 'most-liked':
return '-likes'
+
default:
return '-' + algorithm as VideoSortField
}