]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/shared/shared-custom-markup/peertube-custom-tags/channel-miniature-markup.component.ts
Merge branch 'release/4.1.0' into develop
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / shared-custom-markup / peertube-custom-tags / channel-miniature-markup.component.ts
index 25deafb80ff120eac19fbfe8798599c445edf43f..e9c466a904bd641e4682aeff5fe47efe4d865683 100644 (file)
@@ -1,5 +1,11 @@
-import { Component, Input, OnInit } from '@angular/core'
-import { VideoChannel, VideoChannelService } from '../../shared-main'
+import { from } from 'rxjs'
+import { finalize, map, switchMap, tap } from 'rxjs/operators'
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'
+import { MarkdownService, Notifier, UserService } from '@app/core'
+import { FindInBulkService } from '@app/shared/shared-search'
+import { VideoSortField } from '@shared/models'
+import { Video, VideoChannel, VideoService } from '../../shared-main'
+import { CustomMarkupComponent } from './shared'
 
 /*
  * Markup component that creates a channel miniature only
@@ -10,17 +16,67 @@ import { VideoChannel, VideoChannelService } from '../../shared-main'
   templateUrl: 'channel-miniature-markup.component.html',
   styleUrls: [ 'channel-miniature-markup.component.scss' ]
 })
-export class ChannelMiniatureMarkupComponent implements OnInit {
+export class ChannelMiniatureMarkupComponent implements CustomMarkupComponent, OnInit {
   @Input() name: string
+  @Input() displayLatestVideo: boolean
+  @Input() displayDescription: boolean
+
+  @Output() loaded = new EventEmitter<boolean>()
 
   channel: VideoChannel
+  descriptionHTML: string
+  totalVideos: number
+  video: Video
 
   constructor (
-    private channelService: VideoChannelService
+    private markdown: MarkdownService,
+    private findInBulk: FindInBulkService,
+    private videoService: VideoService,
+    private userService: UserService,
+    private notifier: Notifier
   ) { }
 
   ngOnInit () {
-    this.channelService.getVideoChannel(this.name)
-      .subscribe(channel => this.channel = channel)
+    this.findInBulk.getChannel(this.name)
+      .pipe(
+        tap(channel => {
+          this.channel = channel
+        }),
+        switchMap(() => from(this.markdown.textMarkdownToHTML(this.channel.description))),
+        tap(html => {
+          this.descriptionHTML = html
+        }),
+        switchMap(() => this.loadVideosObservable()),
+        finalize(() => this.loaded.emit(true))
+      ).subscribe({
+        next: ({ total, data }) => {
+          this.totalVideos = total
+          this.video = data[0]
+        },
+
+        error: err => this.notifier.error($localize`Error in channel miniature component: ${err.message}`)
+      })
+  }
+
+  getVideoChannelLink () {
+    return [ '/c', this.channel.nameWithHost ]
+  }
+
+  private loadVideosObservable () {
+    const videoOptions = {
+      videoChannel: this.channel,
+      videoPagination: {
+        currentPage: 1,
+        itemsPerPage: 1
+      },
+      sort: '-publishedAt' as VideoSortField,
+      count: 1
+    }
+
+    return this.userService.getAnonymousOrLoggedUser()
+      .pipe(
+        map(user => user.nsfwPolicy),
+        switchMap(nsfwPolicy => this.videoService.getVideoChannelVideos({ ...videoOptions, nsfwPolicy }))
+      )
   }
 }