Use a resolver when updating the video

This commit is contained in:
Chocobozzz 2018-07-16 18:09:31 +02:00
parent ef4c78da4f
commit 308c427551
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
5 changed files with 77 additions and 49 deletions

View 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
) {

View 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
}
}
]

View 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())
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
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
}
this.hydrateFormFromVideo()
},
err => {
console.error(err)
this.notificationsService.error(this.i18n('Error'), err.message)
// 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
}
)
// FIXME: Angular does not detec
setTimeout(() => this.hydrateFormFromVideo())
},
err => {
console.error(err)
this.notificationsService.error(this.i18n('Error'), err.message)
}
)
}
checkForm () {

View 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 { }

View File

@ -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 }))
)
})
)
}
}