UNPKG

@selfcommunity/react-ui

Version:

React UI Components to integrate a Community created with SelfCommunity Platform.

91 lines (90 loc) 2.89 kB
import { TextNode } from 'lexical'; function convertMentionElement(domNode) { const mention = domNode; return { node: createMentionNode({ avatar: '', bio: '', date_joined: undefined, description: '', gender: '', location: '', real_name: '', reputation: 0, role: '', status: '', tags: undefined, website: '', id: domNode.getAttribute('id'), ext_id: domNode.getAttribute('ext_id'), username: domNode.innerText.replace('@', '') }) }; } export class MentionNode extends TextNode { static getType() { return 'mention'; } static clone(node) { return new MentionNode(node.__user, node.__text, node.__key); } constructor(user, text, key) { super(text !== null && text !== void 0 ? text : `@${user.username}`, key); this.__user = user; } createDOM(config) { const tag = 'mention'; const dom = document.createElement(tag); dom.setAttribute('id', `${this.__user.id}`); dom.setAttribute('ext-id', `${this.__user.ext_id}`); dom.innerText = this.__text; return dom; } updateDOM(prevNode, dom, config) { // eslint-disable-next-line @typescript-eslint/ban-ts-ignore // @ts-ignore const inner = dom.firstChild; if (inner === null) { return true; } // eslint-disable-next-line @typescript-eslint/ban-ts-ignore // @ts-ignore super.updateDOM(prevNode, inner, config); return false; } static importDOM() { // eslint-disable-next-line @typescript-eslint/ban-ts-ignore // @ts-ignore const dom = TextNode.importDOM(); return Object.assign({ mention: (node) => ({ conversion: convertMentionElement, priority: 0 }) }, dom); } exportDOM() { const element = document.createElement('mention'); element.setAttribute('id', `${this.__user.id}`); element.setAttribute('ext-id', `${this.__user.ext_id}`); element.textContent = `@${this.__user.username}`; return { element }; } isTextEntity() { return true; } static importJSON(serializedNode) { const { user } = serializedNode; const node = createMentionNode(user); return node; } exportJSON() { return Object.assign(Object.assign({}, super.exportJSON()), { user: this.__user, type: 'mention', version: 1 }); } } export function createMentionNode(user) { const mentionNode = new MentionNode(user); mentionNode.setMode('segmented').toggleDirectionless(); return mentionNode; } export function isMentionNode(node) { return node.getType() === 'mention'; }