]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
autoplay next video switch for both user and visitors
authorRigel Kent <sendmemail@rigelk.eu>
Tue, 10 Dec 2019 22:15:09 +0000 (23:15 +0100)
committerChocobozzz <chocobozzz@cpy.re>
Fri, 13 Dec 2019 08:13:43 +0000 (09:13 +0100)
client/src/app/header/header.component.html
client/src/app/videos/+video-watch/video-watch.component.ts
client/src/app/videos/recommendations/recommendations.module.ts
client/src/app/videos/recommendations/recommended-videos.component.html
client/src/app/videos/recommendations/recommended-videos.component.scss [new file with mode: 0644]
client/src/app/videos/recommendations/recommended-videos.component.ts

index 46a87c79c09e30a3fcbf94baacd971dcd4000170..8ee41c4de3fe5df221b5c18fb1546745adb8bd0d 100644 (file)
@@ -1,5 +1,5 @@
 <input
-  type="text" id="search-video" name="search-video" i18n-placeholder placeholder="Search..."
+  type="text" id="search-video" name="search-video" i18n-placeholder placeholder="Search videos, channels…"
   [(ngModel)]="searchValue" (keyup.enter)="doSearch()"
 >
 <span (click)="doSearch()" class="icon icon-search"></span>
index 0de621acabed48b90195b8c21dd8fe00e9162d6d..156a3235a83174c3d4484e94bf847aa3e7992acc 100644 (file)
@@ -45,6 +45,7 @@ import { randomInt } from '@shared/core-utils/miscs/miscs'
 })
 export class VideoWatchComponent implements OnInit, OnDestroy {
   private static LOCAL_STORAGE_PRIVACY_CONCERN_KEY = 'video-watch-privacy-concern'
+  private static LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO = 'auto_play_next_video'
 
   @ViewChild('videoWatchPlaylist', { static: true }) videoWatchPlaylist: VideoWatchPlaylistComponent
   @ViewChild('videoShareModal', { static: false }) videoShareModal: VideoShareComponent
@@ -436,7 +437,10 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
       this.player.one('ended', () => {
         if (this.playlist) {
           this.zone.run(() => this.videoWatchPlaylist.navigateToNextPlaylistVideo())
-        } else if (this.user && this.user.autoPlayNextVideo) {
+        } else if (
+          this.user && this.user.autoPlayNextVideo ||
+          peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO) === 'true'
+        ) {
           this.zone.run(() => this.autoplayNext())
         }
       })
index 5a46ea73988717c72166bf26fb70ad76ff75333b..3e279cc296b18c24862c0b2e39a18fa8fbcab350 100644 (file)
@@ -1,4 +1,5 @@
 import { NgModule } from '@angular/core'
+import { InputSwitchModule } from 'primeng/inputswitch'
 import { RecommendedVideosComponent } from '@app/videos/recommendations/recommended-videos.component'
 import { RecommendedVideosStore } from '@app/videos/recommendations/recommended-videos.store'
 import { CommonModule } from '@angular/common'
