aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit')
-rw-r--r--client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.html64
-rw-r--r--client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.scss17
-rw-r--r--client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.ts76
3 files changed, 157 insertions, 0 deletions
diff --git a/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.html b/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.html
new file mode 100644
index 000000000..611146c1a
--- /dev/null
+++ b/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.html
@@ -0,0 +1,64 @@
1<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
2
3<div class="margin-content">
4 <form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
5
6 <div class="row">
7 <div class="col-12 col-lg-4 col-xl-3">
8 <div class="video-channel-sync-title" i18n>NEW SYNCHRONIZATION</div>
9 </div>
10
11 <div class="col-12 col-lg-8 col-xl-9">
12 <div class="form-group">
13 <label i18n for="externalChannelUrl">Remote channel URL</label>
14
15 <div class="input-group">
16 <input
17 type="text"
18 id="externalChannelUrl"
19 i18n-placeholder
20 placeholder="Example: https://youtube.com/channel/UC_fancy_channel"
21 formControlName="externalChannelUrl"
22 [ngClass]="{ 'input-error': formErrors['externalChannelUrl'] }"
23 class="form-control"
24 >
25 </div>
26
27 <div *ngIf="formErrors['externalChannelUrl']" class="form-error">
28 {{ formErrors['externalChannelUrl'] }}
29 </div>
30 </div>
31
32 <div class="form-group">
33 <label i18n for="videoChannel">Video Channel</label>
34 <my-select-channel required [items]="userVideoChannels" formControlName="videoChannel"></my-select-channel>
35
36 <div *ngIf="formErrors['videoChannel']" class="form-error">
37 {{ formErrors['videoChannel'] }}
38 </div>
39 </div>
40
41 <div class="form-group">
42 <label for="existingVideoStrategy" i18n>Options for existing videos on remote channel:</label>
43
44 <div class="peertube-radio-container">
45 <input type="radio" name="existingVideoStrategy" id="import" value="import" formControlName="existingVideoStrategy" required />
46 <label for="import" i18n>Import all and watch for new publications</label>
47 </div>
48
49 <div class="peertube-radio-container">
50 <input type="radio" name="existingVideoStrategy" id="doNothing" value="nothing" formControlName="existingVideoStrategy" required />
51 <label for="doNothing" i18n>Only watch for new publications</label>
52 </div>
53 </div>
54 </div>
55 </div>
56
57 <div class="row"> <!-- submit placement block -->
58 <div class="col-md-7 col-xl-5"></div>
59 <div class="col-md-5 col-xl-5 d-inline-flex">
60 <input type="submit" class="peertube-button orange-button ms-auto" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
61 </div>
62 </div>
63 </form>
64</div>
diff --git a/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.scss b/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.scss
new file mode 100644
index 000000000..d0d8c2a68
--- /dev/null
+++ b/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.scss
@@ -0,0 +1,17 @@
1@use '_variables' as *;
2@use '_mixins' as *;
3
4$form-base-input-width: 480px;
5
6input[type=text] {
7 @include peertube-input-text($form-base-input-width);
8}
9
10.video-channel-sync-title {
11 @include settings-big-title;
12}
13
14my-select-channel {
15 display: block;
16 max-width: $form-base-input-width;
17}
diff --git a/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.ts b/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.ts
new file mode 100644
index 000000000..836582609
--- /dev/null
+++ b/client/src/app/+my-library/my-video-channel-syncs/video-channel-sync-edit/video-channel-sync-edit.component.ts
@@ -0,0 +1,76 @@
1import { mergeMap } from 'rxjs'
2import { SelectChannelItem } from 'src/types'
3import { Component, OnInit } from '@angular/core'
4import { Router } from '@angular/router'
5import { AuthService, Notifier } from '@app/core'
6import { listUserChannelsForSelect } from '@app/helpers'
7import { VIDEO_CHANNEL_EXTERNAL_URL_VALIDATOR } from '@app/shared/form-validators/video-channel-validators'
8import { FormReactive, FormValidatorService } from '@app/shared/shared-forms'
9import { VideoChannelService, VideoChannelSyncService } from '@app/shared/shared-main'
10import { VideoChannelSyncCreate } from '@shared/models/videos'
11
12@Component({
13 selector: 'my-video-channel-sync-edit',
14 templateUrl: './video-channel-sync-edit.component.html',
15 styleUrls: [ './video-channel-sync-edit.component.scss' ]
16})
17export class VideoChannelSyncEditComponent extends FormReactive implements OnInit {
18 error: string
19 userVideoChannels: SelectChannelItem[] = []
20 existingVideosStrategy: string
21
22 constructor (
23 protected formValidatorService: FormValidatorService,
24 private authService: AuthService,
25 private router: Router,
26 private notifier: Notifier,
27 private videoChannelSyncService: VideoChannelSyncService,
28 private videoChannelService: VideoChannelService
29 ) {
30 super()
31 }
32
33 ngOnInit () {
34 this.buildForm({
35 externalChannelUrl: VIDEO_CHANNEL_EXTERNAL_URL_VALIDATOR,
36 videoChannel: null,
37 existingVideoStrategy: null
38 })
39
40 listUserChannelsForSelect(this.authService)
41 .subscribe(channels => this.userVideoChannels = channels)
42 }
43
44 getFormButtonTitle () {
45 return $localize`Create`
46 }
47
48 formValidated () {
49 this.error = undefined
50
51 const body = this.form.value
52 const videoChannelSyncCreate: VideoChannelSyncCreate = {
53 externalChannelUrl: body.externalChannelUrl,
54 videoChannelId: body.videoChannel
55 }
56
57 const importExistingVideos = body['existingVideoStrategy'] === 'import'
58
59 this.videoChannelSyncService.createSync(videoChannelSyncCreate)
60 .pipe(mergeMap(({ videoChannelSync }) => {
61 return importExistingVideos
62 ? this.videoChannelService.importVideos(videoChannelSync.channel.name, videoChannelSync.externalChannelUrl)
63 : Promise.resolve(null)
64 }))
65 .subscribe({
66 next: () => {
67 this.notifier.success($localize`Synchronization created successfully.`)
68 this.router.navigate([ '/my-library', 'video-channel-syncs' ])
69 },
70
71 error: err => {
72 this.error = err.message
73 }
74 })
75 }
76}