1import { gemoji } from "gemoji";
2
3import type { ComposerCommandItem } from "./ComposerCommandMenu";
4
5export function searchComposerEmoji(query: string): ComposerCommandItem[] {
6 const normalized = query.toLowerCase();
7 if (!normalized) return [];
8
9 return gemoji
10 .flatMap((entry) => {
11 const name =
12 entry.names.find((name) => name === normalized) ??
13 entry.names.find((name) => name.startsWith(normalized)) ??
14 entry.names.find((name) => name.includes(normalized));
15 const rank = name
16 ? name === normalized
17 ? 0
18 : name.startsWith(normalized)
19 ? 1
20 : 2
21 : entry.tags.some((tag) => tag.includes(normalized))
22 ? 3
23 : entry.description.toLowerCase().includes(normalized.replaceAll("_", " "))
24 ? 4
25 : null;
26 if (rank === null) return [];
27
28 return [{ entry, name: name ?? entry.names[0]!, rank }];
29 })
30 .toSorted((a, b) => a.rank - b.rank || a.name.localeCompare(b.name))
31 .slice(0, 30)
32 .map(({ entry, name }) => ({
33 id: `emoji:${entry.emoji}`,
34 type: "emoji",
35 emoji: entry.emoji,
36 query: normalized,
37 label: `:${name}:`,
38 description: entry.description,
39 }));
40}