]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/videos/+video-watch/comment/video-comments.component.ts
Fix changing video in watch page
[github/Chocobozzz/PeerTube.git] / client / src / app / videos / +video-watch / comment / video-comments.component.ts
index 32e0f2fbd80cbdda28656983b16b23e799eb9fc0..6025256deccfbc8505858f3c812855a0d13a8363 100644 (file)
@@ -1,11 +1,12 @@
-import { Component, Input, OnInit } from '@angular/core'
+import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'
+import { ConfirmService } from '@app/core'
 import { NotificationsService } from 'angular2-notifications'
-import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model'
+import { VideoComment as VideoCommentInterface, VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model'
 import { AuthService } from '../../../core/auth'
 import { ComponentPagination } from '../../../shared/rest/component-pagination.model'
 import { User } from '../../../shared/users'
 import { SortField } from '../../../shared/video/sort-field.type'
-import { Video } from '../../../shared/video/video.model'
+import { VideoDetails } from '../../../shared/video/video-details.model'
 import { VideoComment } from './video-comment.model'
 import { VideoCommentService } from './video-comment.service'
 
@@ -14,15 +15,15 @@ import { VideoCommentService } from './video-comment.service'
   templateUrl: './video-comments.component.html',
   styleUrls: ['./video-comments.component.scss']
 })
-export class VideoCommentsComponent implements OnInit {
-  @Input() video: Video
+export class VideoCommentsComponent implements OnChanges {
+  @Input() video: VideoDetails
   @Input() user: User
 
   comments: VideoComment[] = []
   sort: SortField = '-createdAt'
   componentPagination: ComponentPagination = {
     currentPage: 1,
-    itemsPerPage: 25,
+    itemsPerPage: 10,
     totalItems: null
   }
   inReplyToCommentId: number
@@ -32,29 +33,36 @@ export class VideoCommentsComponent implements OnInit {
   constructor (
     private authService: AuthService,
     private notificationsService: NotificationsService,
+    private confirmService: ConfirmService,
     private videoCommentService: VideoCommentService
   ) {}
 
-  ngOnInit () {
-    this.videoCommentService.getVideoCommentThreads(this.video.id, this.componentPagination, this.sort)
+  ngOnChanges (changes: SimpleChanges) {
+    if (changes['video']) {
+      this.loadVideoComments()
+    }
+  }
+
+  viewReplies (comment: VideoCommentInterface) {
+    this.threadLoading[comment.id] = true
+
+    this.videoCommentService.getVideoThreadComments(this.video.id, comment.id)
       .subscribe(
         res => {
-          this.comments = res.comments
-          this.componentPagination.totalItems = res.totalComments
+          this.threadComments[comment.id] = res
+          this.threadLoading[comment.id] = false
         },
 
         err => this.notificationsService.error('Error', err.message)
       )
   }
 
-  viewReplies (comment: VideoComment) {
-    this.threadLoading[comment.id] = true
-
-    this.videoCommentService.getVideoThreadComments(this.video.id, comment.id)
+  loadMoreComments () {
+    this.videoCommentService.getVideoCommentThreads(this.video.id, this.componentPagination, this.sort)
       .subscribe(
         res => {
-          this.threadComments[comment.id] = res
-          this.threadLoading[comment.id] = false
+          this.comments = this.comments.concat(res.comments)
+          this.componentPagination.totalItems = res.totalComments
         },
 
         err => this.notificationsService.error('Error', err.message)
@@ -73,7 +81,92 @@ export class VideoCommentsComponent implements OnInit {
     this.inReplyToCommentId = undefined
   }
 
+  onThreadCreated (commentTree: VideoCommentThreadTree) {
+    this.viewReplies(commentTree.comment)
+  }
+
+  onWantedToDelete (commentToDelete: VideoComment) {
+    let message = 'Do you really want to delete this comment?'
+    if (commentToDelete.totalReplies !== 0) message += `${commentToDelete.totalReplies} would be deleted too.`
+
+    this.confirmService.confirm(message, 'Delete').subscribe(
+      res => {
+        if (res === false) return
+
+        this.videoCommentService.deleteVideoComment(commentToDelete.videoId, commentToDelete.id)
+          .subscribe(
+            () => {
+              // Delete the comment in the tree
+              if (commentToDelete.inReplyToCommentId) {
+                const thread = this.threadComments[commentToDelete.threadId]
+                if (!thread) {
+                  console.error(`Cannot find thread ${commentToDelete.threadId} of the comment to delete ${commentToDelete.id}`)
+                  return
+                }
+
+                this.deleteLocalCommentThread(thread, commentToDelete)
+                return
+              }
+
+              // Delete the thread
+              this.comments = this.comments.filter(c => c.id !== commentToDelete.id)
+              this.componentPagination.totalItems--
+            },
+
+            err => this.notificationsService.error('Error', err.message)
+          )
+      }
+    )
+  }
+
   isUserLoggedIn () {
     return this.authService.isLoggedIn()
   }
+
+  onNearOfBottom () {
+    this.componentPagination.currentPage++
+
+    if (this.hasMoreComments()) {
+      this.loadMoreComments()
+    }
+  }
+
+  private hasMoreComments () {
+    // No results
+    if (this.componentPagination.totalItems === 0) return false
+
+    // Not loaded yet
+    if (!this.componentPagination.totalItems) return true
+
+    const maxPage = this.componentPagination.totalItems / this.componentPagination.itemsPerPage
+    return maxPage > this.componentPagination.currentPage
+  }
+
+  private deleteLocalCommentThread (parentComment: VideoCommentThreadTree, commentToDelete: VideoComment) {
+    for (const commentChild of parentComment.children) {
+      if (commentChild.comment.id === commentToDelete.id) {
+        parentComment.children = parentComment.children.filter(c => c.comment.id !== commentToDelete.id)
+        return
+      }
+
+      this.deleteLocalCommentThread(commentChild, commentToDelete)
+    }
+  }
+
+  private loadVideoComments () {
+    if (this.video.commentsEnabled === true) {
+      // Reset all our fields
+      this.comments = []
+      this.threadComments = {}
+      this.threadLoading = {}
+      this.inReplyToCommentId = undefined
+      this.componentPagination = {
+        currentPage: 1,
+        itemsPerPage: 10,
+        totalItems: null
+      }
+
+      this.loadMoreComments()
+    }
+  }
 }