]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Refactor next/prev logic
authorChocobozzz <me@florianbigard.com>
Mon, 26 Apr 2021 08:46:48 +0000 (10:46 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Mon, 26 Apr 2021 08:54:02 +0000 (10:54 +0200)
client/src/app/+videos/+video-watch/video-watch-playlist.component.ts

index cc908b924ecacfa4e5cd3a57ffa04fe19410d58f..a70167da519e8642b3eabb3ef7ae0a23f8800ef7 100644 (file)
@@ -137,26 +137,8 @@ export class VideoWatchPlaylistComponent {
     this.onPlaylistVideosNearOfBottom(position)
   }
 
-  findPreviousPlaylistVideo (position = this.currentPlaylistPosition): VideoPlaylistElement {
-    if (this.currentPlaylistPosition <= 1) {
-      // we have reached the top of the playlist: either loop or stop
-      if (this.loopPlaylist) {
-        this.currentPlaylistPosition = position = this.playlistPagination.totalItems
-      } else {
-        return
-      }
-    }
-    const previous = this.playlistElements.find(e => e.position === position)
-
-    if (!previous || !previous.video) {
-      return this.findPreviousPlaylistVideo(position - 1)
-    }
-
-    return previous
-  }
-
   navigateToPreviousPlaylistVideo () {
-    const previous = this.findPreviousPlaylistVideo(this.currentPlaylistPosition - 1)
+    const previous = this.findPlaylistVideo(this.currentPlaylistPosition - 1, 'previous')
     if (!previous) return
 
     const start = previous.startTimestamp
@@ -164,27 +146,32 @@ export class VideoWatchPlaylistComponent {
     this.router.navigate([],{ queryParams: { playlistPosition: previous.position, start, stop } })
   }
 
-  findNextPlaylistVideo (position = this.currentPlaylistPosition): VideoPlaylistElement {
-    if (this.currentPlaylistPosition >= this.playlistPagination.totalItems) {
-      // we have reached the end of the playlist: either loop or stop
-      if (this.loopPlaylist) {
-        this.currentPlaylistPosition = position = 0
-      } else {
-        return
-      }
+  findPlaylistVideo (position: number, type: 'previous' | 'next'): VideoPlaylistElement {
+    if (
+      (type === 'next' && position > this.playlistPagination.totalItems) ||
+      (type === 'previous' && position < 1)
+    ) {
+      // End of the playlist: end the recursion if we're not in the loop mode
+      if (!this.loopPlaylist) return
+
+      // Loop mode
+      position = type === 'previous'
+        ? this.playlistPagination.totalItems
+        : 1
     }
 
-    const next = this.playlistElements.find(e => e.position === position)
+    const found = this.playlistElements.find(e => e.position === position)
+    if (found && found.video) return found
 
-    if (!next || !next.video) {
-      return this.findNextPlaylistVideo(position + 1)
-    }
+    const newPosition = type === 'previous'
+      ? position - 1
+      : position + 1
 
-    return next
+    return this.findPlaylistVideo(newPosition, type)
   }
 
   navigateToNextPlaylistVideo () {
-    const next = this.findNextPlaylistVideo(this.currentPlaylistPosition + 1)
+    const next = this.findPlaylistVideo(this.currentPlaylistPosition + 1, 'next')
     if (!next) return
 
     const start = next.startTimestamp