import type { LexicalNode, NodeKey, SerializedLexicalNode } from 'lexical' import { DecoratorNode } from 'lexical' import ContextBlockComponent from './component' import type { Dataset } from './index' export type SerializedNode = SerializedLexicalNode & { datasets: Dataset[]; onAddContext: () => void; canNotAddContext: boolean } export class ContextBlockNode extends DecoratorNode { __datasets: Dataset[] __onAddContext: () => void __canNotAddContext: boolean static getType(): string { return 'context-block' } static clone(node: ContextBlockNode): ContextBlockNode { return new ContextBlockNode(node.__datasets, node.__onAddContext, node.getKey(), node.__canNotAddContext) } isInline(): boolean { return true } constructor(datasets: Dataset[], onAddContext: () => void, key?: NodeKey, canNotAddContext?: boolean) { super(key) this.__datasets = datasets this.__onAddContext = onAddContext this.__canNotAddContext = canNotAddContext || false } createDOM(): HTMLElement { const div = document.createElement('div') div.classList.add('inline-flex', 'items-center', 'align-middle') return div } updateDOM(): false { return false } decorate(): JSX.Element { return ( ) } getDatasets(): Dataset[] { const self = this.getLatest() return self.__datasets } getOnAddContext(): () => void { const self = this.getLatest() return self.__onAddContext } getCanNotAddContext(): boolean { const self = this.getLatest() return self.__canNotAddContext } static importJSON(serializedNode: SerializedNode): ContextBlockNode { const node = $createContextBlockNode(serializedNode.datasets, serializedNode.onAddContext, serializedNode.canNotAddContext) return node } exportJSON(): SerializedNode { return { type: 'context-block', version: 1, datasets: this.getDatasets(), onAddContext: this.getOnAddContext(), canNotAddContext: this.getCanNotAddContext(), } } getTextContent(): string { return '{{#context#}}' } } export function $createContextBlockNode(datasets: Dataset[], onAddContext: () => void, canNotAddContext?: boolean): ContextBlockNode { return new ContextBlockNode(datasets, onAddContext, undefined, canNotAddContext) } export function $isContextBlockNode( node: ContextBlockNode | LexicalNode | null | undefined, ): boolean { return node instanceof ContextBlockNode }