import { Node, mergeAttributes } from '@tiptap/core';
import { ReactNodeViewRenderer, NodeViewWrapper } from '@tiptap/react';
import type { NodeViewProps } from '@tiptap/react';
import { IconClose } from '@douyinfe/semi-icons';
import React from 'react';
import { getCustomSlotAttribute } from '@douyinfe/semi-foundation/aiChatInput/utils';
function SkillSlotComponent(props: NodeViewProps) {
const { node, editor } = props;
const value: string = node.attrs.label ?? node.attrs.value ?? '';
const onRemove = (e: React.MouseEvent) => {
e.preventDefault();
e.stopPropagation();
editor?.commands.clearContent();
};
if (value === '') {
return null;
}
return (
{value}
);
}
const SkillSlot = Node.create({
name: 'skillSlot',
inline: true,
group: 'inline',
atom: true,
selectable: false,
addAttributes() {
return {
value: {
default: '',
parseHTML: (element: HTMLElement) => (element as HTMLElement).getAttribute('data-value'),
renderHTML: (attributes: Record) => ({ 'data-value': attributes.value }),
},
label: {
parseHTML: (element: HTMLElement) => (element as HTMLElement).getAttribute('data-label'),
renderHTML: (attributes: Record) => ({ 'data-label': attributes.label }),
},
hasTemplate: {
parseHTML: (element: HTMLElement) => (element as HTMLElement).getAttribute('data-template') === 'true',
renderHTML: (attributes: Record) => ({ 'data-template': attributes.hasTemplate }),
},
isCustomSlot: getCustomSlotAttribute(),
};
},
parseHTML() {
return [{
tag: 'skill-slot',
}];
},
renderHTML({ HTMLAttributes: htmlAttributes }) {
return ['skill-slot', mergeAttributes(htmlAttributes)];
},
addNodeView() {
return ReactNodeViewRenderer(SkillSlotComponent);
},
});
export default SkillSlot;