refactor: editor-video -> vue component + localization
This commit is contained in:
		
							
								
								
									
										94
									
								
								client/js/components/editor-video.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								client/js/components/editor-video.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
<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.icon-film
 | 
			
		||||
                    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: 'video',
 | 
			
		||||
          msg: self.$t('editor.videosuccess')
 | 
			
		||||
        })
 | 
			
		||||
        this.cancel()
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    mounted () {
 | 
			
		||||
      this.$root.$on('editorVideo/init', this.init)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
		Reference in New Issue
	
	Block a user