7640f4d3f8
Could possibly be for future custom emoji sets that support custom skin tones? (i.e. Mutant Standard)
106 lines
2.7 KiB
TypeScript
106 lines
2.7 KiB
TypeScript
import data from "unicode-emoji-json/data-by-group.json";
|
|
import emojiComponents from "unicode-emoji-json/data-emoji-components.json";
|
|
import keywordSet from "emojilib";
|
|
import { defaultStore } from "@/store";
|
|
|
|
export type UnicodeEmojiDef = {
|
|
emoji: string;
|
|
category: typeof unicodeEmojiCategories[number];
|
|
skin_tone_support: boolean;
|
|
slug: string;
|
|
keywords?: string[];
|
|
};
|
|
|
|
export const unicodeEmojiCategories = [
|
|
"emotion",
|
|
"people",
|
|
"animals_and_nature",
|
|
"food_and_drink",
|
|
"activity",
|
|
"travel_and_places",
|
|
"objects",
|
|
"symbols",
|
|
"flags",
|
|
] as const;
|
|
|
|
export const categoryMapping = {
|
|
"Smileys & Emotion": "emotion",
|
|
"People & Body": "people",
|
|
"Animals & Nature": "animals_and_nature",
|
|
"Food & Drink": "food_and_drink",
|
|
"Activities": "activity",
|
|
"Travel & Places": "travel_and_places",
|
|
"Objects": "objects",
|
|
"Symbols": "symbols",
|
|
"Flags": "flags",
|
|
} as const;
|
|
|
|
export const unicodeEmojiSkinTones = [
|
|
"#FFDC5E",
|
|
"#F7DFCF",
|
|
"#F3D3A3",
|
|
"#D6AE89",
|
|
"#B17F56",
|
|
"#7D523C",
|
|
];
|
|
|
|
export function addSkinTone(emoji: string, skinTone?: number) {
|
|
const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone;
|
|
const skinToneModifiers = [
|
|
"",
|
|
emojiComponents.light_skin_tone,
|
|
emojiComponents.medium_light_skin_tone,
|
|
emojiComponents.medium_skin_tone,
|
|
emojiComponents.medium_dark_skin_tone,
|
|
emojiComponents.dark_skin_tone
|
|
];
|
|
return emoji + (skinToneModifiers[chosenSkinTone - 1] || "");
|
|
}
|
|
|
|
const unicodeFifteenEmojis = [
|
|
'🫨', '🩷', '🩵', '🩶',
|
|
'🫷', '🫸', '🫎', '🫏',
|
|
'🪽', '🐦⬛', '🪿', '🪼',
|
|
'🪻', '🫚', '🫛', '🪭',
|
|
'🪮', '🪇', '🪈', '🪯',
|
|
'🛜'
|
|
]
|
|
|
|
const newData = {};
|
|
|
|
Object.keys(data).forEach((originalCategory) => {
|
|
const newCategory = categoryMapping[originalCategory];
|
|
if (newCategory) {
|
|
newData[newCategory] = newData[newCategory] || [];
|
|
Object.keys(data[originalCategory]).forEach((emojiIndex) => {
|
|
const emojiObj = { ...data[originalCategory][emojiIndex] };
|
|
if (unicodeFifteenEmojis.includes(emojiObj.emoji)) {
|
|
return;
|
|
}
|
|
emojiObj.category = newCategory;
|
|
emojiObj.keywords = keywordSet[emojiObj.emoji];
|
|
newData[newCategory].push(emojiObj);
|
|
});
|
|
}
|
|
});
|
|
|
|
export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce((acc, category) => {
|
|
const categoryItems = newData[category].map((item) => {
|
|
return {
|
|
emoji: item.emoji,
|
|
slug: item.slug,
|
|
category: item.category,
|
|
skin_tone_support: item.skin_tone_support || false,
|
|
keywords: item.keywords || [],
|
|
};
|
|
});
|
|
return acc.concat(categoryItems);
|
|
}, []);
|
|
|
|
|
|
export function getNicelyLabeledCategory(internalName) {
|
|
return Object.keys(categoryMapping).find(
|
|
(key) => categoryMapping[key] === internalName
|
|
) || internalName;
|
|
}
|