@@ -7,6 +8,7 @@ import { RecentVideosRecommendationService } from '@app/videos/recommendations/r
 
 @NgModule({
   imports: [
+    InputSwitchModule,
     SharedModule,
     CommonModule
   ],
index 5b5951f99a322f59bc5bd6a1d3c8179435feec0d..5f223078acd646f5cb2384cb65f8ca473df81b2c 100644 (file)
@@ -1,7 +1,13 @@
 <div class="other-videos">
   <ng-container *ngIf="hasVideos$ | async">
-    <div i18n class="title-page title-page-single">
-      Other videos
+    <div class="d-flex title-page-container">
+      <div i18n class="title-page title-page-single">
+        Other videos
+      </div>
+      <div class="d-flex title-page-autoplay">
+        <span>Autoplay</span>
+        <p-inputSwitch [(ngModel)]="autoPlayNextVideo" (ngModelChange)="switchAutoPlayNextVideo()"></p-inputSwitch>
+      </div>
     </div>
 
     <div *ngFor="let video of (videos$ | async)">
diff --git a/client/src/app/videos/recommendations/recommended-videos.component.scss b/client/src/app/videos/recommendations/recommended-videos.component.scss
new file mode 100644 (file)
index 0000000..c337979
--- /dev/null
@@ -0,0 +1,44 @@
+.title-page-container {
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 25px;
+
+  .title-page.active, .title-page.title-page-single {
+    margin-bottom: unset;
+  }
+}
+
+.title-page-autoplay {
+  width: max-content;
+  height: max-content;
+  align-items: center;
+
+  span {
+    margin-right: 0.3rem;
+    text-transform: uppercase;
+    font-size: 85%;
+    font-weight: 600;
+  }
+}
+
+/* p-inputSwitch styles to reduce the switch size */
+
+::ng-deep {
+  p-inputswitch {
+    height: 20px;
+  }
+
+  .ui-inputswitch {
+    width: 2.5em !important;
+    height: 1.45em !important;
+
+    .ui-inputswitch-slider::before {
+      height: 1em !important;
+      width: 1em !important;
+    }
+  }
+
+  .ui-inputswitch-checked .ui-inputswitch-slider::before {
+    transform: translateX(1em) !important;
+  }
+}
index 7e0fb88567ad442b14d44d42726ac5cf8943c221..4c3cde22524bc24dc2fd48b77a4dc0e9fcec0fbb 100644 (file)
@@ -4,12 +4,18 @@ import { Video } from '@app/shared/video/video.model'
 import { RecommendationInfo } from '@app/shared/video/recommendation-info.model'
 import { RecommendedVideosStore } from '@app/videos/recommendations/recommended-videos.store'
 import { User } from '@app/shared'
+import { AuthService, Notifier } from '@app/core'
+import { UserService } from '@app/shared/users/user.service'
+import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
 
 @Component({
   selector: 'my-recommended-videos',
-  templateUrl: './recommended-videos.component.html'
+  templateUrl: './recommended-videos.component.html',
+  styleUrls: [ './recommended-videos.component.scss' ]
 })
 export class RecommendedVideosComponent implements OnChanges {
+  private static LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO = 'auto_play_next_video'
+
   @Input() inputRecommendation: RecommendationInfo
   @Input() user: User
   @Output() gotRecommendations = new EventEmitter<Video[]>()
@@ -17,12 +23,21 @@ export class RecommendedVideosComponent implements OnChanges {
   readonly hasVideos$: Observable<boolean>
   readonly videos$: Observable<Video[]>
 
+  private autoPlayNextVideo: boolean
+
   constructor (
+    private userService: UserService,
+    private authService: AuthService,
+    private notifier: Notifier,
     private store: RecommendedVideosStore
   ) {
     this.videos$ = this.store.recommendations$
     this.hasVideos$ = this.store.hasRecommendations$
     this.videos$.subscribe(videos => this.gotRecommendations.emit(videos))
+
+    this.autoPlayNextVideo = this.authService.isLoggedIn()
+      ? this.authService.getUser().autoPlayNextVideo
+      : peertubeLocalStorage.getItem(RecommendedVideosComponent.LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO) === 'true' || false
   }
 
   public ngOnChanges (): void {
@@ -34,4 +49,21 @@ export class RecommendedVideosComponent implements OnChanges {
   onVideoRemoved () {
     this.store.requestNewRecommendations(this.inputRecommendation)
   }
+
+  switchAutoPlayNextVideo () {
+    peertubeLocalStorage.setItem(RecommendedVideosComponent.LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO, this.autoPlayNextVideo.toString())
+
+    if (this.authService.isLoggedIn()) {
+      const details = {
+        autoPlayNextVideo: this.autoPlayNextVideo
+      }
+
+      this.userService.updateMyProfile(details).subscribe(
+        () => {
+          this.authService.refreshUserInformation()
+        },
+        err => this.notifier.error(err.message)
+      )
+    }
+  }
 }