import { DecoratorNode, DOMExportOutput, LexicalNode, NodeKey, SerializedLexicalNode, Spread, } from 'lexical'; import React from 'react'; import { ContractBlockComponent } from './ContractBlockComponent'; export type SerializedContractBlockNode = Spread< { contractId: string; contractName: string; }, SerializedLexicalNode >; export class ContractBlockNode extends DecoratorNode { __contractId: string; __contractName: string; static getType(): string { return 'contract-block'; } static clone(node: ContractBlockNode): ContractBlockNode { return new ContractBlockNode(node.__contractId, node.__contractName, node.__key); } constructor(contractId: string, contractName: string, key?: NodeKey) { super(key); this.__contractId = contractId; this.__contractName = contractName; } createDOM(): HTMLElement { const div = document.createElement('div'); div.className = 'contract-block-wrapper'; return div; } updateDOM(): boolean { return false; } decorate(): JSX.Element { return ( ); } exportJSON(): SerializedContractBlockNode { return { ...super.exportJSON(), type: 'contract-block', contractId: this.__contractId, contractName: this.__contractName, version: 1, }; } static importJSON(serializedNode: SerializedContractBlockNode): ContractBlockNode { return $createContractBlockNode( serializedNode.contractId, serializedNode.contractName ); } isInline(): boolean { return false; } canInsertTextBefore(): boolean { return false; } canInsertTextAfter(): boolean { return false; } exportDOM(): DOMExportOutput { const element = document.createElement('div'); element.className = 'contract-block-wrapper'; element.setAttribute('data-contract-id', this.__contractId); element.textContent = `[Contract: ${this.__contractName}]`; return { element }; } } export function $createContractBlockNode( contractId: string, contractName: string ): ContractBlockNode { return new ContractBlockNode(contractId, contractName); } export function $isContractBlockNode( node: LexicalNode | null | undefined, ): node is ContractBlockNode { return node instanceof ContractBlockNode; }