Skip to content

Commit 660bdd5

Browse files
feat: Add Emoji Autocomplete functionality that displays matching emoji suggestions on : colon type (#1015)
* Add emoji autocomplete functionality that displays matching emoji suggestions when users type ':' followed by at least 2 characters, similar to existing mention and command autocomplete features * Theme refinement * Prettier formatting #1 * Prettier Formatting #2
1 parent 7734fd0 commit 660bdd5

6 files changed

Lines changed: 780 additions & 2 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { useCallback } from 'react';
2+
import emojiList from '../lib/emojiList';
3+
4+
const useSearchEmoji = (
5+
startReadEmoji,
6+
setStartReadEmoji,
7+
setFilteredEmojis,
8+
setEmojiIndex,
9+
setShowEmojiList
10+
) =>
11+
useCallback(
12+
(message) => {
13+
const lastChar = message ? message[message.length - 1] : '';
14+
15+
if (message.length === 0) {
16+
setShowEmojiList(false);
17+
setStartReadEmoji(false);
18+
setFilteredEmojis([]);
19+
setEmojiIndex(-1);
20+
return;
21+
}
22+
23+
// Check if user is typing emoji syntax (:emoji:)
24+
const emojiMatch = message.match(/:([a-zA-Z0-9_+-]*?)$/);
25+
26+
if (emojiMatch) {
27+
const query = emojiMatch[1].toLowerCase();
28+
29+
// Only show suggestions if query is at least 2 characters
30+
if (query.length >= 2) {
31+
setStartReadEmoji(true);
32+
33+
const filteredEmojis = emojiList
34+
.filter(
35+
(emoji) =>
36+
emoji.shortname.toLowerCase().includes(query) ||
37+
emoji.aliases.some((alias) =>
38+
alias.toLowerCase().includes(query)
39+
)
40+
)
41+
.slice(0, 10);
42+
43+
setFilteredEmojis(filteredEmojis);
44+
setEmojiIndex(filteredEmojis.length > 0 ? 0 : -1);
45+
setShowEmojiList(filteredEmojis.length > 0);
46+
} else {
47+
setShowEmojiList(false);
48+
setFilteredEmojis([]);
49+
setEmojiIndex(-1);
50+
}
51+
} else if (startReadEmoji) {
52+
setStartReadEmoji(false);
53+
setFilteredEmojis([]);
54+
setEmojiIndex(-1);
55+
setShowEmojiList(false);
56+
}
57+
},
58+
[
59+
startReadEmoji,
60+
setStartReadEmoji,
61+
setFilteredEmojis,
62+
setEmojiIndex,
63+
setShowEmojiList,
64+
]
65+
);
66+
67+
export default useSearchEmoji;

0 commit comments

Comments
 (0)