Fix loading things twice on trending page

pull/3770/head
Chocobozzz 2021-02-22 09:46:28 +01:00
parent 94d721efdc
commit 15bedeebd7
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
3 changed files with 35 additions and 12 deletions

View File

@ -1,12 +1,13 @@
import { Subscription } from 'rxjs'
import { first, switchMap } from 'rxjs/operators'
import { Component, ComponentFactoryResolver, Injector, OnDestroy, OnInit } from '@angular/core' 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 { AuthService, LocalStorageService, Notifier, RedirectService, ScreenService, ServerService, UserService } from '@app/core'
import { HooksService } from '@app/core/plugins/hooks.service' import { HooksService } from '@app/core/plugins/hooks.service'
import { immutableAssign } from '@app/helpers' import { immutableAssign } from '@app/helpers'
import { VideoService } from '@app/shared/shared-main' import { VideoService } from '@app/shared/shared-main'
import { AbstractVideoList } from '@app/shared/shared-video-miniature' import { AbstractVideoList } from '@app/shared/shared-video-miniature'
import { VideoSortField } from '@shared/models' import { VideoSortField } from '@shared/models'
import { Subscription } from 'rxjs'
import { VideoTrendingHeaderComponent } from './video-trending-header.component' import { VideoTrendingHeaderComponent } from './video-trending-header.component'
@Component({ @Component({
@ -48,12 +49,18 @@ export class VideoTrendingComponent extends AbstractVideoList implements OnInit,
this.generateSyndicationList() this.generateSyndicationList()
this.algorithmChangeSub = this.route.queryParams.subscribe( // Subscribe to alg change after we loaded the data
queryParams => { // The initial alg load is handled by the parent class
const algorithm = queryParams['alg'] || RedirectService.DEFAULT_TRENDING_ALGORITHM this.algorithmChangeSub = this.onDataSubject
.pipe(
first(),
switchMap(() => this.route.queryParams)
).subscribe(queryParams => {
const oldSort = this.sort
this.sort = this.parseAlgorithm(algorithm) this.loadPageRouteParams(queryParams)
this.reloadVideos()
if (oldSort !== this.sort) this.reloadVideos()
} }
) )
} }
@ -98,6 +105,12 @@ export class VideoTrendingComponent extends AbstractVideoList implements OnInit,
}) })
} }
protected loadPageRouteParams (queryParams: Params) {
const algorithm = queryParams['alg'] || RedirectService.DEFAULT_TRENDING_ALGORITHM
this.sort = this.parseAlgorithm(algorithm)
}
private parseAlgorithm (algorithm: string): VideoSortField { private parseAlgorithm (algorithm: string): VideoSortField {
switch (algorithm) { switch (algorithm) {
case 'most-viewed': case 'most-viewed':

View File

@ -11,7 +11,7 @@ import {
ViewChild, ViewChild,
ViewContainerRef ViewContainerRef
} from '@angular/core' } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router' import { ActivatedRoute, Params, Router } from '@angular/router'
import { import {
AuthService, AuthService,
ComponentPaginationLight, ComponentPaginationLight,
@ -199,6 +199,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, AfterConte
// No more results // No more results
if (this.lastQueryLength !== undefined && this.lastQueryLength < this.pagination.itemsPerPage) return if (this.lastQueryLength !== undefined && this.lastQueryLength < this.pagination.itemsPerPage) return
console.log('near of bottom')
this.pagination.currentPage += 1 this.pagination.currentPage += 1
this.setScrollRouteParams() this.setScrollRouteParams()
@ -322,10 +323,17 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, AfterConte
// On videos hook for children that want to do something // On videos hook for children that want to do something
protected onMoreVideos () { /* empty */ } protected onMoreVideos () { /* empty */ }
protected loadRouteParams (routeParams: { [ key: string ]: any }) { protected load () { /* empty */ }
this.sort = routeParams[ 'sort' ] as VideoSortField || this.defaultSort
this.categoryOneOf = routeParams[ 'categoryOneOf' ] // Hook if the page has custom route params
this.angularState = routeParams[ 'a-state' ] protected loadPageRouteParams (_queryParams: Params) { /* empty */ }
protected loadRouteParams (queryParams: Params) {
this.sort = queryParams[ 'sort' ] as VideoSortField || this.defaultSort
this.categoryOneOf = queryParams[ 'categoryOneOf' ]
this.angularState = queryParams[ 'a-state' ]
this.loadPageRouteParams(queryParams)
} }
protected buildLocalFilter (existing: VideoFilter, base: VideoFilter) { protected buildLocalFilter (existing: VideoFilter, base: VideoFilter) {

View File

@ -121,6 +121,8 @@ describe('Test moderation notifications', function () {
const resComment = await addVideoCommentThread(servers[0].url, userAccessToken, video.id, 'comment abuse ' + uuidv4()) const resComment = await addVideoCommentThread(servers[0].url, userAccessToken, video.id, 'comment abuse ' + uuidv4())
const comment = resComment.body.comment const comment = resComment.body.comment
await waitJobs(servers)
await reportAbuse({ url: servers[0].url, token: servers[0].accessToken, commentId: comment.id, reason: 'super reason' }) await reportAbuse({ url: servers[0].url, token: servers[0].accessToken, commentId: comment.id, reason: 'super reason' })
await waitJobs(servers) await waitJobs(servers)