import { Node } from '@tiptap/core' export interface IframeOptions { allowFullscreen: boolean HTMLAttributes: { [key: string]: string | number } } declare module '@tiptap/core' { interface Commands { iframe: { setIframe: (options: { src: string }) => ReturnType } } } export const Iframe = Node.create({ name: 'iframe', group: 'block', atom: true, addOptions() { return { allowFullscreen: true, HTMLAttributes: { class: 'iframe-wrapper', }, } }, addAttributes() { return { src: { default: null, }, frameborder: { default: 0, }, allowfullscreen: { default: this.options.allowFullscreen, parseHTML: () => this.options.allowFullscreen, }, width: { default: null }, height: { default: null }, } }, parseHTML() { return [ { tag: 'iframe', }, ] }, renderHTML({ HTMLAttributes }) { return ['div', this.options.HTMLAttributes, ['iframe', HTMLAttributes]] }, addCommands() { return { setIframe: (options: { src: string }) => ({ tr, dispatch }) => { const { selection } = tr const node = this.type.create(options) if (dispatch) { tr.replaceRangeWith(selection.from, selection.to, node) } return true }, } }, })