|
@@ -1,17 +1,9 @@
|
|
|
-import React, { FC } from 'react';
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-import { Emoji } from 'emoji-mart';
|
|
|
|
|
|
|
+import type { CompletionContext } from '@codemirror/autocomplete';
|
|
|
|
|
+import { syntaxTree } from '@codemirror/language';
|
|
|
import emojiData from 'emoji-mart/data/all.json';
|
|
import emojiData from 'emoji-mart/data/all.json';
|
|
|
|
|
|
|
|
-import { useEmojiHintModal } from '~/stores/modal';
|
|
|
|
|
-import 'emoji-mart/css/emoji-mart.css';
|
|
|
|
|
-
|
|
|
|
|
-import { EmojiHintItem } from './EmojiHintItem';
|
|
|
|
|
|
|
|
|
|
-import type { UseCodeMirrorEditor } from 'src';
|
|
|
|
|
-
|
|
|
|
|
-export const useEmojiAutoCompletion = (inputChar: string): string[] => {
|
|
|
|
|
|
|
+const getEmojiDataArray = (): string[] => {
|
|
|
const rawEmojiDataArray = emojiData.categories;
|
|
const rawEmojiDataArray = emojiData.categories;
|
|
|
|
|
|
|
|
const emojiCategoriesData = [
|
|
const emojiCategoriesData = [
|
|
@@ -37,50 +29,62 @@ export const useEmojiAutoCompletion = (inputChar: string): string[] => {
|
|
|
fixedEmojiDataArray.push(...tempArray);
|
|
fixedEmojiDataArray.push(...tempArray);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- const suggestedEmojiArray = fixedEmojiDataArray.filter((element) => {
|
|
|
|
|
- return element.startsWith(inputChar);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return fixedEmojiDataArray;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
- console.dir(suggestedEmojiArray);
|
|
|
|
|
|
|
+const emojiDataArray = getEmojiDataArray();
|
|
|
|
|
|
|
|
- suggestedEmojiArray.sort((a, b) => { return a.length - b.length });
|
|
|
|
|
|
|
+const emojiOptions = emojiDataArray.map(
|
|
|
|
|
+ tag => ({ label: `:${tag}`, type: 'keyword' }),
|
|
|
|
|
+);
|
|
|
|
|
|
|
|
- return suggestedEmojiArray;
|
|
|
|
|
-};
|
|
|
|
|
|
|
+export const completeEmojiInput = (context: CompletionContext) => {
|
|
|
|
|
+ const nodeBefore = syntaxTree(context.state).resolveInner(context.pos, -1);
|
|
|
|
|
+ const textBefore = context.state.sliceDoc(nodeBefore.from, context.pos);
|
|
|
|
|
+ const emojiBefore = /:\w*$/.exec(textBefore);
|
|
|
|
|
|
|
|
-const EmojiHintModalStyle = {
|
|
|
|
|
- maxHeight: '40vh',
|
|
|
|
|
- overflowY: 'auto',
|
|
|
|
|
- width: '70vh',
|
|
|
|
|
-};
|
|
|
|
|
|
|
+ if (!emojiBefore && !context.explicit) return null;
|
|
|
|
|
|
|
|
-type EmojiHintProps = {
|
|
|
|
|
- codeMirrorEditor: UseCodeMirrorEditor | undefined,
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-export const EmojiHint: FC<EmojiHintProps> = (props) => {
|
|
|
|
|
- const { codeMirrorEditor } = props;
|
|
|
|
|
-
|
|
|
|
|
- const { data: emojiHintModalData } = useEmojiHintModal();
|
|
|
|
|
-
|
|
|
|
|
- const { isOpened } = emojiHintModalData;
|
|
|
|
|
-
|
|
|
|
|
- const suggestedEmojiArray = useEmojiAutoCompletion('f');
|
|
|
|
|
-
|
|
|
|
|
- return (
|
|
|
|
|
- <>
|
|
|
|
|
- {
|
|
|
|
|
- isOpened
|
|
|
|
|
- ? (
|
|
|
|
|
- <div style={EmojiHintModalStyle} className="modal-content">
|
|
|
|
|
- {suggestedEmojiArray.map(emojiName => (
|
|
|
|
|
- <EmojiHintItem codeMirrorEditor={codeMirrorEditor} emojiName={emojiName} />
|
|
|
|
|
- ))}
|
|
|
|
|
- </div>
|
|
|
|
|
- ) : (
|
|
|
|
|
- ''
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- </>
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ from: emojiBefore ? nodeBefore.from + emojiBefore.index : context.pos,
|
|
|
|
|
+ options: emojiOptions,
|
|
|
|
|
+ validFor: /^(:\w)?$/,
|
|
|
|
|
+ };
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+// const EmojiHintModalStyle = {
|
|
|
|
|
+// maxHeight: '40vh',
|
|
|
|
|
+// overflowY: 'auto',
|
|
|
|
|
+// width: '70vh',
|
|
|
|
|
+// };
|
|
|
|
|
+
|
|
|
|
|
+// type EmojiHintProps = {
|
|
|
|
|
+// codeMirrorEditor: UseCodeMirrorEditor | undefined,
|
|
|
|
|
+// }
|
|
|
|
|
+
|
|
|
|
|
+// export const EmojiHint: FC<EmojiHintProps> = (props) => {
|
|
|
|
|
+// const { codeMirrorEditor } = props;
|
|
|
|
|
+
|
|
|
|
|
+// const { data: emojiHintModalData } = useEmojiHintModal();
|
|
|
|
|
+
|
|
|
|
|
+// const { isOpened } = emojiHintModalData;
|
|
|
|
|
+
|
|
|
|
|
+// const suggestedEmojiArray = useEmojiAutoCompletion('f');
|
|
|
|
|
+
|
|
|
|
|
+// return (
|
|
|
|
|
+// <>
|
|
|
|
|
+// {
|
|
|
|
|
+// isOpened
|
|
|
|
|
+// ? (
|
|
|
|
|
+// <div style={EmojiHintModalStyle} className="modal-content">
|
|
|
|
|
+// {suggestedEmojiArray.map(emojiName => (
|
|
|
|
|
+// <EmojiHintItem codeMirrorEditor={codeMirrorEditor} emojiName={emojiName} />
|
|
|
|
|
+// ))}
|
|
|
|
|
+// </div>
|
|
|
|
|
+// ) : (
|
|
|
|
|
+// ''
|
|
|
|
|
+// )
|
|
|
|
|
+// }
|
|
|
|
|
+// </>
|
|
|
|
|
+// );
|
|
|
|
|
+// };
|