Add 'Most liked videos' page
authorJulien Maulny <julien.maulny@protonmail.com>
Tue, 1 Oct 2019 21:11:53 +0000 (23:11 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Fri, 18 Oct 2019 12:04:10 +0000 (14:04 +0200)
client/src/app/menu/menu.component.html
client/src/app/videos/video-list/index.ts
client/src/app/videos/video-list/video-most-liked.component.ts [new file with mode: 0644]
client/src/app/videos/videos-routing.module.ts
client/src/app/videos/videos.module.ts
shared/models/plugins/client-hook.model.ts

index 7eb6f7b35a00ec919d3374cd27d2606c217889dd..a29e145adf12cbf5634540f348d00836f0f131f7 100644 (file)
           <ng-container i18n>Trending</ng-container>
         </a>
 
+        <a routerLink="/videos/most-liked" routerLinkActive="active">
+          <my-global-icon iconName="like"></my-global-icon>
+          <ng-container i18n>Most liked</ng-container>
+        </a>
+
         <a routerLink="/videos/recently-added" routerLinkActive="active">
           <my-global-icon iconName="recently-added"></my-global-icon>
           <ng-container i18n>Recently added</ng-container>
index 5f7c8bd48e334da2b1e6b8c1fecb7a534bf7c36f..b367110ae5bad85764af7c72ca36fc850cca6ce8 100644 (file)
@@ -1,3 +1,4 @@
 export * from './video-local.component'
 export * from './video-recently-added.component'
 export * from './video-trending.component'
+export * from './video-most-liked.component'
diff --git a/client/src/app/videos/video-list/video-most-liked.component.ts b/client/src/app/videos/video-list/video-most-liked.component.ts
new file mode 100644 (file)
index 0000000..aff8413
--- /dev/null
@@ -0,0 +1,71 @@
+import { Component, OnInit } from '@angular/core'
+import { ActivatedRoute, Router } from '@angular/router'
+import { immutableAssign } from '@app/shared/misc/utils'
+import { AuthService } from '../../core/auth'
+import { AbstractVideoList } from '../../shared/video/abstract-video-list'
+import { VideoSortField } from '../../shared/video/sort-field.type'
+import { VideoService } from '../../shared/video/video.service'
+import { I18n } from '@ngx-translate/i18n-polyfill'
+import { ScreenService } from '@app/shared/misc/screen.service'
+import { Notifier, ServerService } from '@app/core'
+import { HooksService } from '@app/core/plugins/hooks.service'
+
+@Component({
+  selector: 'my-videos-most-liked',
+  styleUrls: [ '../../shared/video/abstract-video-list.scss' ],
+  templateUrl: '../../shared/video/abstract-video-list.html'
+})
+export class VideoMostLikedComponent extends AbstractVideoList implements OnInit {
+  titlePage: string
+  defaultSort: VideoSortField = '-likes'
+
+  useUserVideoLanguagePreferences = true
+
+  constructor (
+    protected i18n: I18n,
+    protected router: Router,
+    protected serverService: ServerService,
+    protected route: ActivatedRoute,
+    protected notifier: Notifier,
+    protected authService: AuthService,
+    protected screenService: ScreenService,
+    private videoService: VideoService,
+    private hooks: HooksService
+  ) {
+    super()
+  }
+
+  ngOnInit () {
+    super.ngOnInit()
+
+    this.generateSyndicationList()
+
+    this.serverService.configLoaded.subscribe(
+      () => {
+        this.titlePage = this.i18n('Most liked videos')
+        this.titleTooltip = this.i18n('Videos that have the higher number of likes.')
+      })
+  }
+
+  getVideosObservable (page: number) {
+    const newPagination = immutableAssign(this.pagination, { currentPage: page })
+    const params = {
+      videoPagination: newPagination,
+      sort: this.sort,
+      categoryOneOf: this.categoryOneOf,
+      languageOneOf: this.languageOneOf
+    }
+
+    return this.hooks.wrapObsFun(
+      this.videoService.getVideos.bind(this.videoService),
+      params,
+      'common',
+      'filter:api.most-liked-videos.videos.list.params',
+      'filter:api.most-liked-videos.videos.list.result'
+    )
+  }
+
+  generateSyndicationList () {
+    this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, undefined, this.categoryOneOf)
+  }
+}
index f0049d8c4e01e26ac4d2cde06611e75c4a0a9516..11a087d0af38567642cdb95d2d9c77fc0e215e48 100644 (file)
@@ -4,6 +4,7 @@ import { VideoLocalComponent } from '@app/videos/video-list/video-local.componen
 import { MetaGuard } from '@ngx-meta/core'
 import { VideoRecentlyAddedComponent } from './video-list/video-recently-added.component'
 import { VideoTrendingComponent } from './video-list/video-trending.component'
+import { VideoMostLikedComponent } from './video-list/video-most-liked.component'
 import { VideosComponent } from './videos.component'
 import { VideoUserSubscriptionsComponent } from '@app/videos/video-list/video-user-subscriptions.component'
 import { VideoOverviewComponent } from '@app/videos/video-list/video-overview.component'
@@ -36,6 +37,19 @@ const videosRoutes: Routes = [
           }
         }
       },
+      {
+        path: 'most-liked',
+        component: VideoMostLikedComponent,
+        data: {
+          meta: {
+            title: 'Most liked videos'
+          },
+          reuse: {
+            enabled: true,
+            key: 'most-liked-videos-list'
+          }
+        }
+      },
       {
         path: 'recently-added',
         component: VideoRecentlyAddedComponent,
index 5cf1e944f4b7ea79d3d198ecbc0b78d500341545..95078a7341b7e66722a65faaf1bb523d7b12f18f 100644 (file)
@@ -3,6 +3,7 @@ import { VideoLocalComponent } from '@app/videos/video-list/video-local.componen
 import { SharedModule } from '../shared'
 import { VideoRecentlyAddedComponent } from './video-list/video-recently-added.component'
 import { VideoTrendingComponent } from './video-list/video-trending.component'
+import { VideoMostLikedComponent } from './video-list/video-most-liked.component'
 import { VideosRoutingModule } from './videos-routing.module'
 import { VideosComponent } from './videos.component'
 import { VideoUserSubscriptionsComponent } from '@app/videos/video-list/video-user-subscriptions.component'
@@ -18,6 +19,7 @@ import { VideoOverviewComponent } from '@app/videos/video-list/video-overview.co
     VideosComponent,
 
     VideoTrendingComponent,
+    VideoMostLikedComponent,
     VideoRecentlyAddedComponent,
     VideoLocalComponent,
     VideoUserSubscriptionsComponent,
index cfa2653c6ea5fd63c294b7bd254b47a50b6f4cdc..fd560302cf468991467a4c38d78e4471695c9576 100644 (file)
@@ -5,6 +5,10 @@ export const clientFilterHookObject = {
   'filter:api.trending-videos.videos.list.params': true,
   'filter:api.trending-videos.videos.list.result': true,
 
+  // Filter params/result of the function that fetch videos of the trending page
+  'filter:api.most-liked-videos.videos.list.params': true,
+  'filter:api.most-liked-videos.videos.list.result': true,
+
   // Filter params/result of the function that fetch videos of the local page
   'filter:api.local-videos.videos.list.params': true,
   'filter:api.local-videos.videos.list.result': true,