From 308c427551c3e20cd9172be58636d8c178f5ae70 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 16 Jul 2018 18:09:31 +0200 Subject: [PATCH] Use a resolver when updating the video --- .../my-account-videos.component.ts | 2 +- .../video-update-routing.module.ts | 6 +- .../+video-edit/video-update.component.ts | 70 ++++++------------- .../videos/+video-edit/video-update.module.ts | 5 +- .../+video-edit/video-update.resolver.ts | 45 ++++++++++++ 5 files changed, 78 insertions(+), 50 deletions(-) create mode 100644 client/src/app/videos/+video-edit/video-update.resolver.ts diff --git a/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts b/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts index e698b75ec..54830c75e 100644 --- a/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts +++ b/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts @@ -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 ) { diff --git a/client/src/app/videos/+video-edit/video-update-routing.module.ts b/client/src/app/videos/+video-edit/video-update-routing.module.ts index 22c27a072..dfeeb8a90 100644 --- a/client/src/app/videos/+video-edit/video-update-routing.module.ts +++ b/client/src/app/videos/+video-edit/video-update-routing.module.ts @@ -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 + } } ] diff --git a/client/src/app/videos/+video-edit/video-update.component.ts b/client/src/app/videos/+video-edit/video-update.component.ts index 4fe65bccd..774772e14 100644 --- a/client/src/app/videos/+video-edit/video-update.component.ts +++ b/client/src/app/videos/+video-edit/video-update.component.ts @@ -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 () { diff --git a/client/src/app/videos/+video-edit/video-update.module.ts b/client/src/app/videos/+video-edit/video-update.module.ts index 3b45c72a5..4f5d72cec 100644 --- a/client/src/app/videos/+video-edit/video-update.module.ts +++ b/client/src/app/videos/+video-edit/video-update.module.ts @@ -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 index 000000000..269fe3684 --- /dev/null +++ b/client/src/app/videos/+video-edit/video-update.resolver.ts @@ -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 { + 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 })) + ) + }) + ) + } +} -- 2.41.0