editor-video.vue 3.1 KB
<template lang="pug">
  transition(:duration="400")
    .modal(v-show='isShown', v-cloak)
      transition(name='modal-background')
        .modal-background(v-show='isShown')
      .modal-container
        transition(name='modal-content')
          .modal-content(v-show='isShown')
            header.is-green
              span {{ $t('editor.videotitle') }}
            section
              label.label
              p.control.is-fullwidth
                input.input(type='text', placeholder='https://www.youtube.com/watch?v=xxxxxxxxxxx', v-model='link', ref='editorVideoInput', @keyup.enter='insertVideo', @keyup.esc='cancel')
                span.help.is-red(v-show='isInvalid') {{ $t('editor.videonotsupported') }}
              .note {{ $t('editor.videosupportedtitle') }}
                ul
                  li
                    i.icon-youtube-play
                    span Youtube
                  li
                    i.icon-vimeo
                    span Vimeo
                  li
                    i.nc-icon-outline.media-1_play-69
                    span Dailymotion
                  li
                    i.icon-video
                    span {{ $t('editor.videoanymp4file') }}
            footer
              a.button.is-grey.is-outlined(v-on:click='cancel') {{ $t('editor.discard') }}
              a.button.is-green(v-on:click='insertVideo') {{ $t('editor.videoinsert') }}
</template>

<script>
  const videoRules = {
    'youtube': new RegExp('/(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/)|(?:(?:watch)?\\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/', 'i'),
    'vimeo': new RegExp('/vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/(?:[^/]*)\\/videos\\/|album\\/(?:\\d+)\\/video\\/|)(\\d+)(?:$|\\/|\\?)/', 'i'),
    'dailymotion': new RegExp('/(?:dailymotion\\.com(?:\\/embed)?(?:\\/video|\\/hub)|dai\\.ly)\\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/', 'i')
  }

  export default {
    name: 'editor-video',
    data () {
      return {
        link: '',
        isInvalid: false
      }
    },
    computed: {
      isShown () {
        return this.$store.state.editorVideo.shown
      }
    },
    methods: {
      init () {
        let self = this
        self.isInvalid = false
        self._.delay(() => {
          self.$refs.editorVideoInput.focus()
        }, 100)
      },
      cancel () {
        this.$store.dispatch('editorVideo/close')
      },
      insertVideo () {
        let self = this

        if (this._.isEmpty(self.link) || self.link.length < 5) {
          this.isInvalid = true
          return
        }

        let videoType = this._.findKey(videoRules, (vr) => {
          return vr.test(self.link)
        })
        if (this._.isNil(videoType)) {
          videoType = 'video'
        }
        let videoText = '[video](' + this.link + '){.' + videoType + '}\n'
        this.$store.dispatch('editor/insert', videoText)
        this.$store.dispatch('alert', {
          style: 'blue',
          icon: 'media-1_action-74',
          msg: self.$t('editor.videosuccess')
        })
        this.cancel()
      }
    },
    mounted () {
      this.$root.$on('editorVideo/init', this.init)
    }
  }
</script>