@atlaskit/editor-plugin-mentions
Version:
Mentions plugin for @atlaskit/editor-core
79 lines (78 loc) • 2.6 kB
JavaScript
// 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);
};
};