import { Node } from 'tiptap' import pasteRule from '../commands/pasteRule' import { compileToFunctions } from 'vue-template-compiler' import { mapGetters, mapMutations } from 'vuex' import { allowEmbedIframesMutation } from '~/graphql/User.js' const template = `
{{ dataEmbedUrl }} ` const templateVideoPreview = `
{{embedPublisher}} - @{{ embedAuthor }}
Deine Daten sind noch nicht weitergegeben. Wenn Du die das jetzt ansiehst dann werden auch Daten mit dem Anbieter ausgetauscht! dauerhaft speichern jetzt ansehen Deine Daten sind noch nicht weitergegeben. Wenn Du die das jetzt ansiehst dann werden auch Daten mit dem Anbieter ausgetauscht! dauerhaft speichern abstellen
{{ embedTitle }}
{{ embedDescription }}
automatisches Einbinden abgestellt | ändern automatisches Einbinden zugelassen | ändern
` const compiledTemplate = compileToFunctions(template) const compiledTemplateVideoPreview = compileToFunctions(templateVideoPreview) export default class Embed extends Node { get name() { return 'embed' } get defaultOptions() { return { onEmbed: () => ({}), } } pasteRules({ type, schema }) { return [ pasteRule( // source: https://stackoverflow.com/a/3809435 /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/g, type, url => ({ dataEmbedUrl: url }), ), ] } get schema() { return { attrs: { dataEmbedUrl: { default: null, }, }, group: 'inline', inline: true, parseDOM: [ { tag: 'a[href].embed', getAttrs: dom => ({ dataEmbedUrl: dom.getAttribute('href'), }), }, ], toDOM: node => [ 'a', { href: node.attrs.dataEmbedUrl, class: 'embed', target: '_blank', }, ], } } get view() { return { props: ['node', 'updateAttrs', 'options'], data: () => ({ embedData: {}, showEmbed: true, showOverlay: false, embedcode: null, isOpen: false, showchangeEmbedStatus: false, // allowEmbedIframes: this.currentUser.allowEmbedIframes }), async created() { if (!this.options) return {} this.embedData = await this.options.onEmbed({ url: this.dataEmbedUrl }) this.showEmbed = this.currentUser.allowEmbedIframes }, computed: { ...mapGetters({ currentUser: 'auth/user', }), embedClass() { return this.embedHtml ? 'embed' : '' }, embedHtml() { const { html = '' } = this.embedData return html }, embedImage() { const { image = '' } = this.embedData return image }, embedPublisher() { const { publisher = '' } = this.embedData return publisher }, embedTitle() { const { title = '' } = this.embedData return title }, embedAuthor() { const { author = '' } = this.embedData return author }, embedDescription() { const { description = '' } = this.embedData return description }, dataEmbedUrl: { get() { return this.node.attrs.dataEmbedUrl }, set(dataEmbedUrl) { this.updateAttrs({ dataEmbedUrl, }) }, }, }, methods: { ...mapMutations({ setCurrentUser: 'auth/SET_USER', }), clickPreview: function(xx, html) { this.showOverlay = true }, allowEmbedTemporar: function(xx, html) { if (xx === 'openIframe') { this.embedcode = html this.showEmbed = true } else { this.embedcode = null this.showEmbed = false } this.showOverlay = false }, modalOpen: function() { this.showOverlay = false this.showchangeEmbedStatus = true }, setConfirm: function() { this.submit(true) this.showOverlay = false this.showchangeEmbedStatus = false }, setCancel: function() { this.submit(false) this.showchangeEmbedStatus = false }, async submit(allowEmbedIframes) { try { await this.$apollo.mutate({ mutation: allowEmbedIframesMutation(), variables: { id: this.currentUser.id, allowEmbedIframes, }, update: (store, { data: { UpdateUser } }) => { const { allowEmbedIframes } = UpdateUser this.setCurrentUser({ ...this.currentUser, allowEmbedIframes, }) }, }) this.$toast.success(this.$t('contribution.success')) this.showEmbed = this.currentUser.allowEmbedIframes } catch (err) { this.$toast.error(err.message) } }, }, render(createElement) { if (this.embedHtml !== '') return compiledTemplateVideoPreview.render.call(this, createElement) if (this.embedHtml === '') return compiledTemplate.render.call(this, createElement) }, } } }