frontend/app/components/notes/reactions/picker/emoji.ts

141 lines
3.1 KiB
TypeScript
Raw Normal View History

/**
* Adapted from Cinny's code
* @see https://github.com/cinnyapp/cinny/blob/e6f4eeca8edc85ab64179e545b4e2e8c15763633/src/app/plugins/emoji.ts
*/
import type { CompactEmoji } from "emojibase";
import emojisData from "emojibase-data/en/compact.json";
import joypixels from "emojibase-data/en/shortcodes/joypixels.json";
export type UnicodeEmoji = CompactEmoji & {
shortcode: string;
};
export enum EmojiGroupId {
People = "People",
Nature = "Nature",
Food = "Food",
Activity = "Activity",
Travel = "Travel",
Object = "Object",
Symbol = "Symbol",
Flag = "Flag",
}
export type UnicodeEmojiGroup = {
id: EmojiGroupId;
order: number;
emojis: UnicodeEmoji[];
};
export const getShortcodesFor = (
hexcode: string,
): string[] | string | undefined => joypixels[hexcode];
export const getShortcodeFor = (hexcode: string): string | undefined => {
const shortcode = joypixels[hexcode];
return Array.isArray(shortcode) ? shortcode[0] : shortcode;
};
export const emojiGroups: UnicodeEmojiGroup[] = [
{
id: EmojiGroupId.People,
order: 0,
emojis: [],
},
{
id: EmojiGroupId.Nature,
order: 1,
emojis: [],
},
{
id: EmojiGroupId.Food,
order: 2,
emojis: [],
},
{
id: EmojiGroupId.Activity,
order: 3,
emojis: [],
},
{
id: EmojiGroupId.Travel,
order: 4,
emojis: [],
},
{
id: EmojiGroupId.Object,
order: 5,
emojis: [],
},
{
id: EmojiGroupId.Symbol,
order: 6,
emojis: [],
},
{
id: EmojiGroupId.Flag,
order: 7,
emojis: [],
},
];
export const emojis: UnicodeEmoji[] = [];
function addEmojiToGroup(groupIndex: number, emoji: UnicodeEmoji) {
emojiGroups[groupIndex]?.emojis.push(emoji);
}
function getGroupIndex(emoji: UnicodeEmoji): number | undefined {
switch (emoji.group) {
case 0:
case 1:
return 0; // People
case 3:
return 1; // Nature
case 4:
return 2; // Food
case 6:
return 3; // Activity
case 5:
return 4; // Travel
case 7:
return 5; // Object
case 8:
case undefined:
return 6; // Symbol
case 9:
return 7; // Flag
default:
return undefined; // Unknown group
}
}
for (const emoji of emojisData) {
const myShortCodes = getShortcodesFor(emoji.hexcode);
if (!myShortCodes) {
continue;
}
if (Array.isArray(myShortCodes) && myShortCodes.length === 0) {
continue;
}
const em: UnicodeEmoji = {
...emoji,
shortcode: Array.isArray(myShortCodes)
? (myShortCodes[0] as string)
: myShortCodes,
shortcodes: Array.isArray(myShortCodes)
? myShortCodes
: emoji.shortcodes,
};
const groupIndex = getGroupIndex(em);
if (groupIndex !== undefined) {
addEmojiToGroup(groupIndex, em);
emojis.push(em);
}
}