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)
},
}
}
}