application/components/common/simple-editor/modifier/mention.js
- import {Editor, EditorState,ContentState, Modifier} from 'draft-js';
-
- /**
- * Mention modifier injects the mentioned user name into the editor. Keep in mind
- * that it doesn't inject any data, necessarily, just the name. The name is parsed on the
- * backend, which is what decides how notifications are sent.
- *
- * @param editorState object EditorState
- * @param store object AltStore
- * @returns object EditorState
- */
- const mentionModifier = (editorState, store) => {
-
- // grab the state, then get the current block
- const selectionState = editorState.getSelection();
- const currentBlock = editorState
- .getCurrentContent()
- .getBlockForKey(editorState.getSelection().getStartKey());
-
- // get the start of the selection (since it's collapsed)
- // then get the raw text
- const start = selectionState.getStartOffset();
- let end = start;
- const text = currentBlock.getText();
-
- // count backward through the text until we get to an '@' symbol
- for (let i=start; i>=0; i--) {
- const char = text.charAt(i);
- if (char === '@') {
- end = i;
- break;
- }
- }
-
- // then we expand the selection to the entire mention text
- const updatedSelection = selectionState.merge({
- focusOffset: start,
- anchorOffset: end
- });
-
- const user = store.stores.references.getState().selectedUser;
-
- let mention = '@' + user.get('slug');
-
- // replace the expanded selection with our new text
- const replacement = Modifier.replaceText(
- editorState.getCurrentContent(),
- updatedSelection,
- mention
- );
-
- // force the editor to focus back on the end of the text we just passed in
- return EditorState.forceSelection(
- EditorState.push(editorState, replacement, 'insert-characters'),
- replacement.getSelectionAfter()
- );
- };
-
- export default mentionModifier;