import React from 'react'; import { EditorView, NodeView } from 'prosemirror-view'; import { Node as PmNode } from 'prosemirror-model'; import { ProviderFactory, ExtensionHandlers } from '@atlaskit/editor-common'; import { EditorAppearance } from '../../../types/editor-appearance'; import { ReactNodeView } from '../../../nodeviews'; import Extension from '../ui/Extension'; import ExtensionNodeWrapper from '../ui/Extension/ExtensionNodeWrapper'; import { PortalProviderAPI } from '../../../ui/PortalProvider'; import { ForwardRef, getPosHandler } from '../../../nodeviews/'; import { EventDispatcher } from '../../../event-dispatcher'; interface ExtensionNodeViewOptions { appearance?: EditorAppearance; } export interface Props { node: PmNode; providerFactory: ProviderFactory; view: EditorView; } export class ExtensionNode extends ReactNodeView { ignoreMutation( mutation: MutationRecord | { type: 'selection'; target: Element }, ) { // Extensions can perform async operations that will change the DOM. // To avoid having their tree rebuilt, we need to ignore the mutation // for atom based extensions if its not a layout, we need to give // children a chance to recalc return ( this.node.type.isAtom || (mutation.type !== 'selection' && mutation.attributeName !== 'data-layout') ); } getContentDOM() { if (this.node.isInline) { return; } const dom = document.createElement('div'); dom.className = `${this.node.type.name}-content-dom-wrapper`; return { dom }; } render( props: { providerFactory: ProviderFactory; extensionHandlers: ExtensionHandlers; // referentiality plugin won't utilise appearance just yet extensionNodeViewOptions?: ExtensionNodeViewOptions; }, forwardRef: ForwardRef, ) { return ( ); } } export default function ExtensionNodeView( portalProviderAPI: PortalProviderAPI, eventDispatcher: EventDispatcher, providerFactory: ProviderFactory, extensionHandlers: ExtensionHandlers, extensionNodeViewOptions: ExtensionNodeViewOptions, ) { return (node: PmNode, view: EditorView, getPos: getPosHandler): NodeView => { return new ExtensionNode( node, view, getPos, portalProviderAPI, eventDispatcher, { providerFactory, extensionHandlers, extensionNodeViewOptions, }, ).init(); }; }