]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Use a resolver when updating the video
authorChocobozzz <me@florianbigard.com>
Mon, 16 Jul 2018 16:09:31 +0000 (18:09 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 16 Jul 2018 16:09:31 +0000 (18:09 +0200)
client/src/app/+my-account/my-account-videos/my-account-videos.component.ts
client/src/app/videos/+video-edit/video-update-routing.module.ts
client/src/app/videos/+video-edit/video-update.component.ts
client/src/app/videos/+video-edit/video-update.module.ts
client/src/app/videos/+video-edit/video-update.resolver.ts [new file with mode: 0644]

index e698b75ec1e256e96181a886c52c02b9edd45e24..54830c75e76ee7252bede67d6c2bff1612e9910d 100644 (file)
@@ -38,10 +38,10 @@ export class MyAccountVideosComponent extends AbstractVideoList implements OnIni
     protected route: ActivatedRoute,
     protected authService: AuthService,
     protected notificationsService: NotificationsService,
-    protected confirmService: ConfirmService,
     protected location: Location,
     protected screenService: ScreenService,
     protected i18n: I18n,
+    private confirmService: ConfirmService,
     private videoService: VideoService,
     @Inject(LOCALE_ID) private localeId: string
   ) {
index 22c27a072938b93dd7341589ef7a9398f80b481f..dfeeb8a90ce6958e79fa04cbf1ddf9771d006155 100644 (file)
@@ -5,12 +5,16 @@ import { MetaGuard } from '@ngx-meta/core'
 
 import { LoginGuard } from '../../core'
 import { VideoUpdateComponent } from './video-update.component'
+import { VideoUpdateResolver } from '@app/videos/+video-edit/video-update.resolver'
 
 const videoUpdateRoutes: Routes = [
   {
     path: '',
     component: VideoUpdateComponent,
-    canActivate: [ MetaGuard, LoginGuard ]
+    canActivate: [ MetaGuard, LoginGuard ],
+    resolve: {
+      videoData: VideoUpdateResolver
+    }
   }
 ]
 
index 4fe65bccd83cee34acbeed2e85256b8450afa0f5..774772e148085c6fe5521e6145eef041ff1b067b 100644 (file)
@@ -49,55 +49,31 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
     this.buildForm({})
 
     this.serverService.videoPrivaciesLoaded
-      .subscribe(() => this.videoPrivacies = this.serverService.getVideoPrivacies())
+        .subscribe(() => this.videoPrivacies = this.serverService.getVideoPrivacies())
+
+    this.route.data
+        .pipe(map(data => data.videoData))
+        .subscribe(({ video, videoChannels, videoCaptions }) => {
+          this.video = new VideoEdit(video)
+          this.userVideoChannels = videoChannels
+          this.videoCaptions = videoCaptions
+
+          // We cannot set private a video that was not private
+          if (this.video.privacy !== VideoPrivacy.PRIVATE) {
+            this.videoPrivacies = this.videoPrivacies.filter(p => p.id.toString() !== VideoPrivacy.PRIVATE.toString())
+          } else { // We can schedule video publication only if it it is private
+            this.schedulePublicationPossible = this.video.privacy === VideoPrivacy.PRIVATE
+          }
 
-    const uuid: string = this.route.snapshot.params[ 'uuid' ]
-    this.videoService.getVideo(uuid)
-        .pipe(
-          switchMap(video => {
-            return this.videoService
-                       .loadCompleteDescription(video.descriptionPath)
-                       .pipe(map(description => Object.assign(video, { description })))
-          }),
-          switchMap(video => {
-            return this.videoChannelService
-                       .listAccountVideoChannels(video.account)
-                       .pipe(
-                         map(result => result.data),
-                         map(videoChannels => videoChannels.map(c => ({ id: c.id, label: c.displayName, support: c.support }))),
-                         map(videoChannels => ({ video, videoChannels }))
-                       )
-          }),
-          switchMap(({ video, videoChannels }) => {
-            return this.videoCaptionService
-                       .listCaptions(video.id)
-                       .pipe(
-                         map(result => result.data),
-                         map(videoCaptions => ({ video, videoChannels, videoCaptions }))
-                       )
-          })
-        )
-        .subscribe(
-          ({ video, videoChannels, videoCaptions }) => {
-            this.video = new VideoEdit(video)
-            this.userVideoChannels = videoChannels
-            this.videoCaptions = videoCaptions
-
-            // We cannot set private a video that was not private
-            if (this.video.privacy !== VideoPrivacy.PRIVATE) {
-              this.videoPrivacies = this.videoPrivacies.filter(p => p.id.toString() !== VideoPrivacy.PRIVATE.toString())
-            } else { // We can schedule video publication only if it it is private
-              this.schedulePublicationPossible = this.video.privacy === VideoPrivacy.PRIVATE
-            }
-
-            this.hydrateFormFromVideo()
-          },
+          // FIXME: Angular does not detec
+          setTimeout(() => this.hydrateFormFromVideo())
+        },
 
-          err => {
-            console.error(err)
-            this.notificationsService.error(this.i18n('Error'), err.message)
-          }
-        )
+        err => {
+          console.error(err)
+          this.notificationsService.error(this.i18n('Error'), err.message)
+        }
+      )
   }
 
   checkForm () {
index 3b45c72a53a925cc6510d65eb280d46690b559dc..4f5d72cecce7fb39ee9828fda6aa84e7a6199c36 100644 (file)
@@ -3,6 +3,7 @@ import { SharedModule } from '../../shared'
 import { VideoEditModule } from './shared/video-edit.module'
 import { VideoUpdateRoutingModule } from './video-update-routing.module'
 import { VideoUpdateComponent } from './video-update.component'
+import { VideoUpdateResolver } from '@app/videos/+video-edit/video-update.resolver'
 
 @NgModule({
   imports: [
@@ -19,6 +20,8 @@ import { VideoUpdateComponent } from './video-update.component'
     VideoUpdateComponent
   ],
 
-  providers: [ ]
+  providers: [
+    VideoUpdateResolver
+  ]
 })
 export class VideoUpdateModule { }
diff --git a/client/src/app/videos/+video-edit/video-update.resolver.ts b/client/src/app/videos/+video-edit/video-update.resolver.ts
new file mode 100644 (file)
index 0000000..269fe36
--- /dev/null
@@ -0,0 +1,45 @@
+import { Injectable } from '@angular/core'
+import { VideoService } from '@app/shared/video/video.service'
+import { ActivatedRouteSnapshot, Resolve } from '@angular/router'
+import { map, switchMap } from 'rxjs/operators'
+import { VideoChannelService } from '@app/shared/video-channel/video-channel.service'
+import { VideoCaptionService } from '@app/shared/video-caption'
+
+@Injectable()
+export class VideoUpdateResolver implements Resolve<any> {
+  constructor (
+    private videoService: VideoService,
+    private videoChannelService: VideoChannelService,
+    private videoCaptionService: VideoCaptionService
+  ) {}
+
+  resolve (route: ActivatedRouteSnapshot) {
+    const uuid: string = route.params[ 'uuid' ]
+
+    return this.videoService.getVideo(uuid)
+        .pipe(
+          switchMap(video => {
+            return this.videoService
+                       .loadCompleteDescription(video.descriptionPath)
+                       .pipe(map(description => Object.assign(video, { description })))
+          }),
+          switchMap(video => {
+            return this.videoChannelService
+                       .listAccountVideoChannels(video.account)
+                       .pipe(
+                         map(result => result.data),
+                         map(videoChannels => videoChannels.map(c => ({ id: c.id, label: c.displayName, support: c.support }))),
+                         map(videoChannels => ({ video, videoChannels }))
+                       )
+          }),
+          switchMap(({ video, videoChannels }) => {
+            return this.videoCaptionService
+                       .listCaptions(video.id)
+                       .pipe(
+                         map(result => result.data),
+                         map(videoCaptions => ({ video, videoChannels, videoCaptions }))
+                       )
+          })
+        )
+  }
+}