UNPKG

@atlaskit/editor-plugin-mentions

Version:

Mentions plugin for @atlaskit/editor-core

79 lines (78 loc) 2.6 kB
// eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead import uuid from 'uuid'; import { getAnnotationMarksForPos } from '@atlaskit/editor-common/utils'; import { Fragment } from '@atlaskit/editor-prosemirror/model'; import { isResolvingMentionProvider } from '@atlaskit/mention/resource'; export const createSingleMentionFragment = ({ mentionInsertDisplayName, mentionProvider, tr, sanitizePrivateContent }) => ({ name, id, userType, nickname, localId, accessLevel, isXProductUser }) => { const schema = tr.doc.type.schema; const trimmedNickname = nickname && nickname.startsWith('@') ? nickname.slice(1) : nickname; const renderName = mentionInsertDisplayName || !trimmedNickname ? name : trimmedNickname; if (isXProductUser && mentionProvider && mentionProvider.inviteXProductUser) { mentionProvider.inviteXProductUser(id, name); } // Don't insert into document if document data is sanitized. const text = sanitizePrivateContent ? '' : `@${renderName}`; if (sanitizePrivateContent && isResolvingMentionProvider(mentionProvider)) { // Cache (locally) for later rendering mentionProvider.cacheMentionName(id, renderName); } const annotationMarksForPos = getAnnotationMarksForPos(tr.selection.$head); const mentionNode = schema.nodes.mention.createChecked({ text, id, accessLevel, userType: userType === 'DEFAULT' ? null : userType, // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead localId: localId !== null && localId !== void 0 ? localId : uuid() }, null, annotationMarksForPos); const space = schema.text(' ', annotationMarksForPos); return Fragment.from([mentionNode, space]); }; export const insertMention = ({ sanitizePrivateContent, api, mentionInsertDisplayName }) => ({ name, id, userType, localId, nickname, accessLevel, isXProductUser }) => { return ({ tr }) => { var _api$mention$sharedSt; const mentionProvider = api === null || api === void 0 ? void 0 : (_api$mention$sharedSt = api.mention.sharedState.currentState()) === null || _api$mention$sharedSt === void 0 ? void 0 : _api$mention$sharedSt.mentionProvider; const mentionFragment = createSingleMentionFragment({ sanitizePrivateContent, mentionProvider, mentionInsertDisplayName, tr })({ name, id, userType, nickname, localId, accessLevel, isXProductUser }); return tr.insert(tr.selection.from, mentionFragment); }; };