From c7538c4ce2a76dcdc039c59d9e3a6389c0b922df Mon Sep 17 00:00:00 2001
From: Ruben Bimberg <ruben.bimberg@mni.thm.de>
Date: Mon, 6 Sep 2021 13:29:18 +0200
Subject: [PATCH] Fix handling of videos inside quill

[Ticket: #623]
---
 .../deep-ldialog/deep-ldialog.component.html  |  2 +
 .../deep-ldialog/deep-ldialog.component.scss  |  2 +-
 .../view-comment-data.component.ts            | 40 ++++++++++++++++++-
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.html b/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.html
index 764ce8197..3d35a3c43 100644
--- a/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.html
+++ b/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.html
@@ -9,6 +9,7 @@
       <strong>{{'deepl.option-normal' | translate}}</strong>
     </mat-radio-button>
     <app-view-comment-data #normal
+                           class="deepl-view-comment"
                            [maxTextCharacters]="data.maxTextCharacters"
                            [maxDataCharacters]="data.maxDataCharacters"
                            [isModerator]="data.isModerator"
@@ -19,6 +20,7 @@
       <strong>{{'deepl.option-improved' | translate}}</strong>
     </mat-radio-button>
     <app-view-comment-data #improved
+                           class="deepl-view-comment"
                            [maxTextCharacters]="data.maxTextCharacters"
                            [maxDataCharacters]="data.maxDataCharacters"
                            [isModerator]="data.isModerator"
diff --git a/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.scss b/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.scss
index a667f841e..03950c427 100644
--- a/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.scss
+++ b/src/app/components/shared/_dialogs/deep-ldialog/deep-ldialog.component.scss
@@ -12,7 +12,7 @@
     width: 100%;
   }
 
-  app-view-comment-data > div {
+  app-view-comment-data.deepl-view-comment > div {
     background: var(--surface);
     border-radius: 10px;
     padding: 7px;
diff --git a/src/app/components/shared/view-comment-data/view-comment-data.component.ts b/src/app/components/shared/view-comment-data/view-comment-data.component.ts
index 88bae55aa..c3b2018cc 100644
--- a/src/app/components/shared/view-comment-data/view-comment-data.component.ts
+++ b/src/app/components/shared/view-comment-data/view-comment-data.component.ts
@@ -60,7 +60,7 @@ export class ViewCommentDataComponent implements OnInit, AfterViewInit {
       container: participantToolbar,
       handlers: {
         image: () => this.handle('image'),
-        video: () => this.handle('video'),
+        video: () => this.handleVideo(),
         link: () => this.handleLink(),
         formula: () => this.handle('formula')
       }
@@ -268,6 +268,44 @@ export class ViewCommentDataComponent implements OnInit, AfterViewInit {
       .subscribe(translation => tooltip.textbox.placeholder = translation);
   }
 
+  private handleVideo(): void {
+    const quill = this.editor.quillEditor;
+    const tooltip = quill.theme.tooltip;
+    const originalSave = tooltip.save;
+    const originalHide = tooltip.hide;
+    tooltip.save = () => {
+      const range = quill.getSelection(true);
+      const value = this.getVideoUrl(tooltip.textbox.value);
+      if (value) {
+        quill.insertEmbed(range.index, 'video', value, 'user');
+      }
+    };
+    // Called on hide and save.
+    tooltip.hide = () => {
+      tooltip.save = originalSave;
+      tooltip.hide = originalHide;
+      tooltip.hide();
+    };
+    tooltip.edit('video');
+    this.translateService.get('quill.tooltip-placeholder-video')
+      .subscribe(translation => tooltip.textbox.placeholder = translation);
+  }
+
+  private getVideoUrl(url) {
+    let match = url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) ||
+      url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/) ||
+      url.match(/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#&?]*).*/);
+    if (match && match[2].length === 11) {
+      return 'https://www.youtube-nocookie.com/embed/' + match[2] + '?showinfo=0';
+    }
+    match = url.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/);
+    if (match) {
+      return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/';
+    }
+    return null;
+  }
+
+
   private handle(type: string): void {
     const quill = this.editor.quillEditor;
     const tooltip = quill.theme.tooltip;
-- 
GitLab