|
import i18n from '@/locales/config'; |
|
import { BeginId } from '@/pages/flow/constant'; |
|
import { DecoratorNode, LexicalNode, NodeKey } from 'lexical'; |
|
import { ReactNode } from 'react'; |
|
const prefix = BeginId + '@'; |
|
|
|
export class VariableNode extends DecoratorNode<ReactNode> { |
|
__value: string; |
|
__label: string; |
|
|
|
static getType(): string { |
|
return 'variable'; |
|
} |
|
|
|
static clone(node: VariableNode): VariableNode { |
|
return new VariableNode(node.__value, node.__label, node.__key); |
|
} |
|
|
|
constructor(value: string, label: string, key?: NodeKey) { |
|
super(key); |
|
this.__value = value; |
|
this.__label = label; |
|
} |
|
|
|
createDOM(): HTMLElement { |
|
const dom = document.createElement('span'); |
|
dom.className = 'mr-1'; |
|
|
|
return dom; |
|
} |
|
|
|
updateDOM(): false { |
|
return false; |
|
} |
|
|
|
decorate(): ReactNode { |
|
let content: ReactNode = ( |
|
<span className="text-blue-600">{this.__label}</span> |
|
); |
|
if (this.__value.startsWith(prefix)) { |
|
content = ( |
|
<div> |
|
<span>{i18n.t(`flow.begin`)}</span> / {content} |
|
</div> |
|
); |
|
} |
|
return ( |
|
<div className="bg-gray-200 dark:bg-gray-400 text-primary inline-flex items-center rounded-md px-2 py-0"> |
|
{content} |
|
</div> |
|
); |
|
} |
|
|
|
getTextContent(): string { |
|
return `{${this.__value}}`; |
|
} |
|
} |
|
|
|
export function $createVariableNode( |
|
value: string, |
|
label: string, |
|
): VariableNode { |
|
return new VariableNode(value, label); |
|
} |
|
|
|
export function $isVariableNode( |
|
node: LexicalNode | null | undefined, |
|
): node is VariableNode { |
|
return node instanceof VariableNode; |
|
} |
|
|